-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-. Xsł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 -mdaje X-X. Ponownie Xnic 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 -mczuje 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.