+(+"#(!@
: :
%2_,
オンラインでお試しください!この答えは、@MartinBüttnerとのコラボレーションの結果です。
説明
通常のラビリンス入門書(「通常」と言いますが、実際に毎回これを書き換えます):
- Labyrinthはスタックベースの2D言語で、最初の有効な文字(ここでは左上)から実行が開始されます。各ジャンクションで、命令ポインタが通る可能性のあるパスが2つ以上ある場合、スタックの最上部をチェックして次に進むべき場所を決定します。負は左に、ゼロは前進、正は右に曲がります。
- スタックは底なしでゼロで埋められているため、空のスタックからポップしてもエラーにはなりません。
- ソースコードの数字は、対応する数字をプッシュしません。代わりに、スタックの一番上をポップしてプッシュし
n*10 + <digit>
ます。これにより、多数を簡単に構築できます。新しい番号を開始するには_
、ゼロをプッシュするを使用します。
ゴルフの目的のために、メインループは2つのタスクを1つに結合するため、このコードは少し奇妙です。最初のパスの前半では、次のことが行われます。
+(+ Add two zeroes, decrement, add with zero
This leaves -1 on the stack
" NOP at a junction. -1 is negative so we try to turn left, fail, and
turn right instead.
: Duplicate -1
スタックの先頭が-1で初期化されたので、実際の処理を開始できます。メインループの機能は次のとおりです。
, Read a byte of input
_2% Take modulo 2.
:+ Duplicate and add, i.e. double
( Decrement
This maps "(" -> -1, ")" -> 1
+ Add to running total
" NOP at a junction. Go forward if zero, otherwise turn right.
: Duplicate the top of the stack
最後の複製は、実行するすべての反復に対して要素をスタックに追加します。これは重要です。なぜなら、ゼロをヒットしてNOPに進むと、次のようになるからです。
# Push stack depth
( Decrement
! Output as num
@ Terminate