:?
:
#/)
\ #
!"*@
"
オンラインでお試しください!
これは、C, B, A
改行で区切られた順序で結果を出力します。
説明
いつものように、短いラビリンスプライマー:
- Labyrinthには、mainとaux(iliary)の任意精度整数の2つのスタックがあり、最初は(暗黙の)無限量のゼロで埋められます。この回答にはmainのみを使用します。
- ソースコードは迷路に似ており、指示ポインター(IP)が可能な場合(コーナーの周りであっても)廊下をたどります。コードは、読み取り順序の最初の有効な文字、つまりこの場合は左上隅から始まります。IPが何らかの形式のジャンクション(つまり、元のセルに加えていくつかの隣接セル)に到達すると、メインスタックの最上部に基づいて方向を選択します。基本的なルールは次のとおりです。負の場合は左に曲がり、ゼロの場合は先に進み、正の場合は右に曲がります。そして、壁があるためにこれらのいずれかが不可能な場合、IPは反対方向を取ります。IPは、行き止まりに到達したときにも向きを変えます。
"
レイアウトを少し無駄にする2つのノーオペレーション()にもかかわらず、実際には制御フローが非常に微妙なので、このソリューションには非常に満足しています。
IPは、:
右上の左上隅から始まります。すぐに行き止まりになり?
、向きを変えるので、プログラムは実際に次のコードの線形部分で開始します。
: Duplicate top of main stack. This will duplicate one of the implicit zeros
at the bottom. While this may seem like a no-op it actually increases
the stack depth to 1, because the duplicated zero is *explicit*.
? Read n and push it onto main.
: Duplicate.
: Duplicate.
これはn
、メインスタックに3つのコピーがあることを意味しますが、その深さは4
です。これは、入力のコピーを処理しながら、スタックの深さが現在の乗数を取得できることを意味するため、便利です。
IPは(時計回りの)3x3ループに入ります。注意#
スタックの深さをプッシュするには、常に我々はIPは常にこの時点で東になります知っているように正の値をプッシュします。
ループ本体は次のとおりです。
# Push the stack depth, i.e. the current multiplier k.
/ Compute n / k (rounding down).
) Increment.
# Push the stack depth again (this is still k).
* Multiply. So we've now computed (n/k+1)*k, which is the number
we're looking for. Note that this number is always positive so
we're guaranteed that the IP turns west to continue the loop.
" No-op.
! Print result. If we've still got copies of n left, the top of the
stack is positive, so the IP turns north and does another round.
Otherwise, see below...
\ Print a linefeed.
Then we enter the next loop iteration.
ループを!
3回(最大)通過した後、のすべてのコピーがn
使い果たされ、その下のゼロが表示されます。ために"
(それ以外はかなり役に立たないと思われる)下部のこの位置は、接合部です。つまり、スタックの先頭にゼロがあると、IPは真っ直ぐ(西)に行こうとしますが、壁があるため実際には180度回転し、行き止まりに当たったかのように東に戻ります。
その結果、次のビットが実行されるようになりました。
" No-op.
* Multiply two zeros on top of the stack, i.e. also a no-op.
The top of the stack is now still zero, so the IP keeps moving east.
@ Terminate the program.
C B A
回答で結果が明確に指定されている場合、結果を異なる順序(例)で(一貫して)出力できますか?