सामान्यीकृत Malbolge to Malbolge अनुवादक


12

इस कार्य में, आप एक प्रोग्राम / फ़ंक्शन लिखेंगे जो एक सामान्यीकृत Malbolge प्रोग्राम लेता है और परिणामी Malbolge प्रोग्राम को आउटपुट करता है । (यह एक गुप्त उपकरण है जिसे सभी Malbolge प्रोग्रामर उपयोग कर रहे हैं!)

इनपुट

एक डेटा संरचना जो (किसी तरह) एक सामान्यीकृत Malbolge कार्यक्रम का प्रतिनिधित्व करती है।

उत्पादन

एक डेटा संरचना जो परिणामी Malbolge कार्यक्रम का प्रतिनिधित्व करती है।

उदाहरण

jpoo*pjoooop*ojoopoo*ojoooooppjoivvvo/i<ivivi<vvvvvvvvvvvvvoji
(=BA#9"=<;:3y7x54-21q/p-,+*)"!h%B0/.~P<<:(8&66#"!~}|{zyxwvugJ%

jjjj*<jjjj*<v
('&%#^"!~}{XE

jjjjjjjjjjjjjjjjjjjjjjj*<jjjjjjjjjjjjjjjjjjjjjjjj*<v
('&%$#"!~}|{zyxwvutsrqpnKmlkjihgfedcba`_^]\[ZYXWVT1|

कैसे कन्वर्ट करने के लिए

सामान्यीकृत Malbolge प्रोग्राम से अधिक, प्रत्येक वर्ण के लिए निम्न चरणों का पालन करें:

  1. स्ट्रिंग में वर्णों को उसी वर्ण के *jpovi</साथ बदलें '(>DQbcu। (वह है, मैप *टू ', jटू (, वगैरह।)

  2. फिर प्रोग्राम काउंटर की वर्तमान स्थिति (यानी वर्तमान एक से पहले वर्णों की संख्या) को वर्ण के ASCII कोड से घटाएं।

  3. यदि परिणामस्वरूप ASCII कोड 33 से कम है, तो इसे 94 से बढ़ाएँ और कम से कम 33 होने तक दोहराएं।

  4. परिणामी चरित्र को आउटपुट में जोड़ें।

नियम

  • यह एक प्रतियोगिता है; सबसे छोटा उत्तर जीतता है।
  • कोई मानक खामियों कृपया।
  • डिफ़ॉल्ट I / O विधियों की अनुमति है।
  • इनपुट में केवल वर्ण होंगे *jpovi</

4
क्या इनपुट में केवल " *jpovi</" अक्षर हैं ?
जोएल

7
मुझे समझ में नहीं आ रहा है "फिर, स्थिति शून्य से।" माध्यम। मैं शायद छद्मकोश से इसका पता लगा सकता था, लेकिन स्पष्टीकरण स्व-निहित होना चाहिए।
xnor

1
" जबकि अस्थायी मालबोज़ अभ्यावेदन 'ASCII कोड 33 से कम है, 94 से चार वृद्धि करें। " इससे आपका क्या मतलब है? मैंने चुनौती को कैसे समझा: 1) मानचित्र वर्ण; 2) यूनिकोड मूल्य में परिवर्तित; 3) प्रोग्राम काउंटर से प्रत्येक घटाएं (अब हमारे पास 'अस्थायी मालबोज़ अभ्यावेदन' ASCII कोड 'है); 4) यदि कोई मूल्य 33 से कम है, तो वेतन वृद्धि 94 से; 5) इन मानों को वापस वर्णों में बदलें। लेकिन इस दृष्टिकोण का उपयोग करते हुए आउटपुट स्पष्ट रूप से सही नहीं है .. तो क्या आप यह स्पष्ट कर सकते हैं कि 33 वर्णों से अधिक के इनपुट के लिए आपके द्वारा इसका क्या मतलब है?
केविन क्रूज़सेन

1
a: if ascii_code(temporary Malbolge representation) < 33: char := char + 94; goto a;

1
मैं ख़ुशी से किसी को भी एक इनाम दूंगा, जो इन चीज़ों में से एक को Malbolge में लिख सकता है :)
JDL

