?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
標準準拠のインタープリターが使用される場合、これは入力と出力をバイト値として受け取ります。STDIN / STDOUTで実際に10進数を使用するには、PythonインタープリターとNUMERIC_OUTPUT = True
追加オプションが必要NUMERIC_INPUT = True
です。
説明
プログラムのスケルトンは
?1-( 1 -
1 )!
入力N
を最初の音声に読み込み、それをデクリメントして取得しN-1
ます。また、2番目の音声をに初期化し1
ます。次に、ループをN-1
1回繰り返し、その繰り返しごとに、2番目のスタックのシーケンスの次の値を取得します。最後にN
th番目の数字を出力します。
プログラムの考え方は、シーケンスの各要素を3番目の音声のキューに入れ、各反復でそのキューの先頭を減らすことです。頭に達する0
と、シーケンスの値を増やしてそれを取り除き0
ます。
問題は、Preludeがキューではなくスタックを使用することです。そのため、キューのように使用するには、そのスタックを少し移動する必要があります。
v #
0v ^
(#)
これは、シーケンスの現在の値を最初の音声にコピーし(一時コピーとして)、0
2番目の音声にプッシュします(キューの終わりをマークするため)。そして、ループを実行して、3番目のスタックを2番目のスタックにシフトします(つまり、逆にします)。ループの後、現在のシーケンス値のコピーを2番目のスタック(キューの末尾)の上に置きます。
)
(#
^#1-
これは少しいように見えますが、基本的にはスタックを3番目のボイスに戻すループです。以来)
シフト命令と同じ列にある、0
私たちはお互いにそれを削除する必要があるので、私たちは第2の音声に置くには、以前にも、第三声になってしまいます#
。次に、3番目の音声の先頭、つまりキューの先頭をデクリメントします。
少し面倒です-その値がのときにコードを実行したいのですが0
、Preludeの唯一の制御構造(ループ)はゼロ以外の値にのみ応答します。
0 (1+0)#
(0)#
2番目の音声の上部は真実です(ゴロムシーケンスには0
s が含まれていないため)。したがって、ワークロードはその音声(後者の括弧のペア)に入ります。キューの先頭がまだない場合は、それを防ぐ必要があります0
。したがって、最初に3番目の音声に「ループ」が0
あり、キューの先頭がまだゼロでない場合に2 番目の音声にプッシュします。また0
、3番目の音声にaを付けて、ループをすぐに抜けます。#
第三声には、いずれかのことを削除する0
場合、またはキューの先頭を削除することがすでにゼロでした。これで、キューの先頭がゼロの場合にのみ2番目のループに入ります(そして0
2番目の声ではプッシュされませんでした)。その場合、シーケンスの現在の値をインクリメントし、a 0
を押してループを終了します。最後に、常に0
スタックの一番上にあり、破棄する必要があります。
プレリュードでは論理否定が迷惑だと言いました...
n
なく使用し2 - n % 1
ます。答えが大きく異なると予想する理由はありますか?