-X
Pruébalo en línea!
¡Intenta lo contrario!
Explicación
Resulta que esto es en realidad mucho más fácil que el desafío anterior en Stack Cats. El programa completo (después de aplicar -m
) aquí es -X-
. X
se usa para intercambiar las pilas hacia la izquierda y hacia la derecha del cabezal de la cinta, es decir, no afecta la pila inicial en absoluto, por lo que podemos ignorarlo. Pero entonces el programa es efectivamente solo--
(niega la parte superior de la pila dos veces), lo que no hace nada.
Para el programa inverso, la aplicación -m
da X-X
. Nuevamente, X
no hace nada, por lo que el programa es efectivamente justo -
, lo que niega la parte superior de la pila.
La única otra solución de 2 bytes es -=
, pero es prácticamente la misma. La única diferencia es que =
intercambia solo la parte superior de las pilas adyacentes, no las pilas completas.
Pero, de nuevo, usar se -m
siente un poco como hacer trampa, por lo que a continuación se muestra una solución que utiliza un programa totalmente duplicado.
:I<->I:
Pruébalo en línea!
¡Intenta lo contrario!
Explicación
Las consideraciones de la respuesta anterior aún se aplican : cualquier solución válida debe usar los caracteres emparejados y I
. Las seis soluciones posibles (incluidas en el enlace TIO) son prácticamente todas iguales. -
y _
son equivalentes en este programa, y :
pueden reemplazarse por |
o T
(que hacen lo mismo para las entradas que no son cero y coincidentemente también funcionan para las entradas cero). Acabo de elegir este para explicar porque es más fácil.
Así que recuerde que la pila inicial mantiene la entrada en la parte superior de a -1
(en la parte superior de infinitos ceros) mientras que todas las otras pilas a lo largo de la cinta solo contienen ceros. Stack Cats también tiene la propiedad de que cualquier programa de longitud uniforme no hace nada (siempre que finalice, pero de todos modos no podemos usar bucles para este desafío). Lo mismo es obviamente cierto para cualquier programa de longitud impar cuyo carácter central no hace nada ... veamos:
: 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).
Por lo tanto, la segunda mitad del programa deshace exactamente la primera mitad y terminamos con la entrada en la parte superior de una -1
vez más.
El programa inverso es :I>-<I:
. Veamos cómo eso cambia las cosas:
: 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.