-X
Essayez-le en ligne!
Essayez l'inverse!
Explication
Il s'avère que c'est en réalité beaucoup plus facile que le défi précédent dans Stack Cats. Le programme complet (après application -m
) est ici -X-
. X
est utilisé pour échanger les piles gauche et droite de la tête de bande, c’est-à-dire que cela n’affecte en rien la pile initiale, nous pouvons donc l’ignorer. Mais alors, le programme est effectivement juste --
(annule le haut de la pile deux fois), ce qui ne fait rien.
Pour le programme inverse, appliquer -m
donne donne X-X
. Encore une fois, X
ne fait rien, donc le programme est effectivement juste -
, ce qui annule le sommet de la pile.
La seule autre solution à 2 octets est -=
, mais c'est pratiquement la même chose. La seule différence est que =
seuls les sommets des piles adjacentes sont échangés, et non les piles entières.
Mais encore une fois, utiliser -m
est un peu comme tricher, voici donc une solution qui utilise un programme totalement en miroir.
:I<->I:
Essayez-le en ligne!
Essayez l'inverse!
Explication
Les considérations de la réponse précédente sont toujours valables : toute solution valable doit utiliser les caractères et les paires I
. Les six solutions possibles (incluses dans le lien TIO) sont pratiquement les mêmes. -
et _
sont équivalents dans ce programme, et :
peuvent être remplacés par |
ou T
(qui font la même chose pour des entrées non nulles et qui fonctionnent également pour des entrées nulles). Je viens de choisir celui-ci pour expliquer parce que c'est le plus facile.
Donc, rappelez-vous que la pile initiale contient l’entrée au-dessus d’un -1
nombre infini de zéros, alors que toutes les autres piles de la bande ne contiennent que des zéros. Stack Cats a également pour caractéristique que tout programme de longueur égale ne fait rien (à condition qu'il se termine, mais nous ne pouvons pas utiliser de boucles pour ce défi de toute façon). La même chose est alors évidemment vraie pour tout programme de longueur impaire dont le personnage central ne fait rien ... voyons:
: 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).
Par conséquent, la seconde moitié du programme annule exactement la première moitié et nous nous retrouvons à nouveau avec l'entrée -1
.
Le programme inverse est :I>-<I:
. Voyons comment cela change les choses:
: 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.