BrainFlow Interpreter!


11

BrainFlow

BrainFlowとは何ですか?

BrainFlowはBrainF ** k(BFk)の拡張機能であり、追加機能と混乱のための3つの追加コマンドがあります。

どのコマンド?

通常のBFkコマンドに加えて、次のものもあります。

^ セルの値に応じて、セル#にジャンプします。例:値が4のセル#0にいる場合、^はセル#4にジャンプします。

= セルの値をセルのインデックスに設定します。例:値が0のセル#4にいる場合、=は値を4に設定します。

現在のセルの値に基づいて、現在のセルの値をセルの値と等しく設定します。(これは言いにくいので、例を示します!)例:セル#33にいて、このセルの現在の値は7であり、セル#33の現在の値をセル#7の値に設定します。

オプションの課題

以下のいずれかを達成すると、指定されたボーナスがバイト数に適用されます。

Interpreter written in BrainFlow (サンプルで解釈でき、少なくとも1つの意味のある ^ = または が含まれます): スコア/ 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

Javaインタプリタの例:

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;
    }
}

ゴルフにさえ近くないが、良い出発点を提供するはずです。

最も低い最終スコアが勝ちます。スコアは、該当するチャレンジの削減が考慮された後のプログラムのバイト数です。

テスト中

次のBrainFlowプログラムは、標準入力から「+」文字を読み取った後に、指定された出力を印刷する必要があります。

<<,++++[>++++[>++++<-]<-] 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 '28

2
サブセットではなく、「スーパーセット」を意味すると思います。
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎsがからsubsetに変更されましたextension。フィードバックをお寄せいただきありがとうございます。
スポコット2014

ブレインフローで書かれているためのスコアは悪い考えです-ブレインファックはブレインフローのサブセットです。C ++プログラムはCプログラムよりもスコアが高いと言っているようなものです。OK、私のCプログラムはC ++プログラムです、soo ....
pseudonym117

1
Brainfuckで実装を書くことには、Brainflowで実装を書くよりもメリットが少ないのはなぜですか?前者の方が言語が小さいため、前者のほうが難しいようです。
Peter Olson

回答:


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

単に私の既存のBrainFuckインタープリターを取り上げ、それを利用して、BrainFlow関数を追加しました。

更新:28バイトを失うようにプログラムを完全に再構成しました。


300個の "+"の文字列が渡されると、無効な値になることに注意してください。これらの値の多くを設定した後/中に、%256の健全性チェックを行う必要があります。
user0721090601 14

これはループ([])では機能しないと思います。そのため、文字ごとに評価することはできません。
nutki 2014

プラスはどのように括弧に変換されますか?
nutki 14

6

パーティを始めましょう。

C- 408 384 393 390 380 357 352バイト(まだ欠けている)

gccPOSIX準拠システムでコンパイルします。最初の引数は、解釈されるBrainflowコードを含むファイルの名前です。読みやすさを向上させるために改行が追加されました。

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に初期化されることを覚えておいてください。freadおよびfopenからreadおよびopenに切り替えました。23バイト節約。

  • バッファはすでにゼロに初期化されているため、プログラムにnullターミネータを設定する必要はありません。5バイト節約。

2
if()と; ?:に置き換えて、一部の文字を保存できます。
ジェリージェレミア

2
文字リテラルは、文字を保存するために同等のASCIIに置き換えることができます。
pseudonym117

1
@Orby入力文字を正しく処理していないようです。それらをASCII表現に変換して保存する必要があります。それ以外は機能します。
スポコット2014

1
2バイトに置き換えmain(int c,char**v){main(c,v)char**v;{保存したりint i=0,p=0,b[9999],*k=b;、関数の外に移動したり、ドロップしint て4バイトを保存したりできます。if (c==91)また、不要なスペースがあります。
es1024 2014

1
あなたはまた、すべてではないのほとんどを置き換えることができますc==[number]?[action]:0;c-[number]||[action]。(c-[number]と等価であるc != [number]if(p)p--;してp&&p--;
es1024

6

AppleScript 972 670

勝つ方法はありませんが、ほとんどがゴルフです。なぜperlのようにスクリプトを作成することだけを考えなかったのかはわかりません(それでもハハを勝ち取ることはできません)。これはおそらく、インデックス値の調整方法を少し調整することでさらにうまくいく可能性があります。AppleScriptは(この種のことについては)苛立たしいことに1インデックス言語です。

BrainFlowコードをe()に渡すだけです。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

(別の言語でbrainfuck / flowインタープリターを作成するよりも、脳でf *** sを行うのは、頭を使いすぎる***

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.