जवाबों:


4

जेली , 29 22 बाइट्स

Oị“%þV DCµ2®  ‘_JịØṖḊ¤

इसे ऑनलाइन आज़माएं!

अपने तर्क के रूप में एक जेली स्ट्रिंग ले जा रहा है और एक जेली स्ट्रिंग वापस लौटता है।

2 बाइट बचाने के लिए @JonathanAllan को धन्यवाद!

व्याख्या

O                      | Convert to Unicode code points
 ị“%þV DCµ2®  ‘        | Index into compressed integer list [37, 31, 86, 32, 68, 67, 9, 50, 8, 32, 32] (note the 32s are never actually used because the input mod 11 will be one of 1,2,3,5,6,7,8,9)
               _J      | Subtract position of character in original string
                 ị   ¤ | Index into the following as a nilad:
                  ØṖ   | - Printable ASCII characters
                    Ḋ  | - With the first character (space) removed

..._J‘ịØṖḊ¤एक बाइट बचाता है।
जोनाथन एलन

@JonathanAllan धन्यवाद, अच्छी कॉल!
निक केनेडी

2
ओह, और हम अपनी खोज के अंदर वृद्धि कर सकते हैं>। < एक और बाइट की बचत:Oị“%þV DCµ2® ‘_JịØṖḊ¤
जोनाथन एलन

6

पायथन 3 , 82 बाइट्स

p=0
for c in input():print(end=chr((b"de{#0ABT"["*jpovi<".find(c)]-p)%94+33));p+=1

इसे ऑनलाइन आज़माएं!

मुद्रण योग्य लोगों के साथ byestestring में बदसूरत unprintable वर्णों की जगह के लिए @Joel के लिए धन्यवाद।

मैं बदलने के लिए एक मॉड-चेन की तलाश कर रहा हूं "*jpovi<".find(c), लेकिन मुझे नहीं लगता कि कोई ऐसा है जो छोटा है, और एक गैर-थकाऊ जानवर-बल खोज को अब तक कुछ भी नहीं मिला है।

82 बाइट्स

f=lambda s,p=0:s and chr((b"de{#0ABT"["*jpovi<".find(s[0])]-p)%94+33)+f(s[1:],p+1)

इसे ऑनलाइन आज़माएं!


बेहतर पठनीयता के लिए प्रिंट किए जा सकने वाले एएससीआईआई अक्षरों को 94 तक ऑफसेट किया जा सकता है।
जोएल

b"de{#0ABT"["*jpovi<".find(c)]यदि आप उस के लिए एक कार्यक्रम है, तो आप मानचित्रण को बदलने के लिए एक गणित समारोह खोजने की कोशिश कर सकते हैं ।
जोएल

1
@ जोएल दुर्भाग्य से, मुझे लगता है कि मानचित्रण एक अंकगणितीय फ़ंक्शन के लिए खोज स्थान को बहुत कम चौड़ा करता है, कम से कम उन उपकरणों के साथ। मैं बस x%84%15%7मैपिंग के दाहिने आधे हिस्से के लिए मोडुलो चेन खोज रहा था , लेकिन मुझे लगता है कि मैं कुछ कोड रीसायकल कर सकता हूं जिन्हें मैंने एक अन्य चुनौती के लिए लिखा था जिसमें शब्द *और /शब्द भी शामिल हैं।
xnor

