ब्रेनफ्लो दुभाषिया!


11

BrainFlow

ब्रेनफ्लो क्या है?

BrainFlow जोड़ा कार्यक्षमता और भ्रम के लिए 3 अतिरिक्त आदेशों के साथ BrainF ** k (BFk) का विस्तार है।

क्या आज्ञा?

सामान्य BFk कमांड के अलावा , हमारे पास भी है:

^ सेल में कूदता है # सेल में मूल्य के आधार पर। Ex: यदि हम 4 के मान के साथ सेल # 0 पर हैं, तो ^ हमें सेल # 4 पर ले जाएगा।

= सेल के मूल्य को सेल के इंडेक्स पर सेट करता है। Ex: यदि हम 0 के मान के साथ सेल # 4 पर हैं, तो = हमारे मान को 4 पर सेट करेगा।

& हमारे वर्तमान सेल में मूल्य के आधार पर सेल के मूल्य के बराबर वर्तमान सेल पर मान सेट करेगा। (यह एक कठिन शब्द है, इसलिए यहां एक उदाहरण है!) Ex: हम सेल # 33 पर हैं और इस सेल में हमारा वर्तमान मूल्य 7 है, और सेल # 33 में हमारे वर्तमान मूल्य को सेल # 7 में जो भी मान है, सेट कर देगा।

वैकल्पिक चुनौतियां

निम्नलिखित में से किसी को पूरा करने से निर्दिष्ट बाइट आपके बाइट काउंट पर लागू होगी।

Interpreter written in BrainFlow (नमूना से व्याख्या की जा सकती है और कम से कम एक सार्थक होता है ^ = या &): स्कोर / 3

Interpreter written in BrainF**k: स्कोर / २

Doesn't contain any English letters (in either upper or lower case): स्कोर - २०

Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself: स्कोर - ५०

उदाहरण

एक उदाहरण जावा दुभाषिया:

import java.util.Scanner;

public class Interpreter {

    private String exp;

    private int[] values = new int[256];
    private int index = 0;

    private Scanner in;

    public Interpreter(String exp, Scanner in){
        this.exp = exp;
        this.in = in;
    }

    public void run(){
        //Reset index and values
        for(int i = 0; i < values.length; i++){
            values[i] = 0;
        }
        this.index = 0;

        System.out.println("Starting...");
        this.process(this.exp, false);
        System.out.println("\nDone.");
    }

    private void process(String str, boolean loop){
        boolean running = loop;
        do{
            for(int i = 0; i < str.length(); i++){
                switch(str.charAt(i)){
                case '>':increaseIndex();break;
                case '<':decreaseIndex();break;
                case '+':increaseValue();break;
                case '-':decreaseValue();break;
                case '[':
                    String s = str.substring(i);
                    int j = this.getClosingIndex(s);
                    if(this.values[this.index] == 0){
                        i +=j;
                        break;
                    }
                    process(s.substring(1, j), true);
                    i += j;
                    break;
                case '.':
                    int v = this.values[this.index];
                    System.out.print((char)v);
                    break;
                case ',':this.values[this.index] =  this.in.next().charAt(0);break;
                case '^':this.index = this.values[this.index];break;// Jumps to the index specified in the current cell.
                case '=':this.values[index] = this.index;break;// Sets the value at cell #x to x
                case '&':this.values[index] = this.values[this.values[index]];break;// If cell contains X, makes value of current cell equal to value in cell X
                default:
                    //Ignore others
                    break;
                }
            }
            if(this.values[this.index] == 0){
                running = false;
            }
        }while(running);
    }

    private void increaseIndex(){
        if(++this.index >= this.values.length){
            this.index = 0;
        }
    }

    private void decreaseIndex(){
        if(--this.index < 0){
            this.index = this.values.length - 1;
        }
    }

    private void increaseValue(){
        int newVal = this.values[this.index] + 1;
        if(newVal >= this.values.length){
            newVal = 0;
        }
        this.values[this.index] =  newVal;
    }

    private void decreaseValue(){
        int newVal = this.values[this.index] - 1;
        if(newVal < 0){
            newVal = this.values.length - 1;
        }
        this.values[this.index] =  newVal;
    }

    private int getClosingIndex(String str){
        int openings = 0;
        int closings = 0;
        for(int i = 0; i < str.length(); i++){
            char c = str.charAt(i);
            if(c == '['){
                openings++;
            }else if(c == ']'){
                closings++;
            }
            if(openings == closings){
                return i;
            }
        }
        return -1;
    }
}

गोल्फ के करीब भी नहीं लेकिन एक अच्छी शुरुआत प्रदान करनी चाहिए।

सबसे कम अंतिम स्कोर जीतता है, जहां लागू चैलेंज में कटौती को ध्यान में रखने के बाद स्कोर आपके कार्यक्रम में बाइट्स की संख्या है।

परिक्षण

निम्नलिखित ब्रेनफ्लो कार्यक्रम को स्टडिन से '+' वर्ण पढ़ने के बाद निर्दिष्ट आउटपुट प्रिंट करना चाहिए:

