:-:_
Essayez-le en ligne! Dans le pied de page, j'ai inclus toutes les autres solutions à 4 octets. (Stack Cats ignore tout après le premier saut de ligne.)
Essayez l'inverse!
Explication
L’ -n
indicateur active la sortie numérique (et l’entrée, mais nous n’en avons aucune), et l’ -m
indicateur n’est en principe qu’une commodité permettant de jouer au golf, ce qui vous permet d’éviter la partie redondante du code source. En effet, chaque programme Stack Cats doit avoir une symétrie miroir. Avec le -m
drapeau, vous ne lui donnez que la première moitié (plus le personnage central). Le programme actuel est donc le suivant:
:-:_:-:
Comme vous pouvez le constater dans le premier lien TIO, il existe une tonne de solutions à 4 octets, mais j’ai choisi celle-ci pour sa simplicité. Stack Cats est basé sur une pile et ce programme utilise uniquement la pile initiale. Comme nous n’avons aucune entrée, il contient un seul -1
marqueur (un marqueur EOF) au-dessus d’un nombre infini de zéros. Les trois commandes du programme ont la signification suivante:
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
Voici donc comment le programme modifie la pile (les états et les commandes sont décalés pour indiquer comment chaque commande modifie la pile d’un état à l’autre):
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
Il s’avère que la seule commande qui fait vraiment quelque chose ici est celle _
qui transforme notre marqueur EOF en a 1
. La sortie à la fin du programme est implicite, et le marqueur EOF est facultatif, donc cela affiche simplement le1
obtenu.
Maintenant, si nous inversons le code source, en raison de la mise en miroir implicite, le programme actuel devient:
_:-:-:_
Cela fait quelque chose de très différent:
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
Cette fois le bas de la pile est encore un-1
donc il fait office de marqueur EOF et seul -1
le dessus est imprimé.
...
Cela dit, étant donné que Stack Cats a une relation unique avec le code inversé, j’estime que l’utilisation -m
est un peu de la triche. Normalement, il s'agit uniquement d'économiser des octets en omettant la partie redondante du code source, mais ici, le défi est beaucoup plus simple et le programme complet plus court. En effet, inverser un programme complet ne changera le programme que s’il en contient <>[]
, ce qui signifie également que le programme finit par utiliser plusieurs piles (Stack Cats possède en fait une bande de piles où toutes, sauf la première, ne sont remplies). avec des zéros pour commencer). De plus, l'inverser puis simplement échanger les paires <>
et []
, ce qui rend l'exécution toujours symétrique. Le seul moyen de briser cette symétrie est d’utiliser I
ce qui fait -]
ou-[
ou rien selon le signe du haut de la pile. Alors...
*|]I*:*I[|*
Essayez-le en ligne! Le pied de page inclut à nouveau toutes les autres alternatives au même nombre d'octets. Certaines de ces sorties 1 / -1 et d'autres 2 / -2 comme indiqué après chaque programme. J'ai choisi celui-ci pour expliquer un peu au hasard en tant que l'un de ceux qui produisent 2.
Essayez l'inverse!
Explication
Comme je l'ai dit, celui-ci est un peu plus long. Même si nous utilisions la -m
notation pour cela, cela pèserait 6 octets au lieu de 4 ci-dessus.
Les commandes utilisées cette fois-ci:
* Toggle the least significant bit of the top of the stack.
| Reverse the longest non-zero of prefix on this stack.
[] Move one stack to the left/right and take the top of the current stack with you.
I If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
: Swap the top two stack elements.
Le premier programme utilise seulement deux piles. C'est un peu brouillon à faire en ASCII, mais je vais faire de mon mieux. Les crochets indiquent la pile sur laquelle se trouve la tête de lecture et je vais placer les commandes entre chaque paire d'états de pile.
[-1]
… 0 0 …
0 0
… …
*
[-2]
… 0 0 …
0 0
… …
| (does nothing)
]
[-2]
… 0 0 …
0 0
… …
I
[2]
… 0 0 …
0 0
… …
*
[3]
… 0 0 …
0 0
… …
:
[0]
… 3 0 …
0 0
… …
*
[1]
… 3 0 …
0 0
… …
I
[-1]
… 3 0 …
0 0
… …
[
[-1]
… 3 0 …
0 0
… …
|
[ 3]
… -1 0 …
0 0
… …
*
[ 2]
… -1 0 …
0 0
… …
Maintenant, le -1
fait office de marqueur EOF et le2
est imprimé.
L’autre programme est le même jusqu’à ce que le [
. C'est pratiquement le même jusqu'à la seconde I
. Techniquement, nous serons sur une pile différente, mais sans valeurs, elles sont toutes indiscernables. Mais alors la différence entre I[
et I]
finit par compter:
*|[I*:*I
[-1]
… 3 0 0 …
0 0 0
… … …
]
[-1]
… 3 0 0 …
0 0 0
… … …
| (does nothing)
*
[-2]
… 3 0 0 …
0 0 0
… … …
Et cette fois, nous n’avons pas de marqueur EOF, mais le programme affiche toujours le fichier -2
.
-
unique (0x45 = 0b00101101) fonctionne dans Jelly - renvoie-
-1 puisqu'il définit le littéral -1, tandis queṆ
(0xB4 = 0b10110100) donne 1 puisqu'il effectue une non logique de l'entrée implicite de zéro. (Bien sûr, celaṆ
fonctionne aussi bien: p)