@ जोल मैं सही पक्ष का उपयोग करने के लिए कुछ भी मॉड-चेन-शैली नहीं पा रहा हूं %और *( //पायथन 3 में शायद इसके लायक नहीं है।) वास्तव में, कुछ भी पहले 7 मूल्यों में से 6 से मेल नहीं खाता है। मुझे आशा है कि यह काम करेगा क्योंकि एक मोटा एंट्रोपी अनुमान कहता है कि% 7` में समाप्त होने वाले संभवतया पर्याप्त अभिव्यक्ति हैं, लेकिन यह करीब है। और हो सकता है कि ये श्रृंखलाएं समान रूप से वितरित होने वाले आउटपुट देती हैं, खासकर जब से एक बार दो इनपुट एक ही मूल्य पर गिर जाते हैं, कोई और ऑपरेशन उन्हें अलग नहीं कर सकता है। जो सामान मैं कोशिश कर रहा हूं वह अभी भी बड़ी अभिव्यक्ति को खोजने के लिए बहुत गूंगा है, लेकिन अगर आपके पास कोई विचार है, तो इसके लिए जाएं।
xnor

मुझे लगता है कि मनमाने ढंग से इनपुट के लिए एक बेहतर एल्गोरिदम की आवश्यकता है map(ord, "*jpovi<")। यदि आउटपुट अधिकांश इनपुट्स (यानी f(m)>=f(n)यदि m>=n) के लिए ऑर्डर को संरक्षित नहीं करता है , तो कुछ सावधानीपूर्वक तैयार किए गए स्थिरांक के लिए %और *इसकी आवश्यकता है और एक क्रूर-बल खोज के सकारात्मक परिणाम प्राप्त करने की संभावना नहीं है।
जोएल

6

मालबॉल्ज़ अनशाक्लेड (20-ट्रिट रोटेशन वेरिएंट), 7,784e6 बाइट्स

इस उत्तर का आकार अधिकतम पोस्ट करने योग्य प्रोग्राम आकार (eh) से अधिक है, इसलिए कोड मेरे GitHub रिपॉजिटरी में स्थित है

इसे कैसे चलाया जाए?

यह एक मुश्किल हिस्सा हो सकता है, क्योंकि भोले हास्कल दुभाषिया इसे चलाने के लिए उम्र पर उम्र ले लेंगे। TIO में अच्छे Malbogle Unshackled दुभाषिया हैं, लेकिन दुख की बात है कि मैं इसका (सीमाएं) उपयोग नहीं कर पाऊंगा।

सबसे अच्छा एक जो मैं पा सकता था, वह है 20-ट्रिट रोटेशन चौड़ाई वाला वैरिएंट, जो बहुत अच्छा प्रदर्शन करता है, प्रति सेकंड 0,5 वर्णों को परिवर्तित करता है ।

दुभाषिया को थोड़ा तेज करने के लिए, मैंने माथियास लुटर के मालब्लोज अनकशल्ड इंटरप्रेटर से सभी चेक हटा दिए हैं।

मेरा संशोधित संस्करण लगभग 6,3% तेजी से चल सकता है।

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char* translation = "5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+Q;>U!pJS72Fh"
        "OA1CB6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G\"i@";

typedef struct Word {
    unsigned int area;
    unsigned int high;
    unsigned int low;
} Word;

void word2string(Word w, char* s, int min_length) {
    if (!s) return;
    if (min_length < 1) min_length = 1;
    if (min_length > 20) min_length = 20;
    s[0] = (w.area%3) + '0';
    s[1] = 't';
    char tmp[20];
    int i;
    for (i=0;i<10;i++) {
        tmp[19-i] = (w.low % 3) + '0';
        w.low /= 3;
    }
    for (i=0;i<10;i++) {
        tmp[9-i] = (w.high % 3) + '0';
        w.high /= 3;
    }
    i = 0;
    while (tmp[i] == s[0] && i < 20 - min_length) i++;
    int j = 2;
    while (i < 20) {
        s[j] = tmp[i];
        i++;
        j++;
    }
    s[j] = 0;
}

unsigned int crazy_low(unsigned int a, unsigned int d){
    unsigned int crz[] = {1,0,0,1,0,2,2,2,1};
    int position = 0;
    unsigned int output = 0;
    while (position < 10){
        unsigned int i = a%3;
        unsigned int j = d%3;
        unsigned int out = crz[i+3*j];
        unsigned int multiple = 1;
        int k;
        for (k=0;k<position;k++)
            multiple *= 3;
        output += multiple*out;
        a /= 3;
        d /= 3;
        position++;
    }
    return output;
}

Word zero() {
    Word result = {0, 0, 0};
    return result;
}

Word increment(Word d) {
    d.low++;
    if (d.low >= 59049) {
        d.low = 0;
        d.high++;
        if (d.high >= 59049) {
            fprintf(stderr,"error: overflow\n");
            exit(1);
        }
    }
    return d;
}

Word decrement(Word d) {
    if (d.low == 0) {
        d.low = 59048;
        d.high--;
    }else{
        d.low--;
    }
    return d;
}

Word crazy(Word a, Word d){
    Word output;
    unsigned int crz[] = {1,0,0,1,0,2,2,2,1};
    output.area = crz[a.area+3*d.area];
    output.high = crazy_low(a.high, d.high);
    output.low = crazy_low(a.low, d.low);
    return output;
}

Word rotate_r(Word d){
    unsigned int carry_h = d.high%3;
    unsigned int carry_l = d.low%3;
    d.high = 19683 * carry_l + d.high / 3;
    d.low = 19683 * carry_h + d.low / 3;
    return d;
}

// last_initialized: if set, use to fill newly generated memory with preinitial values...
Word* ptr_to(Word** mem[], Word d, unsigned int last_initialized) {
    if ((mem[d.area])[d.high]) {
        return &(((mem[d.area])[d.high])[d.low]);
    }
    (mem[d.area])[d.high] = (Word*)malloc(59049 * sizeof(Word));
    if (!(mem[d.area])[d.high]) {
        fprintf(stderr,"error: out of memory.\n");
        exit(1);
    }
    if (last_initialized) {
        Word repitition[6];
        repitition[(last_initialized-1) % 6] =
                ((mem[0])[(last_initialized-1) / 59049])
                    [(last_initialized-1) % 59049];
        repitition[(last_initialized) % 6] =
                ((mem[0])[last_initialized / 59049])
                    [last_initialized % 59049];
        unsigned int i;
        for (i=0;i<6;i++) {
            repitition[(last_initialized+1+i) % 6] =
                    crazy(repitition[(last_initialized+i) % 6],
                        repitition[(last_initialized-1+i) % 6]);
        }
        unsigned int offset = (59049*d.high) % 6;
        i = 0;
        while (1){
            ((mem[d.area])[d.high])[i] = repitition[(i+offset)%6];
            if (i == 59048) {
                break;
            }
            i++;
        }
    }
    return &(((mem[d.area])[d.high])[d.low]);
}

unsigned int get_instruction(Word** mem[], Word c,
        unsigned int last_initialized,
        int ignore_invalid) {
    Word* instr = ptr_to(mem, c, last_initialized);
    unsigned int instruction = instr->low;
    instruction = (instruction+c.low + 59049 * c.high
            + (c.area==1?52:(c.area==2?10:0)))%94;
    return instruction;
}

int main(int argc, char* argv[]) {
    Word** memory[3];
    int i,j;
    for (i=0; i<3; i++) {
        memory[i] = (Word**)malloc(59049 * sizeof(Word*));
        if (!memory) {
            fprintf(stderr,"not enough memory.\n");
            return 1;
        }
        for (j=0; j<59049; j++) {
            (memory[i])[j] = 0;
        }
    }
    Word a, c, d;
    unsigned int result;
    FILE* file;
    if (argc < 2) {
        // read program code from STDIN
        file = stdin;
    }else{
        file = fopen(argv[1],"rb");
    }
    if (file == NULL) {
        fprintf(stderr, "File not found: %s\n",argv[1]);
        return 1;
    }
    a = zero();
    c = zero();
    d = zero();
    result = 0;
    while (!feof(file)){
        unsigned int instr;
        Word* cell = ptr_to(memory, d, 0);
        (*cell) = zero();
        result = fread(&cell->low,1,1,file);
        if (result > 1)
            return 1;
        if (result == 0 || cell->low == 0x1a || cell->low == 0x04)
            break;
        instr = (cell->low + d.low + 59049*d.high)%94;
        if (cell->low == ' ' || cell->low == '\t' || cell->low == '\r'
                || cell->low == '\n');
        else if (cell->low >= 33 && cell->low < 127 &&
                (instr == 4 || instr == 5 || instr == 23 || instr == 39
                    || instr == 40 || instr == 62 || instr == 68
                    || instr == 81)) {
            d = increment(d);
        }
    }
    if (file != stdin) {
        fclose(file);
    }
    unsigned int last_initialized = 0;
    while (1){
        *ptr_to(memory, d, 0) = crazy(*ptr_to(memory, decrement(d), 0),
                *ptr_to(memory, decrement(decrement(d)), 0));
        last_initialized = d.low + 59049*d.high;
        if (d.low == 59048) {
            break;
        }
        d = increment(d);
    }
    d = zero();

    unsigned int step = 0;
    while (1) {
        unsigned int instruction = get_instruction(memory, c,
                last_initialized, 0);
        step++;
        switch (instruction){
            case 4:
                c = *ptr_to(memory,d,last_initialized);
                break;
            case 5:
                if (!a.area) {
                    printf("%c",(char)(a.low + 59049*a.high));
                }else if (a.area == 2 && a.low == 59047
                        && a.high == 59048) {
                    printf("\n");
                }
                break;
            case 23:
                a = zero();
                a.low = getchar();
                if (a.low == EOF) {
                    a.low = 59048;
                    a.high = 59048;
                    a.area = 2;
                }else if (a.low == '\n'){
                    a.low = 59047;
                    a.high = 59048;
                    a.area = 2;
                }
                break;
            case 39:
                a = (*ptr_to(memory,d,last_initialized)
                        = rotate_r(*ptr_to(memory,d,last_initialized)));
                break;
            case 40:
                d = *ptr_to(memory,d,last_initialized);
                break;
            case 62:
                a = (*ptr_to(memory,d,last_initialized)
                        = crazy(a, *ptr_to(memory,d,last_initialized)));
                break;
            case 81:
                return 0;
            case 68:
            default:
                break;
        }

        Word* mem_c = ptr_to(memory, c, last_initialized);
        mem_c->low = translation[mem_c->low - 33];

        c = increment(c);
        d = increment(d);
    }
    return 0;
}

यह काम कर रहा है!

यह काम कर रहा है


2
यह सिर्फ पागल है।
मिल्कीवेय 90

राहगीरों के लिए, बाइट की संख्या 7.784MB है, न कि 7.784GB। मैंने कॉमा की व्याख्या पहले के दशमलव बिंदु के बजाय हजारों को समूहीकृत करने के रूप में की।
आलू ४४

@ Potato44 हम पोलैंड में दशमलव विभाजक के रूप में अल्पविराम का उपयोग करते हैं, जैसे कि निषिद्ध है।
Krzysztof Szewczyk

5

पायथन 3 , 84 83 बाइट्स

f=lambda p,i=0:p and chr(126-(i+b"WV@:-zyg"["*jpovi<".find(p[0])])%94)+f(p[1:],i+1)

इसे ऑनलाइन आज़माएं!

यह गणना को सरल बनाने के बारे में ज्यादातर एक गणित की समस्या है, साथ ही गणित होने के बाद कुछ गोल्फिंग। कोड का ungolfed संस्करण नीचे दिखाया गया है।

अनगुल्ड, गैर-पुनरावर्ती संस्करण

def convert(prog):
    offsets = dict(zip("*jpovi</", [87, 86, 64, 58, 45, 122, 121, 103]))  # ASCII encoded to "WV@:-zyg"
    output = ""
    for pos, c in enumerate(prog):
        output += chr(126-(offsets[c]+pos)%94)
    return output

इसे ऑनलाइन आज़माएं!




3

05AB1E , 32 31 23 22 बाइट्स

žQ¦•4¡ˆ¶ü]₁η₃•₃вIÇèā-è

