虹の終わりのセル


31

最も有名で影響力のある難解な言語の1つであるbrainfuckを知っているか、少なくとも聞いたことはあります。最近ではほとんどの実装で無限テープが使用されていますが、UrbanMüllerの元のコンパイラには30000セルのテープがありました。少し知られている事実*は、テープの最後に実際に特別な値があるということです。これは、典型的なブレインファックプログラムではほとんど対話されません。

この値を29999 >sとa .で印刷できますが、brainfuckは短く簡潔な解決策で知られているため、目的はこの値を最小文字数で印刷することです。

*フィクション

ルール:

  • Brainfuck命令の復習:
    • +/ -:現在のセルをインクリメント/デクリメントし、255がインクリメントされると255から0に折り返し、その逆も同様
    • </ >:テープ上でポインターを左右に移動します
    • .:現在のセルの値を出力します。
    • []セルの値が0の場合、対応するものにジャンプします
    • ][セルの値が0でない場合、対応するものにジャンプします
  • この場合,(元のコンパイラーはEOFでセルを変更せずに残すため)(入力の取得)は何も行いません。このプログラムは入力を受け取りません。
  • テープは最初はすべて0で満たされていますが、セル30000には不明な値が含まれています。
  • ポインターはセル1から始まり、セル30000で終了し、印刷されます。
  • 1の左側と30000の右側のセルには未定義の動作があるため、ソリューションはこれらのセルにアクセスしないでください。
  • 30000の値あなたがゼロ以外のセルは動作しませんヒットするまで、そう単純にループし、0かもしれません。
  • セル30000の値のみを印刷する必要があります
  • 最短のソリューションが勝ちです!
    • タイブレーカーは、より効率的なプログラム(最小ステップで実行)であり、その後に最短の送信時間が続きます。

ヒント: Esolanging Fruitでは、https //copy.sh/brainfuckを使用してコードをテストすることをお勧めします。仕様はこの課題で説明されているabortとおりであり、範囲外になった場合にプログラムが停止するようにオプションを選択できます。



3
1バイト:.。私の勝ち。
エソランジングフルーツ

1
私は私の妄想が喜ばてみましょう@EsolangingFruit ...
ジョー・キング

1
ルールを「最初は未知の値を持つ最後のセルを除き、すべてのセルの値は0になります」に変更することをお勧めします。
user202729

4
これを行う人のためのヒント:copy.sh/brainfuckは、おそらくこのチャレンジで説明されているBFを実装し、デフォルトで30kテープを持っているため、これを行うのに最適なサイトです。テープの終わりを過ぎて移動すると、インタープリターがハングします。
エソランジングフルーツ

回答:


17

54バイト

------[>+++<--]>[->----[-[->+<]<[->+<]>>]<]>>>>>>>>>>.

119 x 252 =29988。単純なネストされたループ。

このツールを使用して、ポインターが29999で停止することを確認しました。


12

50バイト

>+[>+[<]>->+]>-<<[>>-------[[>]+[<]>-]<<-]>>>[>]>.

ここで試してみてください!

最初のセクション(>+[>+[<]>->+]>-<<)は、テープを

0*12 121' 0 110

次のセクション([>>-------[[>]+[<]>-]<<-])は121回反復1し、毎回テープの最後に249を追加します。数学が速い場合、この121 * 249の結果は30129 1秒になることに気付くかもしれませんが、最初の反復では処理する残りの110 があり、テープに追加するのは(110-7)103 1秒だけであり、29983 1秒しかないことを意味します。最終的なテープは次のようになります。

0*12 0' 0 0 1*29983 0 ???

そして、最後>>>[>]>.に値を印刷します。

その他の注目すべきアルゴリズム:

  • 252 * 119 = 29988(50バイトも)
  • 163 * 184 = 29992(56バイト)
  • 204 * 147 = 29988(60バイト)
  • 153 * 196 = 29988(56バイト)
  • 191 * 157 = 29987(57バイト)
  • 254 * 118 = 29972(56バイト)
    • 余分なバイトは基本的に余分な距離を移動するだけなので、これは次に50に最も近いと考えるものです。118を生成し、14セル以上移動するアルゴリズムを見つけることができれば、これはそれを打ち負かす可能性があります。

3

81

-[+>+[<]>++]<<+[-->-[-<]>]>-[>[->+[[->+<]<]>>>]<[-<<+>>]<<<-]>-------[[->+<]>-]>.

これは、150セル200回移動します。

これは私が望んでいるよりもはるかに長く、ゴルフには深刻な障害があります:

私が働いている理由がわかりません。

これは、それらのいくつかがおそらくキャンセルできる程度まで、1つずつの補正で散らばっています。さまざまなセグメントを追加および削除したため、特定の場所に配置する理由を思い出せなくなりました(たとえば、最初の部分がテープセルを200および150ではなく199および151に初期化するのはなぜですか)。

とにかく、この怪物のコメント版は、私(または他の誰か)がそれらを役に立つと思うことを望んでいます:

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

0 0 0 199' 155

[
  n' k 0
  >[
    n k' j
    ->+[[->+<]<]>
    0' n k-1 j+1 OR
    n 0 0' j+1
    >>
  ]
  0*k n 0 0 k 0'
  <[-<<+>>]<<<-
  0*k n-1' k
]
>-------[[->+<]>-]>.

これは実際には値を出力しません。値が正の場合、オーバーフローします。しかし、大きな試み
ジョーキング

次に、を追加.しますか?
user202729

1
@JoKingそれを修正しました。
エソランジングフルーツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.