ランダム化されたBrainfuckコンパイラ


10

Joeは平均的なBF開発者です。彼は上司から電話を受けたときに、リポジトリへのコードの変更をチェックインしようとしています。「ジョー!新しいクライアントのマシンが壊れています!ブレインファックインタープリターは、プログラムの実行前にすべてのセルをランダムな値に設定します。修正する時間がないので、コードで処理する必要があります。」ジョーはそれについてはあまり考えていません。上司が再び彼に割り込んだときに、最初の100万個のセルをゼロに設定するプログラムを書こうとしています。できるだけ小さくしてください。」今、あなたは貧しいジョーを助けなければなりません!

仕様書

  • あなたは入力としていくつかの有効なbrainfuckコードを取得します
  • プログラムはコードを変更して、ランダム化されたbrainfuckインタープリターで機能するようにします
  • つまり、プログラムを実行する前に、セルを任意の値に設定できます。
  • 新しいプログラムは、初期条件に関係なくまったく同じ動作をする必要があります。
  • インタープリターは、ラッピングを含む最大セル値が255で、テープの長さが無限になります。

得点

あなたのスコアは、10回のバイト単位でのコンパイラのサイズに加えて、テストケースのサイズの合計。最も低いスコアが勝つことは明らかです。テストケースの最適化を緩和するために、疑わしい場合はテストケースを変更する権利を留保しており、おそらく勝者を選ぶ前に変更します。

テストケース

(私はesolangsページとこのWeb ページからこれらを入手しました:http : //www.hevanet.com/cristofd/brainfuck/)。最後のテストケースについては@Sparrにも感謝します。

  • こんにちは世界: ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
  • 逆入力: >,[>,]<[.<]
  • 2の累乗(無限ストリーム): >++++++++++>>+<+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<]>.>[->[ <++>-[<++>-[<++>-[<++>-[<-------->>[-]++<-[<++>-]]]]]]<[>+<-]+>>]<<]
  • 10000未満の正方形: ++++[>+++++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]
  • フィボナッチストリーム: >++++++++++>+>+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[[-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>]<<<]
  • 入力までのASCIIシーケンス:(,[.[>+<-]>-]これは入力に基づいてさまざまなセル番号を必要とします)

コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
マーティンエンダー2015

回答:


8

sed、46バイトコンパイラ

s/</<</g
s/>/>[->[-]>[-]+<<]>/g
s/^/[-]>[-]+</

プログラムを作成するまでは、出力もゴルフであることに気づかなかったので、短いコンパイラを使用します。また、テストするには手間がかかりすぎたため、正しく機能しない場合は通知してください:)


1
よくわかりません。3行目で空の文字列を置き換えますか?空の文字列はsedで何に一致しますか?「sed:最初のREは空ではない可能性があります」
Sparr

@Sparr了解しました。代わりにキャレットで試してください。
feersum 2015

3
わかりました、フォローしてみましょう...セル0をゼロにし、セル1を1に設定します。すべての<を<<に、>を> X>に置き換えます。ここで、元のプログラムがセルnにアクセスしたときはいつでも、新しいプログラムは偶数番号のセルであるセル2nにアクセスします。Xは渡される奇数セルをゼロにし、ゼロでない場合は次のセル(偶数セル)をゼロにし、次の奇数セルを1に設定しますか?
Sparr 2015

2
ご存知のように、短いコンパイラを使用している場合、これはRetinaでは 35バイトにすぎません。;)
Martin Ender 2015

1
@MartinBüttner恥知らずなプラグイン!:P
オプティマイザ

2

C ++

コンパイラー・サイズ:630バイト(Zacharýのおかげで-10バイト)
Hello Worldコンパイル結果サイズ:139
10000未満の正方形:319

コンパイラー:

#include<string>
#include<map>
#include<stack>
#define B break
#define C case
#define S 30000
#define R m[(p<0)?(p%S)+S:p]
using s=std::string;using P=std::pair<int,int>;s a(s c){char m[S];memset(m,0,S);int p=0,i=0;P r{0,0};std::map<int,int>j;std::stack<int>t;for(int d=0;d<c.size();++d){if(c[d]==91)t.push(d);if(c[d]==93){j[d]=t.top();j[t.top()]=d;t.pop();}}while(i<c.size()){switch(c[i]){C'>':++p;B;C'<':--p;B;C'+':++R;B;C'-':--R;B;C'[':if(!R)i=j[i];B;C']':i=j[i]-1;B;default:B;}++i;r.first=p<r.first?p:r.first;r.second=p>r.second?p:r.second;}s n;for(int i=r.first;i<r.second;++i){n+="[-]>";}n+="[-]"+s(r.second,60)+c;return n;}

ランダム化されたbrainfuckインタープリター:

void interpret(const std::string& code) {
    char memory[30000];
    for (int i = 0; i < 30000; ++i)
        memory[i] = std::rand()%256;
    int memPtr = 0, insPtr = 0;
    std::map<int, int> jump_map;

    {
        std::stack<int> jstack;
        for (int i = 0; i < code.size(); ++i) {
            if (code[i] == '[')
                jstack.push(i);
            if (code[i] == ']') {
                jump_map[i] = jstack.top();
                jump_map[jstack.top()] = i;
                jstack.pop();
            }
        }
    }
    while (insPtr < code.size()) {
        switch (code[insPtr]) {
        case '>': ++memPtr; break;
        case '<': --memPtr; break;
        case '+': ++memory[memPtr]; break;
        case '-': --memory[memPtr]; break;
        case '.': std::cout << memory[memPtr]; break;
        case ',': std::cin >> memory[memPtr]; break;
        case ']': if (memory[memPtr] != 0) insPtr = jump_map[insPtr]; break;
        case '[': if (memory[memPtr] == 0) insPtr = jump_map[insPtr]; break;
        default:break;
        }
        ++insPtr;
    }
}

いくつかのメモ:

  • コンパイラーは、プログラムを実行して、使用されているメモリー・セルを判別します。プログラムが無限ループの場合、コンパイラーは無限ループします。

あなたはの名前を変更することによって、あなたのスコアを減らすことができますpiiP、との定義変更Rにはm[p<0?p%30000+30000:p]、それに応じてそれらにすべてのコール/参照を修正します。また、テストケースを変更しました。私はこれをチェックしていませんが30000、頻繁に使用するため、何かを定義するためにいくつかのバイトを節約する可能性があります。
ザカリー

1
うは変更Rm[p<0?p%S+S:p]動作しますか?
ザカリー

の定義で括弧を削除するとR、数バイト節約できます。
ザカリー

1

rs、33バイト、スコア:2659

ほとんどの場合、sed答えの単なるポートです。

</<<
>/>[->[-]>[-]+<<]>
[-]>[-]+<

1
この言語を昨日より前に公開しましたか?質問の作成日より後の言語は、回答の送信には無効です。
Sparr、2015

@Sparrええと、私は持っていましたが、Gitのコミット履歴を壊してレポを再作成する必要がありました...
kirbyfan64sos 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.