brainfuck、474の 176 154 151 149 137バイト
入力文字列取り8 0
及び1
第含む0
小数点のために。
(投稿の表の2番目の列のように)
0〜9の数字を出力します。
,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]
オンラインでお試しください!
アルゴリズム
特定のセグメントの状態を観察することにより、可能な数字のセットをより小さなサブセットに分割できます。以下は、私のコードで使用されている静的なバイナリ検索ツリーです。左のサブツリーはセグメントのオン状態に対応し、右のサブツリーはセグメントのオフ状態に対応します。
0,1,2,3,4,5,6,7,8,9
|
/-------[A]-------------------------\
0,2,3,5,6,7,8,9 1,4
| |
/-------------[B]----------------\ /----[G]----\
0,2,3,7,8,9 5,6 4 1
| |
/--------[E]--------\ /----[E]----\
0,2,8 3,7,9 6 5
| |
/----[F]----\ /----[F]----\
0,8 2 9 3,7
| |
/----[G]----\ /----[G]----\
8 0 3 7
ゴルフに役立ついくつかの観察
- ビットCおよびDは冗長であり、無視できます。
- 先行ゼロ(小数点のビット)は、入力の解析と出力の準備の両方に重要な値48として(ab)使用できます。
- リーフに到達して数字が印刷されたら、それ以降のすべての条件をスキップするだけです。データポインターをゼロの領域まで十分に移動して、戻れないようにすることで実行できます。
- 一部のBF実装は負のデータポインターをサポートしていないため、互換性のために右側にゼロを使用することをお勧めします。
- したがって、出力値を右端のセルに保存する方が良いので、右側のゼロの領域に簡単に到達できます。
- したがって、出力セルに簡単にアクセスできるように、ビットを左から右にA、B、E、F、Gで確認することをお勧めします。
- 異なる数字が出力コードを共有する場合があります。たとえば、5と6は同じサブツリーにあります。
+++++
両方の値に対して行うことも+
、6つの値に対してのみ行うこともできます。
+
事前に出力値に2を追加すると、コマンドの数を減らすことができます。その場合は、0
それ1
だけを減らして、他の数字を活用する必要があります。