-X
Wypróbuj online!
Spróbuj na odwrót!
Wyjaśnienie
Okazuje się, że jest to o wiele łatwiejsze niż poprzednie wyzwanie w Stack Cats. Pełny program (po złożeniu wniosku -m
) tutaj -X-
. X
służy do zamiany stosów po lewej i prawej stronie głowicy taśmy, tzn. nie wpływa w ogóle na początkowy stos, więc możemy go zignorować. Ale wtedy program jest właściwie sprawiedliwy--
(dwukrotnie neguje górę stosu), co nic nie robi.
W przypadku programu odwrotnego zastosowanie -m
daje X-X
. Ponownie X
nic nie robi, więc program jest właściwie sprawiedliwy-
, co neguje górę stosu.
Jedyne inne rozwiązanie 2-bajtowe jest -=
, ale jest praktycznie takie samo. Jedyna różnica polega na tym=
zamienia się tylko wierzchołki sąsiednich stosów, a nie całe stosy.
Ale znowu używanie -m
czuje się trochę jak oszukiwanie, dlatego poniżej znajduje się rozwiązanie, które wykorzystuje w pełni dublowany program.
:I<->I:
Wypróbuj online!
Spróbuj na odwrót!
Wyjaśnienie
Nadal obowiązują rozważania z poprzedniej odpowiedzi : każde poprawne rozwiązanie wymaga użycia sparowanych znaków i I
. Sześć możliwych rozwiązań (zawartych w łączu TIO) jest praktycznie takich samych. -
i _
są równoważne w tym programie i :
mogą być zastąpione przez |
lubT
(które robią to samo dla wejść niezerowych i jednocześnie działają również dla wejść zerowych). Właśnie wybrałem ten do wyjaśnienia, ponieważ jest to najłatwiejsze.
Pamiętaj więc, że początkowy stos zawiera dane wejściowe na górze -1
(na nieskończenie wielu zerach), podczas gdy wszystkie inne stosy wzdłuż taśmy zawierają tylko zera. Stack Cats ma również właściwość polegającą na tym, że żaden program o parzystej długości nic nie robi (pod warunkiem, że się zakończy, ale i tak nie możemy użyć pętli do tego wyzwania). To samo dotyczy oczywiście każdego programu o nieparzystej długości, którego środkowa postać nic nie robi ... zobaczmy:
: 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).
Dlatego druga połowa programu dokładnie cofa pierwszą połowę i ponownie otrzymujemy dane wejściowe na początku -1
.
Program odwrotny to :I>-<I:
. Zobaczmy, jak to zmienia rzeczy:
: 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.