-X
Спробуйте в Інтернеті!
Спробуйте навпаки!
Пояснення
Виявляється, це насправді набагато простіше, ніж попередній виклик у Stack Cats. Повна програма (після подачі заявки -m
) тут є -X-
. X
використовується для заміни стеків ліворуч та праворуч від головки стрічки, тобто вона взагалі не впливає на початковий стек, тому ми можемо її ігнорувати. Але тоді програма ефективно просто --
(заперечуйте верхню частину стека двічі), що нічого не робить.
Для зворотної програми подання -m
подає X-X
. Знову ж таки, X
нічого не робить, тому програма ефективно справедлива -
, що заперечує верхню частину стека.
Єдине інше 2-байтове рішення є -=
, але воно практично те саме. Єдина відмінність полягає в тому, що =
підміняються тільки вершини сусідніх стеків, а не всі стеки.
Але знову ж таки, використання -m
виглядає трохи схожим на обман, тому нижче - рішення, яке використовує повністю дзеркальну програму.
:I<->I:
Спробуйте в Інтернеті!
Спробуйте навпаки!
Пояснення
Міркування з попередньої відповіді все ще застосовуються : будь-яке дійсне рішення потребує використання парних символів та I
. Шість можливих рішень (включених у посилання TIO) практично однакові. -
і _
еквівалентні в цій програмі, і :
може бути замінено |
або T
(що те ж саме для ненульових входів і по збігу також робота для нульових входів). Я щойно вибрав це для пояснення, тому що це найпростіше.
Тому пам’ятайте, що початковий стек утримує вкладку зверху -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.