-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.