Brainfuck、78バイト
無制限の報奨金:誰でもこのスコアを改善できる場合、報奨金(+500)を渡します。
@KSabは 76 72バイトのソリューションを見つけました!
--<-<<+[+[<+>--->->->-<<<]>]<<--.<++++++.<<-..<<.<+.>>.>>.<<<.+++.>>.>>-.<<<+.
オンラインでお試しください!
最初の28バイト--<-<<+[+[<+>--->->->-<<<]>]
は、次の繰り返し関係(mod 256)でテープを初期化します。
F N = 171・(-f N-1 - F N-2 - F 3 N- 1 +)とF 0 = 57、F 1 = 123、及びF 2 = 167。
ので、171の係数が生じる3 -1 ≡171(256 MOD) 。現在の値が変換<+>---
されると、毎回1セルずつ(を介して)3が減算され、値に171が効果的に乗算されます。
でN = 220、翻訳されるべき値はゼロであり、反復は停止します。ストップポイントの前の10バイトは次のとおりです。
[130, 7, 43, 111, 32, 109, 87, 95, 74, 0]
これには、を作成するのHello, World!
に必要なすべてのコンポーネントが含まれていますが、わずかな調整が必要です。
また、代替の78バイトソリューションも見つかりました。
-[++[<++>->+++>+++<<]---->+]<<<<.<<<<-.<..<<+.<<<<.>>.>>>-.<.+++.>>.>-.<<<<<+.
オンラインでお試しください!
これはいくつかの理由で最初のものよりも優れていると思います:残りのセルの使用量が少なくなり、変更されるセルの総数が少なくなり、より速く終了します。
より詳しく
Brainfuckでは、再帰関係に驚くほど簡潔な表現が使用されています。一般的なレイアウトは次のとおりです。
{...s3}<{s2}<{s1}[[<+>->{c1}>{c2}>{c3...}<<<]>{k}]
以下を表します:
f n = c 1・f n-1 + c 2・f n-2 + c 3・f n-3 + ... + k
と
f 0 = s 1、f 1 = s 2 + c 1・f 0 + k、f 2 = s 3 + c 2・f 0 + c 1・f 1 + kなど
さらに、<+>
停止点に影響を与えることなく範囲を定数で乗算するように変更でき、停止点に>{k}
影響を与えずに定数で範囲をシフトする前に項を追加できます。
その他の例
フィボナッチ数列
+[[<+>->+>+<<]>]
N角形の数字
三角数字
+[[<+>->++>-<<]>+]
f n = 2・f n-1 -f n-2 + 1として定義され、f 0 = 0、f 1 = 1です。
平方数
+[[<+>->++>-<<]>++]
五角形の数字
+[[<+>->++>-<<]>+++]
等
BFクランチ
このソリューションのいくつかを見つけるために使用したコードをgithubで公開しました。.NET 4.0以降が必要です。
Usage: bfcrunch [--options] text [limit]
Arguments
------------------------------------------------------------
text The text to produce.
limit The maximum BF program length to search for. If zero, the length of the
shortest program found so far will be used (-r). Default = 0
Options
------------------------------------------------------------
-i, --max-init=# The maximum length of the initialization segment. If excluded, the
program will run indefinitely.
-I, --min-init=# The minimum length of the initialization segment. Default = 14
-t, --max-tape=# The maximum tape size to consider. Programs that utilize more tape than
this will be ignored. Default = 1250
-T, --min-tape=# The minimum tape size to consider. Programs that utilize less tape than
this will be ignored. Default = 1
-r, --rolling-limit
If set, the limit will be adjusted whenever a shorter program is found.
-?, --help Display this help text.
出力は3行で提供されます。
- 見つかったプログラムの全長、および初期化セグメント。
- 現在のテープポインターから始まるパス。各ノードは、出力の1文字に対応し、(ポインター、コスト)として表されます。
- 使用されているテープセグメント。
たとえば、最終的な結果bfcrunch "hello world" 70 -r -i23
は次のとおりです。
64: ++++[[<+>->+++++>+<<]>]
49, (45, 5), (44, 3), (45, 6), (45, 1), (45, 4), (42, 4), (43, 5), (45, 3), (45, 4), (46, 2), (44, 4)
32, 116, 100, 104, 108, 132, 0, 0, 132, 0
これは完全なプログラムに対応します。
++++[[<+>->+++++>+<<]>]<<<<.<+.>++++..+++.<<<.>+++.>>.+++.>.<<-.
その他の記録
こんにちは世界!
ラッピング、78バイト:
--<-<<+[+[<+>--->->->-<<<]>]<<--.<++++++.<<-..<<.<+.>>.>>.<<<.+++.>>.>>-.<<<+.
または
-[++[<++>->+++>+++<<]---->+]<<<<.<<<<-.<..<<+.<<<<.>>.>>>-.<.+++.>>.>-.<<<<<+.
非ラッピング、87バイト(以前は92バイト(ミッチ)):
--->->->>+>+>>+[++++[>+++[>++++>-->+++<<<-]<-]<+++]>>>.>-->-.>..+>++++>+++.+>-->[>-.<<]
こんにちは世界!
ラッピング、80バイト:
++<-[[<+>->+>--->-<<<]>+++]>+.<<<<<<<++.>>>..>.<<--.<<<--.>>+.>>>.+++.<.<<<-.<+.
非ラッピング、81バイト(以前は92バイト(hirose)):
+>---->->+++>++>->+[++++++++[>++++++++>>+++++<<<-]<]>>.>++>.>..+>>.+>-->--[>-.<<]
こんにちは世界!
ラッピング、74バイト:
-<++[[<+>->->+++>+<<<]->]<<.---.<..<<.<<<---.<<<<-.>>-.>>>>>.+++.>>.>-.<<.
非ラッピング、84バイト:
---->+++>++>->->++[+++++++[>+++++[>++>>+<<<-]<-]++<]>>>>.---.>---..+>->.+>-->+>[-.<]
Hello World!\ n
ラッピング、76バイト:
+[++[<+++>->+++<]>+++++++]<<<--.<.<--..<<---.<+++.<+.>>.>+.>.>-.<<<<+.[<]>+.
これは家の左側にある1つのセルを使用するため、77と見なされます。
非ラッピング、83バイト:
->+>>>+>>---[++++++++++[>++++++>+++>+<<<-]-<+]>+>+.>.->--..>->-.>[>.<<]>[+>]<<.>++.
Rdebathが承認しました。profilebf出力:
Hello World!
Program size 83
Final tape contents:
: 0 0 73 101 109 115 112 88 33 10 0
^
Tape pointer maximum 10
Hard wrapping would occur for unsigned cells.
Counts: +: 720 -: 79 >: 221 <: 212
Counts: [: 9 ]: 84 .: 13 ,: 0
Total: 1338
"こんにちは世界"
ラッピング、70バイト(以前は78 1):
+[++[<+++>->+++<]>+++++++]<<<--.<.<--..<<---.<+++.<+.>>.>+.>.>-.<<<<+.
非ラッピング、77バイト(以前は89?):
->+>>>+>>-[++++++[>+++++++++>+++++>+<<<-]<+]>>.>--.->++..>>+.>-[>.<<]>[>]<<+.
著者は、最短の手書きの「Hello World!」89バイトですが、参照を提供しません。私もこれの記録を主張します。
こんにちは世界!
ラッピング、65バイト(以前は66バイト):
+++[>--[>]----[----<]>---]>>.---.->..>++>-----.<<<<--.+>>>>>-[.<]
これも実際には手作業でコーディングされています(クランチで見つけることができる最高のサイズは68バイトです)。最初のセルは259(3)に初期化され、繰り返しごとに7ずつ減少し、37回ループします。次のセルは6減分され、256-6 ・37 = 34になります。残りのセルは毎回4ずつデクリメントされ、各反復ごとに1つのセルが追加され、新しいセルはそれぞれ252(-4)に初期化されます。結果は次のとおりです。
[ 3, 0, 0, 0, 0, 0, 0, ...]
[252, 250, 248, 0, 0, 0, 0, ...]
[245, 244, 244, 248, 0, 0, 0, ...]
[238, 238, 240, 244, 248, 0, 0, ...]
[231, 232, 236, 240, 244, 248, 0, ...]
[224, 226, 232, 236, 240, 244, 248, ...]
...
[ 35, 64, 124, 128, 132, 136, 140, ...]
[ 28, 58, 120, 124, 128, 132, 136, ...]
[ 21, 52, 116, 120, 124, 128, 132, ...]
[ 14, 46, 112, 116, 120, 124, 128, ...]
[ 7, 40, 108, 112, 116, 120, 124, ...]
[ 0, 34, 104, 108, 112, 116, 120, ...]
1与えられたソリューション(79バイト)は、1つだけ簡単に削減できます。
-[>>+>+[++>-<<]-<+<+]>---.<<<<++.<<----..+++.>------.<<++.>.+++.------.>>-.<+.