ラビリンス、28 25 24 23 22バイト
" >
?!?:|}\{@
@\?"":)!
これは非常に楽しかったです!:)これは、これまでに書いた中で最も密に圧縮されたラビリンスプログラムです。私は20バイトと21バイトで非常に多くのバージョンがあり、ほとんど機能していたので、これが最適であることをまだ疑っています...
これは、入力を正の整数のリスト(任意の区切り文字)として受け取り、結果を改行で区切られた整数としてSTDOUTに出力します。
20/21バイトのハント:フォームのすべてのプログラムをチェックしました
" XX
?!?X}\{@
@\?XX)!
どこXブルートフォースによるいかなる合理的なキャラクターですが、任意の有効な解決策を見つけることができませんでした。もちろん、それはより短い解決策が存在しないことを意味しませんが、その構造に関するまともな仮定なしに20バイトのプログラムを強制することはできません。
説明
(説明は少し時代遅れですが、ソリューションが最適であるとはまだ確信していないので、これを更新するのを待ちます。)
そのため、通常、ラビリンスプログラムは迷路のように見えるはずです。命令ポインターは廊下にありますが、その廊下に従います。IPがあらゆる種類のジャンクションに到達すると、方向はラビリンスのメインスタックの最上位値に基づいて決定されます(Labyrinthには2つのスタックがあり、無限にゼロがあります)。それは通常、非自明なループは非常に高価になることを意味します。なぜなら、壁全体に非壁のセルがある場合はすべてがジャンクションであり、ほとんどの場合、スタックの上部にはIPの正しい値がないためですあなたが望む道を辿るために。そこで、ループを拡大して、全体が中央にあり、それぞれ明確に定義された入口と出口がそれぞれ1つだけになるようにします。
でも今回は本当にラッキーだったし、すべてがうまく組み合わさったので、全部まとめて一つにまとめることができた。:)
制御フローは、_南に向かって始まります。_メインスタックにゼロを押します。これは何もしないように見えるかもしれませんが、これにより、1後で必要となる(暗黙ではない)スタックの深さが増加します。
?STDINから整数を読み取ります。読み込む整数がなくなると、ゼロがプッシュされます。その場合、IPは南に移動し続け@、プログラムを直ちに終了します(入力リストが空であるため)。それ以外の場合、IPは東になります。
現在、非常にタイトなループに入り、2つの出口点があります。
!?;
\?
;
!スタックにゼロのみを残して、STDOUTに整数を出力します。IPは東に移動し続け?、次の整数を読み取ります。それがゼロ以外の場合、権利を取得して南に移動します。?別のもの(次の偶数インデックス)を読み取ります。繰り返しますが、それがゼロでない場合は、権利を取得して西に移動します。
次に\、スタックを変更せずに改行を印刷するため、北に移動して別の権利を取得します。!次の偶数インデックスの整数を出力します。スタックに少なくとも1つの(正の)奇数インデックス整数があるので、右に曲がり続けるとループが繰り返されます。
それらのいずれかが?リストの最後に達すると、ゼロをプッシュし、対応する;にまっすぐ移動して、そのゼロを破棄します。
リストに要素が1つしかない場合は(これをすぐに印刷したため)完了です。そのため、IPは東に移動し続け@、再びプログラムを終了します(末尾を印刷します)途中で改行)。
それ以外の場合は、奇数インデックスの整数も印刷する必要があります。その場合、2つのパス(最初のループの2つの出口点から)は中央"でマージされ、どちらの場合でも東になります。
_に0をプッシュして、に左が入らないようにし、そのゼロ@を;破棄します。次に、新しいループに入ります。
"}
""
IPは、左下のセルでこれを入力し、北に移動して、時計回りにループを回ります。}補助スタックの上にメインスタックの最上位にシフトします。スタックにはまだ要素がありますが、IPはその処理を続けます。すべてが補助スタックにシフトされると(およびプロセスで逆になります)、IPは代わりに東に移動し続け、最後のループに入ります。
\{@
#!
\再度ラインフィードを印刷し{、アイテムを補助スタックからメインに戻します。それがまだリストのアイテムであった場合、それはポジティブになり、IPは南になり、そこでアイテムがで印刷され!ます。そして、#スタックの深さをプッシュ(初期は今どこにこれは_重要であり、これがあるため、#正のスタックの深さを保証します)IPはまだを通じて、右折だから、\および{再び。
すべてを印刷した後{、補助スタックの一番下からゼロを取得し、IPは東に進み@、プログラムを終了します。