Awesome
braintwist
braintwistは難解プログラミング言語(esolang)の一種です。メルセンヌ・ツイスタの生成する乱数列の下位3bitをBrainfuckの各命令に対応付けて実行します。
仕様
数値の下位3bitとbrainfuckの命令の対応は以下のとおりです。
brainfuck | + | - | > | < | , | . | [ | ] |
---|---|---|---|---|---|---|---|---|
2進数 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
braintwistでは、メルセンヌ・ツイスタのシード値を指定することで命令となる乱数列を決定します。シード値には64bit符号なし整数を指定出来ます。ソースコードにシード値を10進数で記述するとその値で初期化されたメルセンヌ・ツイスタが乱数列を生成します。
// example1.bt
5489
// 生成される乱数列
14514284786278117030 (0xC96D191CF6F6AEA6): [
4620546740167642908 (0x401F7AC78BC80F1C): ,
13109570281517897720 (0xB5EE8CB6ABE457F8): +
17462938647148434322 (0xF258D22D4DB91392): >
355488278567739596 (0x04EEF2B4B5D860CC): ,
︙
また、複数の乱数列をelement-wise xorで結合することで別の乱数列を生成できます。ソースコードでスペース区切りのシード値を指定するとその値ごとに乱数列を生成し、要素ごとのxorをとります。
// example2.bt
5489 123 9999
// 生成される乱数列
14514284786278117030 ^ 5777523539921853504 ^ 7613689384667096742 = 17359608791275394112 (0xF0E9B83873B7D440): +
4620546740167642908 ^ 10256004525803361771 ^ 9100361418872076222 = 12682459249403293001 (0xB001257E270CED49): -
13109570281517897720 ^ 17308305258728183101 ^ 11762500906121745713 = 16636634692408858612 (0xE6E1331BAAF857F4): ,
17462938647148434322 ^ 13582745572890801790 ^ 7090319362426798975 = 3189277425457784467 (0x2C4296EBC2956693): <
355488278567739596 ^ 3549292889148046380 ^ 16229357239031646724 = 15318202258068346596 (0xD4952FCB5DC016E4): ,
︙
更に、改行してシード値を記述すると 遅延した 乱数列を生成できます。改行の数だけ最初に0が出力され、その後指定したシード値で初期化された乱数列が出力されます。
// example3.bt
5489
123
9999
// 生成される乱数列
14514284786278117030 ^ 0 ^ 0 = 14514284786278117030 (0xC96D191CF6F6AEA6): [
4620546740167642908 ^ 5777523539921853504 ^ 0 = 1167164350829941596 (0x103299CB0DB7D35C): ,
13109570281517897720 ^ 10256004525803361771 ^ 0 = 4303797961976611347 (0x3BBA2971A4AA8213): <
17462938647148434322 ^ 17308305258728183101 ^ 0 = 174410859798185647 (0x026BA1C0BF3DC6AF): ]
355488278567739596 ^ 13582745572890801790 ^ 7613689384667096742 = 15075847851496747028 (0xD1382BBEE44CB014): ,
︙
この乱数列は無限に続くため、プログラムの実行を終了するには ]
命令によりbrainfuck命令列の最初の命令よりも前にジャンプします。この方法で終了した場合 exit code 0 で正常終了します。メモリの負の番地や確保されたメモリセルを超える番地を参照した場合は exit code 1 で異常終了します。
brainfuckインタプリタの仕様
メモリセルは8bit非負整数を格納することができ、各セルの初期値は0です。デフォルトで30,000個確保されます。オプション -memSize M
により好きな値に変更できます。
セルの値のオーバーフローはwrapされ、0 - 1 = 255, 255 + 1 = 0となります。
ポインタが負の番地のセルを指しても何も起きませんが、負の番地のセルや確保されたセルサイズを超える番地を参照しようとすると異常終了します。
EOFはデフォルトで0です。オプション -eof N
によりN=0~255の好きな値に変更できます。
インストール方法
Requirements: Go 1.12 or later
$ go get -u github.com/nakario/braintwist/cmd/braintwist
$ braintwist example.bt
サンプルコード
- cat.bt
- 入力をそのまま出力するプログラム
,[.,]+]
...
- cat_eof_255.bt
- EOFが255(= -1)の場合のcat
,+[-.,+]--+><]
...
- helloworld.bt
- "Hello, World!\n"を出力するプログラム
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.]
...
メルセンヌ・ツイスタ
メルセンヌ・ツイスタは提案者が公開する64bitマシン用コードと互換性のあるGo実装を使用します。シード値 5489
を指定したときに 10000
番目に生成される値が 9981545732273789042
であることが保証されます。