-X
Probieren Sie es online!
Versuchen Sie das Gegenteil!
Erläuterung
Es stellt sich heraus, dass dies viel einfacher ist als die vorherige Herausforderung in Stack Cats. Das vollständige Programm (nach der Bewerbung -m
) finden Sie hier -X-
. X
wird verwendet, um die Stapel links und rechts vom Bandkopf zu vertauschen, dh, der ursprüngliche Stapel wird überhaupt nicht beeinflusst, sodass wir ihn ignorieren können. Aber dann ist das Programm effektiv gerecht--
(negieren Sie die Oberseite des Stapels zweimal), was nichts tut.
Für das inverse Programm Anwendung -m
gibt X-X
. Wieder X
tut nichts, so ist das Programm effektiv nur -
, was die Oberseite des Stapels negiert.
Die einzige andere 2-Byte-Lösung ist -=
, aber es ist praktisch das gleiche. Der einzige Unterschied besteht darin, dass =
nur die Oberseiten der benachbarten Stapel ausgetauscht werden, nicht die gesamten Stapel.
Aber auch hier -m
fühlt sich das Verwenden ein bisschen wie Schummeln an. Im Folgenden finden Sie eine Lösung, die ein vollständig gespiegeltes Programm verwendet.
:I<->I:
Probieren Sie es online!
Versuchen Sie das Gegenteil!
Erläuterung
Die Überlegungen aus der vorherigen Antwort gelten weiterhin : Für jede gültige Lösung müssen die gepaarten Zeichen und verwendet werden I
. Die sechs möglichen Lösungen (im TIO-Link enthalten) sind praktisch alle gleich. -
und _
sind in diesem Programm äquivalent und :
können durch |
oder ersetzt werden T
(die dasselbe für Nicht-Null-Eingänge tun und zufällig auch für Null-Eingänge funktionieren). Ich habe gerade dieses ausgewählt, um zu erklären, weil es am einfachsten ist.
Denken Sie also daran, dass der Anfangsstapel die Eingabe über a -1
(über unendlich viele Nullen) hält, während alle anderen Stapel auf dem Band nur Nullen enthalten. Stack Cats hat auch die Eigenschaft, dass jedes Programm mit gerader Länge nichts tut (vorausgesetzt, es wird beendet, aber wir können für diese Herausforderung ohnehin keine Schleifen verwenden). Dasselbe gilt dann natürlich auch für Programme ungerader Länge, deren zentrales Zeichen nichts bewirkt ... mal sehen:
: 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).
Daher macht die zweite Hälfte des Programms genau die erste Hälfte rückgängig und wir haben die Eingabe wieder oben auf einem -1
.
Das inverse Programm ist :I>-<I:
. Mal sehen, wie sich die Dinge ändern:
: 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.