Стек кошек N % Push number of elements in the stack: 0
q % Subtract 1: gives -1
v % Concatenate stack contents vertically: leaves -1 as is
% Implicit display stack contents
, 4 bytes
Nqv
Попробуйте онлайн! В нижний колонтитул я включил все остальные 4-байтовые решения. (Stack Cats игнорирует все после первого перевода строки.)
Попробуйте наоборот!
Объяснение
W e# Push -1
; e# Delete
1 e# Push 1
e# Implicit display
flag turns on numeric output (and input, but we don't have any), and the W;1
flag обычно является просто удобством игры в гольф, позволяющим избежать избыточной части исходного кода. Это связано с тем, что каждая программа Stack Cats должна иметь зеркальную симметрию. С u8
flag you only give it the first half (plus the central character). So the действительный программа вот:
exit -127
Как вы можете видеть по первой ссылке TIO, существует множество 4-байтовых решений, но я выбрал это из-за его простоты. Stack Cats основан на стеке, и эта программа использует только начальный стек. Поскольку у нас нет никаких входных данных, он содержит один 127
(an EOF marker) on top of an infinite well of zeros. The three commands in the program have the following meaning:
721- nruter
Итак, вот как программа изменяет стек (состояния и команды расположены в шахматном порядке, чтобы указать, как каждая команда меняет стек из одного состояния в другое):
return -127
Как оказалось, единственная команда, которая действительно что-то здесь делает, это <<<2 # 2-<<<
which turns our EOF marker into a a
. Вывод в конце программы неявный, а маркер EOF необязателен, поэтому просто распечатывается Forward: | Backward:
|
c b | a @
@ a . | b c .
. . | . .
we get.
Теперь, если мы перевернум исходный код, из-за неявного зеркалирования реальная программа будет выглядеть так:
a@bc
Это делает что-то совсем другое:
;
На этот раз нижняя часть стека является все еще !
so it does act as the EOF marker and only the :
поверх него печатается.
...
Теперь, учитывая все вышесказанное, поскольку Stack Cats имеет такое уникальное отношение к реверсированию кода, я считаю, что использование @
is a little cheating. It's normally only meant to save bytes by omitting the redundant part of the source code, but here it actually makes the challenge a lot easier and even the full program shorter. This is because reversing a full program will only change the program if it contains any of 1!@!(
, что также означает, что программа в конечном итоге использует несколько стеков (Stack Cats на самом деле имеет ленту стеков, где все, кроме начального, с самого начала заполняются только нулями). Кроме того, его изменение просто меняет местами ¯1
and 1
пары, что по-прежнему делает исполнение симметричным. Единственный способ нарушить эту симметрию — использовать 1-0
which does 1@ɩ
или 1
or nothing depending on the sign of the top of the stack. So...
2-1
Попробуйте онлайн! Нижний колонтитул снова включает в себя все остальные альтернативы с тем же количеством байтов. Некоторые из них выводят 1/-1, а некоторые 2/-2, как указано после каждой программы. Я выбрал этот вариант для объяснения случайно, как один из тех, которые выводят 2.
Попробуйте наоборот!
Объяснение
Как я уже сказал, этот немного длиннее. Даже если бы мы использовали -1
notation for this, it would weigh in at 6 bytes instead of the above 4.
На этот раз используются команды:
N
Первая программа использует только два стека. Это немного грязно делать в ASCII-изображении, но я постараюсь изо всех сил. Квадратные скобки указывают, в каком стеке находится головка ленты, и я помещаю команды между каждой парой состояний стека.
1
Теперь 1-0
acts as an EOF marker and the C
печатается.
Другая программа аналогична до тех пор, пока CN
. It's still virtually the same all the way until the second 1
. Технически мы будем в другом стеке, но без значений в них все они неотличимы. Но тогда разница между 1-0
and C
в конечном итоге имеет значение:
0
И на этот раз у нас нет маркера EOF, но программа все равно выводит N
.