7

codegolf.se のブレインファック アセンブラーの実装に問題があります。文字列をメモリにロードして、その長さを調べたり、文字列をn回出力したりすることができましたが、小文字以外の数字だけをメモリにロードすることはできません。それでは、いくつかの魔法を実行する次のループを見てみましょう。(ハッシュ マークはデバッグ マーカーです。)

#,#[>#<[<]<<#+#>>>[>]#,#]<[<] 

ポインタ 512 から開始し、文字列を ascii 値として 512 以降のスポットに書き込みます。


(何らかの理由で) 小文字を削除したい場合、疑似 BF では次のようになります。

#,#[>#<[<]<<#+#>>>[>]#do{,(takes input and assigns it)}
while(input>=96/*Go arbitrarily to the right for this implementation but
make sure that the first non-lowercase number is stored at the index*/)#
//Also be sure to zero out any temporary cells used
<[<] 

ここで私の質問は、ストレージとして 512 の右側のスペースのみを使用し、後でそれらをクリアしながら、そのような while ループを実装するにはどうすればよいかということです。

好奇心旺盛な人のために、これは私がブランファックで解決したい問題です.

4

1 に答える 1

2

コードは次のように簡略化できます

,[[<]<+>>[>],]<[<]

(これ<<+>>はおそらく、セル 255 を忘れるオンライン コンパイラを使用した結果です)

を繰り返し、出力操作を生成します。

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

空のセルのみを使用したい場合は、それを行うことができます。ただし、次のセルまでの距離を示す次のセルを使用してすべてのデータ セルを保存するなど、次のセルを定義するための独自のプロトコルを確立する必要があります。

[..., 104, 5, x, x, x, x, 108, 3, x, x, 102, 2...] 

[...,  104 ,    5   , x, x, x, x,  108 ,    3    , x, x,  102 ,    2   ...] 
      data   pointer              data   pointer         data   pointer

whenxは任意のゼロ以外の値です (そうでない場合はそれを使用します)。この実装は一種の連結リストになりますが、スペースとコードが高価になることに注意してください。


セルのゼロ化、またはセルのクリーニングと呼ばれる方法は、[<]を使用して -と同じ方法で実行できます[-]。これにより、セルの値が 0 になるまで減少し、その後ループアウトします。終わりに達したときに文字列を下に反復処理し、最初に到達するまですべてのセルを消去しながら戻ることができます (0またはそこに置いた他の予約番号)。

于 2016-09-12T13:02:46.777 に答える