-8 बाइट्स NickKennedy के जेली उत्तर का एक बंदरगाह बना रहे हैं, इसलिए उसे उभारना सुनिश्चित करें !!
-1 बाइट @ ग्रीम को धन्यवाद।

वर्णों की सूची के रूप में आउटपुट।

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

स्पष्टीकरण:

   4¡ˆ¶ü]₁η₃•          # Push compressed integer 82767635194143615015
              ₃в        # Converted to base-95 as list: [1,36,30,85,0,67,66,8,49,7,0]
                IÇ      # Push the input and convert each character to its unicode value
                  è     # Index each into the list we created
                   ā    # Push an integer list in the range [0, length] 
                        # (without popping the list itself)
                    -   # Subtract it from the previous list
žQ                      # Push builtin with all printable ASCII characters,
  ¦                     # and remove the leading space
                     è  # Index the values of the list into the ASCII characters
                        # (after which the result is output implicitly)

मेरा यह 05AB1E टिप देखें (अनुभाग कितना बड़ा पूर्णांक संपीड़ित करने के लिए? और संपीड़ित पूर्णांक सूचियों कैसे? ) को समझने के लिए क्यों •4¡ˆ¶ü]₁η₃•है 82767635194143615015और •4¡ˆ¶ü]₁η₃•₃вहै [1,36,30,85,0,67,66,8,49,7,0]


