ব্রেনফ্লো ইন্টারপ্রেটার!


11

BrainFlow

ব্রেনফ্লো কি?

ব্রেইনফ্লো যোগ করা কার্যকারিতা এবং বিভ্রান্তির জন্য 3 অতিরিক্ত কমান্ড সহ ব্রেইনএফ ** কে (বিএফকে) এর একটি এক্সটেনশন।

কি আদেশ?

সাধারণ বিএফকে কমান্ডের পাশাপাশি আমাদের রয়েছে:

^ কক্ষে মান উপর নির্ভর করে সেল # টি জাম্প। উদাহরণস্বরূপ: আমরা যদি 4 টির মান সহ # 0 কক্ষে থাকি তবে ^ আমাদের সেল # 4 এ উঠাবে।

= কক্ষের সূচককে ঘরের মান নির্ধারণ করে। উদাহরণস্বরূপ: যদি আমরা 0 এর মান সহ # 4 কক্ষে থাকি, = আমাদের মানকে 4 এ সেট করে।

& বর্তমান কক্ষের মানের উপর ভিত্তি করে বর্তমান কক্ষে মানটির সাথে সেলটি মান সমান করে দেবে। (এটির কথায় কথায় বলা শক্ত, সুতরাং এখানে একটি উদাহরণ রয়েছে!) প্রাক্তন: আমরা সেল # 33 এ রয়েছি এবং এই কক্ষে আমাদের বর্তমান মান 7, এবং আমাদের বর্তমান মান # 33 কোষে সেট করবে যা সেল # 7 এর মান হিসাবে আছে to

Ptionচ্ছিক চ্যালেঞ্জ

নিম্নলিখিতগুলির কোনওটি পূরণ করা আপনার বাইট গণনায় নির্দিষ্ট বোনাস প্রয়োগ করবে।

Interpreter written in BrainFlow (নমুনা দ্বারা ব্যাখ্যা করা যেতে পারে এবং কমপক্ষে একটি অর্থবহ contains = বা & থাকতে পারে): স্কোর / 3

Interpreter written in BrainF**k: স্কোর / 2

Doesn't contain any English letters (in either upper or lower case): স্কোর - 20

Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself: স্কোর - 50

উদাহরণ

জাভা দোভাষী একটি উদাহরণ:

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

আউটপুট:

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

মনে রাখবেন যে & আপনাকে নীচের কোষগুলিতে মূলত ভেরিয়েবলগুলি তৈরি করতে দেয় তারপরে সেগুলি পরে উল্লেখ করুন। উদাহরণস্বরূপ, যদি আমি আমার বয়স ২ য় সেলে সঞ্চয় করি এবং আমি যে মাসে তৃতীয় কোষে জন্মগ্রহণ করি এবং আমি বর্তমানে 64৪ তম সেলে থাকি, আমি ++&আমার বয়স পুনরুদ্ধার করতে বা আমার +++&জন্মের মাসটি পুনরুদ্ধার করতে পারি Ass অবশ্যই
th৪

2
আমি মনে করি আপনার অর্থ 'সুপারসেট', উপসেট নয়।
ɐɔıʇǝɥʇuʎs

@ .uʎs থেকে পরিবর্তিত subsetহয়েছে extension। সাহায্য করার জন্য ধন্যবাদ.
স্পোকট

ব্রেনফ্লোতে লেখার জন্য স্কোর একটি খারাপ ধারণা - ব্রেইনফাক ব্রেইনফ্লো একটি উপসেট, সুতরাং যে কোনও ব্রেইনফাক প্রোগ্রাম ব্রেনফ্লো প্রোগ্রাম। এটি সি -+ প্রোগ্রাম বলার মতো একটি সি প্রোগ্রামের চেয়ে আরও ভাল স্কোর করবে। ঠিক আছে, আমার সি প্রোগ্রামটি একটি সি ++ প্রোগ্রাম, তাই ....
ছদ্মনাম

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

আমি মনে করি এটি লুপগুলি ( []) দিয়ে কাজ করে না । আপনি তার জন্য চরিত্র অনুসারে অক্ষর প্রকাশ করতে পারবেন না।
নটকি

প্লাসগুলি কীভাবে প্রথম বন্ধনে অনুবাদ করা যায়?
নটকি

6

এই পার্টি শুরু করা যাক.

সি - 408 384 393 390 380 357 352 বাইট (এখনও চিপিং দূরে)

gccএকটি পসিক্স অনুবর্তী সিস্টেমের সাথে সংকলন করুন। প্রথম আর্গুমেন্টটি ব্যাখ্যা করার মতো ব্রেনফ্লো কোডযুক্ত একটি ফাইলের নাম। পঠনযোগ্যতা উন্নত করতে নিউলাইনগুলি যুক্ত হয়েছে।

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 এ সূচনা করা হয়েছে ফ্রিড থেকে স্যুইচ করা এবং পড়তে এবং খুলতে ফপেন। 23 বাইট সংরক্ষণ করা হয়েছে।

  • প্রোগ্রামে নাল টার্মিনেটর সেট করার দরকার নেই কারণ বাফার ইতিমধ্যে শূন্যে শুরু হয়েছে। 5 বাইট সংরক্ষণ করা হয়েছে।

2
আমি মনে করি যদি () এবং এটি; ?: এবং কিছু অক্ষর সংরক্ষণ করা যেতে পারে?
জেরি যেরেমিয়া

2
অক্ষর সংরক্ষণ করতে অক্ষর অক্ষরে অক্ষরে অক্ষরগুলি তাদের ASCII সমতুল্য সঙ্গে প্রতিস্থাপন করা যেতে পারে।
ছদ্মনাম

1
@ অরবি এটি ইনপুট চরগুলি সঠিকভাবে প্রক্রিয়া করছে বলে মনে হয় না। এটি তাদেরকে আসকি উপস্থাপনে রূপান্তর করতে হবে এবং তাদের সংরক্ষণ করতে হবে। এটি ছাড়াও এটি কাজ করে।
স্পোকট

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

অ্যাপলস্ক্রিপ্ট 972 670

এটি কখনও জিততে পারে এমন কোনও উপায় নেই যদিও বেশিরভাগ গল্ফড ed আমি জানি না কেন আমি কেবল পার্লের মতো একটি স্ক্রিপ্ট নির্মাণের কথা ভাবি নি (যদিও এটি এখনও হা হা জিতবে না)। সূচকটি কীভাবে আরও খানিকটা ভাল মূল্যায়িত হয় তা সামঞ্জস্য করে সম্ভবত এটি আরও গল্ফ করা যেতে পারে, অ্যাপলস্ক্রিপ্ট হতাশাজনকভাবে (এই ধরণের স্টাফের জন্য) একটি 1 সূচক ভাষা।

E () তে কেবল ব্রেইনফ্লো কোডটি পাস করুন। নোট করুন যে অ্যাপলস্ক্রিপ্টের এএসসিআইআই কমান্ডগুলি ম্যাকসআরমন এনকোডিং ব্যবহার করে, সুতরাং আউটপুটটি অন্যরকম প্রদর্শিত হবে, বাইনারি উপস্থাপনার দিকে তাকানো এটি সঠিক। "," কমান্ড থাকা সত্ত্বেও কোনও উচ্চতর 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

(কারণ অন্য কোন ভাষায় ব্রেইনফাক / ফ্লো ইন্টারপ্রেটার লেখার চেয়ে আপনার মস্তিষ্কের সাথে কী চ * * বেশি বেশি আছে যা আপনার মাথার সাথে খুব বেশি চূড়ান্তভাবে চলেন?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.