|>I|
Experimente online!
Experimente invertido!
Isso funciona para todas as entradas que não contêm bytes nulos.
Explicação
Uau, cheguei ao ponto em que estou escrevendo isso à mão ...
O programa completo é |>I|I<|
.
| Reverse the entire stack down to the EOF marker -1 (since there are no zeros in the input).
> Move one stack over to the right (which only contains zeros).
I Does nothing on zero.
| Does nothing on zero.
I Does nothing on zero.
< Move back to the initial stack.
| Reverse the input once more.
Como na solução do desafio anterior, já que o comando central |
não faz nada, o mesmo ocorre com o programa inteiro.
O programa invertido é então |I>|<I|
.
| Reverse the entire stack down to the EOF marker -1 (since there are no zeros in the input).
I Move the -1 one stack to the left and turn it into a +1.
> Move back to the initial stack.
| Reverse it again, but this time without the EOF marker.
< Move back to the left.
I Move the +1 back onto the initial stack and turn it into a -1 again.
| Reverse the entire stack. We now have the -1 as an EOF marker again at the bottom
and the rest of the stack has been reversed three times, i.e. one net reversal.
Curiosamente, se usarmos esse programa de reversão sem -m
ainda obter uma solução funcional dessa vez, os únicos bytes adicionais incorridos pela omissão -m
são os que obtemos ao espelhar o código.
|I<|>I|
Experimente online!
Experimente invertido!
Explicação
A versão invertida deste programa é |I>|<I|
a mesma que acima, para que possamos ignorá-la. Mas a versão não revertida é diferente. Como o <>
ponto agora é o contrário, o comando central acaba sem fazer nada, então o programa se torna um gato:
| Reverse the entire stack down to the EOF marker -1 (since there are no zeros in the input).
I Move the -1 one stack to the left and turn it into a +1.
< Move another stack to the left, which contains only zeros.
| Does nothing on zero.
E assim, >I|
desfaça exatamente a primeira metade do programa.