•1ÃQWý₂Ýδ9•86в->•4¡ˆ¶ü]₁η₃•₃в
ग्रैमी

@ ग्रेट थैंक्स :)
केविन क्रूज़सेन

2

पर्ल 5 ( -p), 53 , 51 बाइट्स

2 बाइट्स को सहेजना, de{#0ABTइसके बजाय का उपयोग करना '(>DQbcuताकि 61अब ज़रूरत न हो

y;*jpovi</;de{#0ABT;;s/./chr 33+(-"@-"+ord$&)%94/ge

TIO

पहला जवाब था

y;*jpovi</;'(>DQbcu;;s/./chr 33+(61-"@-"+ord$&)%94/ge

TIO


2

जाप , 24 23 बाइट्स

पोर्ट ऑफ निक के जेली समाधान

;£EÅgYn" #T BA0 "cXc

कोशिश करो

;£EÅgYn"..."cXc     :Implicit input of string
 £                  :Map each character X at 0-based index Y
; E                 :ASCII
   Å                :Slice of the first character (space)
    g               :Get character at index
     Y              :  Increment Y
      n             :  Subtract from
       "..."        :    Literal string (Codepoints: 32,35,29,84,32,66,65,7,48,6,32)
            c       :    Codepoint at index
             Xc     :      Codepoint of X

1

रेटिना 0.8.2 , 50 बाइट्स

T`*j\p\ovi</`'(>DQbcu
.
$.`$* $&¶
+T`!p`~_p` .¶
¶

इसे ऑनलाइन आज़माएं!लिंक में परीक्षण के मामले शामिल हैं। स्पष्टीकरण:

T`*j\p\ovi</`'(>DQbcu

प्रश्न में बताए अनुसार लिप्यंतरण करें। p(नीचे वर्णित) और करने के oलिए विशेष अर्थ हैT ransliterate का इसलिए उन्हें उद्धृत करने की आवश्यकता है।

.
$.`$* $&¶

प्रत्येक वर्ण को अपनी रेखा पर सूचीबद्ध करें, इसके सूचकांक के अनुसार कई रिक्त स्थान से पहले अर्थात प्रोग्राम काउंटर क्या होगा।

+T`!p`~_p` .¶

प्रत्येक पंक्ति पर अंतिम वर्ण को बार-बार चक्रवात से हटाते हैं, प्रत्येक स्थान पर पूर्ववर्ती स्थान को हटाते हुए, जब तक कि सभी स्थान हटा नहीं दिए जाते। pप्रिंट करने योग्य ASCII के लिए इसका मतलब है -~, हालाँकि हम चाहते हैं कि !मैप ~पहले हो, ताकि पहले अनुवाद हो, और फिर _मैच में जगह का कारण बने को डिलीट कर दे, जबकि बाकी कैरेक्टर्स को एक बार में एक कैरेक्टर कोड ट्रांसलेट किया जाए।

सभी वर्णों को एक साथ जोड़ दें।


1

चारकोल , 23 बाइट्स

⭆S§Φγμ⁻℅§ #{T BAe0d ℅ικ

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। पोर्ट ऑफ @ अरनौलड के जावास्क्रिप्ट उत्तर। स्पष्टीकरण:

 S                      Input string
⭆                       Map over characters and join
                     ι  Current character
                    ℅   ASCII code
        §               Cyclically indexed into
          #{T BAe0d     Literal string ` #{T BAe0d `
       ℅                ASCII code
      ⁻                 Subtract
                      κ Current index
  §                     Cyclically indexed into
    γ                   Printable ASCII
   Φ                    Filtered on
     μ                  Inner index (i.e. skip initial space)
                        Implicitly print


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.