<<,++++[>++++[>++++<-]<-] Set cell #0 to a value dependent on input
>>>+[[-]&>=]+& Set every other cell to that value
[ Start loop
+^ Add one to current value and jump to that cell index
. Print the value at that cell
& Copy value from specified cell
] End loop

आउटपुट:

ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ

ध्यान दें कि & आपको आवश्यक रूप से निचली कोशिकाओं में चर बनाने की अनुमति देता है और बाद में उन्हें संदर्भित करता है। उदाहरण के लिए अगर मैं अपनी उम्र को 2 सेल में रखता हूं और जिस महीने मैं 3 वें सेल में पैदा हुआ था, और मैं वर्तमान में 64 वें सेल में हूं, मैं ++&अपनी उम्र +++&को पुनः प्राप्त करने के लिए या उस महीने को पुनः प्राप्त करने के लिए कर सकता हूं जिसका मैं जन्म हुआ था (मान लिया गया) निश्चित रूप से 64 वीं सेल 0 के डिफ़ॉल्ट मूल्य पर है)
spocot

2
मुझे लगता है कि आपका मतलब 'सुपरसेट' है, न कि सबसेट।
atı 19uʎs

@ .ı .uʎs से बदल दिया subsetगया extension। प्रतिक्रिया के लिए धन्यवाद।
spocot

ब्रेनफ्लो में लिखे जाने के लिए स्कोर एक बुरा विचार है - ब्रेनफक ब्रेनफ्लो का सबसेट है, इसलिए किसी भी ब्रेनफक प्रोग्राम एक ब्रेनफ्लो प्रोग्राम है। यह कहना पसंद है कि एक सी + + प्रोग्राम एक सी प्रोग्राम की तुलना में बेहतर स्कोर करेगा। ठीक है, मेरा सी प्रोग्राम एक C ++ प्रोग्राम है, सू ....
pseudonym117

1
ब्रेनफॉक में कार्यान्वयन क्यों लिखा जा रहा है, ब्रेनफ्लो में एक लिखने की तुलना में एक छोटा लाभ है? ऐसा लगता है कि पूर्व अधिक चुनौतीपूर्ण होगा, क्योंकि यह एक छोटी भाषा है।
पीटर ओल्सन

जवाबों:


7

पर्ल - 233 230 210 182 180 176 174 171 बाइट्स

$/=$,;%d=qw(> $p++ < $p-- + $v[$p]++ - $v[$p]-- , $v[$p]=ord+getc . print+chr+$v[$p] [ while+$v[$p]{ ] } ^ $p=$v[$p] = $v[$p]=$p & $v[$p]=$v[$v[$p]]);eval$d{$_}for<>=~/./g

बस मेरा एक मौजूदा ब्रेनफैक दुभाषिया ले लिया, इसे गोल्फ दिया, और ब्रेनफ्लो कार्यों को जोड़ा।

अद्यतन: पूरी तरह से 28 बाइट्स खोने के लिए कार्यक्रम का पुनर्गठन किया।


ध्यान दें कि यदि आपको 300 "+" का तार खिलाया जाए, तो आप अमान्य मानों के साथ समाप्त हो जाएंगे। आपको उन मानों को सेट करते समय / उसके बाद एक% 256 पवित्रता की जाँच करने की आवश्यकता है।
user0721090601 4

मुझे लगता है कि यह छोरों ( []) के साथ काम नहीं करता है । आप उसके लिए चरित्र द्वारा चरित्र का विकास नहीं कर सकते।
नटकी

कोष्ठक को कोष्ठक में कैसे अनुवादित किया जाता है?
Nutki

6

आइये यह पार्टी शुरू करते हैं।

C - 408 384 393 390 380 357 352 बाइट्स (अभी भी दूर चिपटना)

gccएक POSIX अनुरूप प्रणाली पर संकलन । पहला तर्क एक फ़ाइल का नाम है जिसमें ब्रेनफ़्लो कोड की व्याख्या की जानी है। पठनीयता में सुधार करने के लिए नई कड़ियाँ जोड़ी गईं।

i,p,b[9999],*k=b;unsigned char g[9999],a[30000],*d=a;main(c,v)char**v;
{read(open(v[1],0),g,9999);while(c=g[i++]){c-62||d++;c-60||d--;c-43||
(*d)++;c-45||(*d)--;c-46||putchar(*d);c==44?*d=getchar():0;c==94?d=a+*d:0;
c==61?*d=d-a:0;c==38?*d=a[*d]:0;c==93?i=*(--k):0;if(c==91)if(*d)*k++=i-1;else 
while(c=g[i++]){c==91?p++:0;if(c==93)if(p)p--;else break;}}}

और अगर आप रुचि रखते हैं तो अनप्लग्ड संस्करण। मुझे पता है अगर आप किसी भी कीड़े देखते हैं।

int i, depth, buffer[9999], *stack = buffer;
unsigned char c, program[9999], array[30000], *data = array;

