_8
,%
;
"}{{+_5
"= %_!
= """{
;"{" )!
ゼロ除算エラー(STDERRのエラーメッセージ)で終了します。
オンラインでお試しください!
レイアウトは非常に非効率的と感じていますが、今ゴルフをする方法が見当たりません。
説明
この解決策は、デニスの算術トリックに基づいています。すべての文字コードを法とし8
、両端からペアを追加し、で割り切れるようにし5
ます。
ラビリンスプライマー:
- Labyrinthには、mainとaux(iliary)の任意精度整数の2つのスタックがあり、最初は(暗黙の)無限量のゼロで埋められます。
- ソースコードは迷路に似ており、指示ポインター(IP)が可能な場合(コーナーの周りであっても)通路をたどります。コードは、読み取り順序の最初の有効な文字、つまりこの場合は左上隅から始まります。IPが任意の形式のジャンクション(つまり、元のセルに加えていくつかの隣接セル)に到達すると、メインスタックの最上部に基づいて方向を選択します。基本的なルールは次のとおりです。負の場合は左に曲がり、ゼロの場合は先に進み、正の場合は右に曲がります。そして、壁があるためにこれらのいずれかが不可能な場合、IPは反対方向を取ります。IPは、行き止まりに到達したときにも向きを変えます。
- 数字は、メインスタックの最上部に10を掛けてから数字を追加することで処理されます。
コードは小さな2x2の時計回りループで始まり、8を法とするすべての入力を読み取ります。
_ Push a 0.
8 Turn into 8.
% Modulo. The last three commands do nothing on the first iteration
and will take the last character code modulo 8 on further iterations.
, Read a character from STDIN or -1 at EOF. At EOF we will leave loop.
を;
破棄し-1
ます。メインスタックの上部(最後の文字)を下に移動する別の時計回りのループに入ります。
" No-op, does nothing.
} Move top of the stack over to aux. If it was at the bottom of the stack
this will expose a zero underneath and we leave the loop.
= Swap top of main with top of aux. The effect of the last two commands
together is to move the second-to-top stack element from main to aux.
" No-op.
短い線形ビットがあります:
{{ Pull two characters from aux to main, i.e. the first and last (remaining)
characters of the input (mod 8).
+ Add them.
_5 Push 5.
% Modulo.
これで、IPは分岐点として機能し、分岐として機能して5での可分性をテストします。モジュロの結果がゼロでない場合、入力がWatson-Crick回文ではないことがわかり、東に曲がります。
_ Push 0.
! Print it. The IP hits a dead end and turns around.
_ Push 0.
% Try to take modulo, but division by zero fails and the program terminates.
それ以外の場合、入力の残りをチェックし続ける必要があるため、IPは南に進み続けます。{
残りの入力の底部上に引っ張ります。入力を使い果たした場合、これは0
(auxの下部から)となり、IPは南に移動し続けます。
) Increment 0 to 1.
! Print it. The IP hits a dead end and turns around.
) Increment 0 to 1.
{ Pull a zero over from aux, IP keeps moving north.
% Try to take modulo, but division by zero fails and the program terminates.
それ以外の場合、チェックする文字列にはさらに文字があります。IPは西に曲がり、次の(時計回りの)2x2ループに移動します。これは主にノーオペレーションで構成されています。
" No-op.
" No-op.
{ Pull one value over from aux. If it's the bottom of aux, this will be
zero and the IP will leave the loop eastward.
" No-op.
このループの後、最初と最後の文字を除き、先頭にゼロが表示されていることを除いて、メインスタックに再び入力があります。は;
スタックを破棄して0
から=
スタックの先頭=
を交換しますが、ループの最初の部分をキャンセルするだけです。これは、現在別の場所からループに入っているからです。すすぎ、繰り返します。