トレースレスビジービーバー


20

それらの忙しいビーバーはすべて非常に混乱しました。彼らはテープ全体に書いた。このレートでは、私たちの隣人は私たちに無制限のテープの貸し出しを停止します。

忙しいビーバーゲームをプレイする新しい方法が必要です。これは、使用するすべてのテープを破壊するものではありません。

ルール

Brainfuckのみ。メモリテープはどちらの方法でも制限されません。入力命令は常にを読み取るため、値をクリアするために使用できます。0

50バイトのソース制限。

実行の終了時には、メモリはすべてなければなりません。0

スコアは、メモリポインターの開始位置と最終位置の間の距離です。それらの間を移動するのに移動命令が必要な場合、スコアはnです。高いほど良い。可能な場合は正確な値を提供し、そうでない場合は推定値を提供します。nn

32バイト、22551

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

説明

-                                Initialize the list to [255].
 [                             ] Repeat as long as the list is not empty.
 [-                            ] Decrement the left end. We need to shrink the numbers so it ends eventually.
 [ [                         ] ] Skip if 0 already.
 [ [[>]                      ] ] Move to the cell past the right end.
 [ [   +                     ] ] Make this cell 1.
 [ [    >                    ] ] Go right again.
 [ [     +                   ] ] Make this cell 1. We've now appended [1, 1].
 [ [      [<]>               ] ] Go back to the first nonzero cell on the left.
 [ [          -              ] ] And decrement it.
 [ [           [            ]] ] We will need to transfer the rest of the number from the left to the right, so keep looping.
 [ [           [[>]<        ]] ] Go to the last nonzero cell on the right.
 [ [           [    +<+     ]] ] Increment this and the one on the left. These are the cells we appended earlier. We transfer to them.
 [ [           [       [<]> ]] ] Go back to the first nonzero cell on the left, which we are transferring from.
 [ [           [           -]] ] Decrement here on the left to balance out the incrementing on the right.
 [                            >] We end the iteration on a now empty cell. Move right, the new left end is there.

私たちはリストから始まります。各反復で、リストの左側の値nを使用し、n > 1の場合、[ n 1 n 1 ]を右側に追加します。数字付加N - 1 元のより低いN 、彼らはになるまで、彼らが小さくなりますので、1それらが拡大することなく消費された時点で、。したがって、プロセスは最終的に終了し、すべて0[255]nn>1[n1,n1](n1)(n)10メモリー内。ただし、各ステップで、コピーの数は2倍になります。リスト初期化されたこのプログラムのスコアは2 n1です。[n]2n1

この例は、提出物の作成に使用されるテクニックのいくつかを示すことを意図しています。規模の面では競争力がありません。


3
@Okx問題ありません-それは批判として意図されていませんでした。任意のコードの長さを可能にする、これを得点する別の方法がある場合、今の時間は、答えが来る前にそれを見つけることです、私は現在、コードゴルフタグが誤解されるよう、これを再タグ付けするつもりです。
センモウヒラムシ

3
バイト数を増やすと、成長の速い関数を定義できるため、ある程度の制限が必要です。特に50には理由はありません。ある程度の成長(私の例の指数関数よりも明確に優れています)および創造的なソリューションには十分に高いように見えますが、Beklemishevのワームまたは他の非常に速い成長にはまだ小さすぎます。//ところでタグを修正してくれてありがとう、私はこれを少し急いで出した。
EPICI

2
バックグラウンドのために:コードゴルフの最小スコアを回避しようとしていますが、このチャレンジはコードゴルフではなく、バイト数はスコアではないため、この場合は50バイトの制限があってもまったく問題はありません。
trichoplax

1
情報:この答えを他のチャレンジから「簡単に移植」して同様のスコアを取得できると思います。
user202729

1
@EPICI私の以前の忙しいビーバーはすでにトレースレスであったため、私はそれを適応させようとしていました。
ジョーキング

回答:


10

A(255,2)1=(22535)4

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

A[-[<+>>[-<[->+<]+>>]+<-]>[>]+[<]+<]A(m,n)1 - m, m, 1 <n times>mA(m,n)

次のPythonプログラムを使用して、プログラムの動作をモデリングしました。

def a(M, N):
    assert M > 0
    m = [-M + 1, M]
    n = N
    while m[-1]:
        while m[-1] > 1:
            m[-1] -= 1
            m[-2] += 1
            while n:
                m.insert(-1, 1)
                n -= 1
            n = 1
        n += 2
        m.pop()
    return n

1
末尾にを追加すると、スコアを増やすことができます>
ジョナサンフレッチ

うわー、非常に印象的
-alan2here
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.