main(int argc, char **argv)
{
    read(open(argv[1], 0), program, 9999);

    while(c = program[i++]){
        if (c=='>') data++;
        if (c=='<') data--;
        if (c=='+') (*data)++;
        if (c=='-') (*data)--;
        if (c=='.') putchar(*data);
        if (c==',') *data=getchar();
        if (c=='^') data=array+*data;
        if (c=='=') *data=data-array;
        if (c=='&') *data=array[*data];
        if (c==']') i=*(--stack);
        if (c=='[')
            if (*data) *stack++=i-1;
            else while (c=program[i++]) {
                    if (c=='[') depth++;
                    if (c==']') if (depth) depth--; else break;
            }
    }
}

अपडेट:

  • प्रारंभिक प्रतिक्रिया के लिए धन्यवाद जिसने मुझे एक अतिरिक्त 24 बाइट्स को बंद करने की अनुमति दी।

  • बग पर हस्ताक्षर करें। एक और 9 बाइट्स जोड़े।

  • Es1024 के सुझावों के अनुसार एक और 3 बाइट्स को बचाया।

  • Es1024 से अधिक सुझावों के प्रति एक और 10 बाइट्स बचाता है।

  • बस याद है कि वैश्विक चर 0. शुरू और पढ़ने और खोलने के लिए fopen से बंद कर दिया जाता है। 23 बाइट्स बचाए।

  • प्रोग्राम पर शून्य टर्मिनेटर सेट करने की आवश्यकता नहीं है क्योंकि बफर पहले से ही शून्य से शुरू होता है। बची हुई 5 बाइट।

2
मुझे लगता है कि अगर () और; के साथ प्रतिस्थापित किया जा सकता है ?: और कुछ पात्रों को बचाने के लिए।
जेरी यिर्मयाह

2
पात्रों को बचाने के लिए चरित्र शाब्दिकों को उनके ASCII समकक्षों के साथ बदला जा सकता है।
छद्म नाम 117

1
@ इसके अलावा यह इनपुट वर्णों को सही ढंग से संसाधित नहीं करता है। इसे उन्हें अस्की प्रतिनिधित्व में परिवर्तित करना चाहिए और उन्हें संग्रहीत करना चाहिए। इसके अलावा यह काम करता है।
16

1
आप दो बाइट्स के main(int c,char**v){साथ बदल सकते हैं main(c,v)char**v;{और बचा सकते हैं , साथ ही int i=0,p=0,b[9999],*k=b;फ़ंक्शन के बाहर भी जा सकते हैं, और int चार बाइट्स को बचाने के लिए ड्रॉप कर सकते हैं । if (c==91)एक अनावश्यक स्थान भी है।
es1024

1
तुम भी सबसे की जगह ले सकते हैं अगर सभी के c==[number]?[action]:0;साथ नहीं c-[number]||[action]। ( c-[number]के बराबर है c != [number]और if(p)p--;साथp&&p--;
es1024

6

AppleScript 972 670

ज्यादातर गोल्फ है, हालांकि कोई रास्ता नहीं है यह कभी भी जीत जाएगा। मुझे नहीं पता कि मैंने सिर्फ एक स्क्रिप्ट का निर्माण करने के बारे में क्यों नहीं सोचा, जैसे कि पर्ल ने किया था (हालांकि यह अभी भी हाहा नहीं जीतेगा)। यह संभवत: यह पढ़कर अधिक गढ़ा जा सकता है कि कैसे सूचकांक थोड़ा बेहतर होता है, AppleScript निराशा होती है (इस प्रकार के सामान के लिए) 1 इंडेक्स भाषा।

बस ब्रेनफ्लो कोड को ई में पास करें ()। ध्यान दें कि AppleScript के ASCII कमांड MacOSRoman एन्कोडिंग का उपयोग करते हैं, इसलिए जब आउटपुट अलग-अलग दिखाई देगा, तो यह अपने बाइनरी प्रतिनिधित्व को देखते हुए सही है। आपको किसी भी ऊपरी ASCII वर्ण में गुजरते समय इसे ध्यान में रखना होगा, हालांकि "," कमांड।

on e(x)
set d to {"", "set b'sitem(i+1)to(b'sitem(i+1)+1)mod 256", "set b'sitem(i+1)to(b'sitem(i+1)+255)mod 256", "set i to(i+1)mod 256", "set i to(i+255)mod 256", "repeat while b'sitem(i+1)≠0", "end", "set o to o&(ASCII character b'sitem(i+1))", "display dialog \"\"default answer\"\"
set b'sitem(i+1)to ASCII number result'stext returned'stext1", "set i to b'sitem(i+1)", "set b'sitem(i+1)to i", "set b'sitem(i+1)to b'sitem(b'sitem(i+1)+1)"}
set s to "set i to 0
set b to{}
repeat 256
set b'send to 0
end
set o to  \"\"
"  
repeat with c in x'stext
set s to s&d'sitem((offset of c in "+-><[].,^=&")+1)&"
"
end
set s to s&"return o"
return run script s
end

(क्योंकि आपके मस्तिष्क के साथ f *** s क्या है जो किसी अन्य भाषा में एक ब्रेनफक / फ्लो दुभाषिया लिखने से अधिक है कि आपके सिर के रास्ते में f *** s बहुत ज्यादा है?

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