-X
オンラインでお試しください!
逆にしてみてください!
説明
実際、これは以前のStack Catsの課題よりもはるかに簡単です。完全なプログラム(適用後-m
)はこちらです-X-
。X
は、テープヘッドの左右のスタックを交換するために使用されます。つまり、最初のスタックにはまったく影響しないため、無視できます。しかし、その後、プログラムは効果的にちょうど--
(スタックのトップを2回無効にする)だけであり、何もしません。
逆プログラムの場合、適用すると-m
が得られX-X
ます。繰り返しますが、X
何もしませんので、プログラムは事実上just -
であり、スタックのトップを無効にします。
他の2バイトソリューションはのみですが-=
、それは実質的に同じです。唯一の違いは、=
スタック全体ではなく、隣接するスタックの最上部のみをスワップすることです。
しかし、繰り返しますが、使用-m
は不正行為のように感じられるため、以下は完全にミラー化されたプログラムを使用するソリューションです。
:I<->I:
オンラインでお試しください!
逆にしてみてください!
説明
注意事項前の回答からは、まだ適用されます:任意の有効な解決策は、一対の文字を使用する必要があるとI
。6つの可能なソリューション(TIOリンクに含まれる)はすべてほぼ同じです。-
そして_
、このプログラムでは同等であり、かつ:
置き換えることができ|
たりT
(非ゼロ入力でも同じように機能し、偶然にもゼロ入力でも機能します)。これが最も簡単だから、説明のためにこれを選んだ。
したがって、最初のスタックは入力をaの上-1
(無限に多くのゼロの上)に保持するのに対し、テープに沿った他のすべてのスタックはゼロのみを保持することに注意してください。Stack Catsには、偶数の長さのプログラムは何も実行しないという性質もあります(終了した場合は、このチャレンジにループを使用することはできません)。同じことが、中央の文字が何もしない奇数長のプログラムにも明らかに当てはまります...見てみましょう:
: Swap the input with the -1 below.
I Move the -1 one stack to the left and turn it into +1.
< Move another stack left (without taking the value).
- Negate the zero on top of that stack (i.e. do nothing).
したがって、プログラムの後半部分は前半部分を正確に元に戻し、最終的に-1
再び入力が行われます。
逆プログラムは:I>-<I:
です。それが物事をどのように変えるか見てみましょう:
: Swap the input with the -1 below.
I Move the -1 one stack to the left and turn it into +1.
> Move one stack right, i.e. back onto the initial stack which still holds the input.
- Negate the input.
< Move back to the left where we've parked the 1.
I Move that 1 back onto the initial stack and turn it back into a -1.
: Swap the -1 below the negated input to act as an EOF marker.