:-:_
Experimente online! No rodapé, incluí todas as outras soluções de 4 bytes. (Stack Cats ignora tudo após o primeiro avanço de linha.)
Tente o contrário!
Explicação
O -n
sinalizador ativa a saída numérica (e a entrada, mas não temos nenhum), e -m
normalmente é apenas uma conveniência de golfe que permite evitar a parte redundante do código-fonte. Isso ocorre porque todo programa Stack Cats precisa ter simetria espelhada. Com a -m
bandeira, você só dá a primeira metade (mais o caractere central). Portanto, o programa atual aqui é:
:-:_:-:
Como você pode ver no primeiro link do TIO, há várias soluções de 4 bytes, mas eu escolhi essa por sua simplicidade. Stack Cats é baseado em pilha, e este programa usa apenas a pilha inicial. Como não temos nenhuma entrada, ela contém uma única -1
(um marcador EOF) em cima de um poço infinito de zeros. Os três comandos no programa têm o seguinte significado:
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
Então, aqui está como o programa modifica a pilha (estados e comandos são escalonados para indicar como cada comando altera a pilha de um estado para o próximo):
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
Como se vê, o único comando que realmente faz alguma coisa aqui é _
que transforma nosso marcador EOF em um 1
. A saída no final do programa está implícita, e o marcador EOF é opcional, portanto, apenas imprime o 1
que obtemos.
Agora, se revertermos o código fonte, devido ao espelhamento implícito, o programa atual se tornará:
_:-:-:_
Isso faz algo muito diferente:
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
Desta vez, a parte inferior da pilha ainda é uma -1
e, portanto, atua como marcador EOF e apenas o-1
parte superior é impressa.
...
Agora, com tudo isso dito, como o Stack Cats tem uma relação única com a reversão de código, sinto que usar -m
é um pouco trapaceiro. Normalmente, ele serve apenas para salvar bytes, omitindo a parte redundante do código-fonte, mas aqui isso torna o desafio muito mais fácil e até o programa completo, mais curto. Isso ocorre porque a reversão de um programa completo só mudará o programa se ele contiver algum <>[]
, o que também significa que o programa acaba fazendo uso de várias pilhas (a Stack Cats na verdade possui uma fita de pilhas, onde todas, exceto a inicial, são preenchidas apenas com zeros para começar). Além disso, revertê-lo apenas troca os pares <>
e []
, o que ainda torna a execução simétrica. A única maneira de quebrar essa simetria é usarI
que faz-]
ou-[
ou nada, dependendo do sinal do topo da pilha. Tão...
*|]I*:*I[|*
Experimente online! O rodapé novamente inclui todas as outras alternativas na mesma contagem de bytes. Alguns deles emitem 1 / -1 e outros 2 / -2, conforme indicado após cada programa. Eu escolhi este para explicar de forma aleatória como um dos que produzem 2.
Tente o contrário!
Explicação
Como eu disse, este é um pouco mais. Mesmo se usássemos o-m
notação para isso, ela pesaria 6 bytes em vez dos 4 acima.
Os comandos em uso desta vez:
* 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.
O primeiro programa usa apenas duas pilhas. Isso é um pouco bagunçado na arte ASCII, mas vou tentar o meu melhor. Os colchetes indicam em qual pilha a cabeça da fita está e eu colocarei os comandos entre cada par de estados da pilha.
[-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
… …
Agora, -1
atua como um marcador EOF e o2
é impresso.
O outro programa é o mesmo até o [
. Ainda é praticamente o mesmo até o segundo I
. Tecnicamente, estaremos em uma pilha diferente, mas sem valores neles, eles são todos indistinguíveis. Mas então a diferença entre I[
e I]
acaba importando:
*|[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
… … …
E desta vez, não temos um marcador EOF, mas o programa ainda gera o -2
.
-
(0x45 = 0b00101101) trabalha no Jelly --
gera -1, pois define o literal -1, enquantoṆ
(0xB4 = 0b10110100) gera 1, pois executa uma lógica não da entrada implícita de zero. (É claro queṆ
funciona tão bem quanto: p)