Brainfuck, 39 33 32 31 bytes
-[-[>]<--<--],[[>.<+]>+.--.+<,]
O algoritmo que coloca 45 na fita é retirado das constantes Brainfuck de Esolang .
Esta resposta pressupõe que o intérprete do programa de saída tenha células delimitadoras; e isso ,
zera a célula atual (implicando que o programa de saída é executado sem entrada). Experimente online!
Para uma solução (mais longa) que funciona incondicionalmente, veja minha outra resposta .
Execução de teste
Para entrada Code Golf
, a seguinte saída é gerada.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Experimente online!
Como funciona
Começamos colocando o número inteiro 45 (código de caractere de -
) em uma célula da fita. O código a seguir consegue isso.
- Decrement cell 0, setting it to 255.
[ While the cell under the head in non-zero:
[>] Advance to the next zero cell.
<-- Decrement the cell to its left.
<-- Decrement the next cell to the left.
]
Antes de entrarmos no loop, a fita fica assim.
v
000 000 255
Essas três células - -2 , -1 e 0 - são as únicas que usaremos neste programa.
Na primeira cada iteração do loop, a célula mais à direita é, então essa célula e a célula do meio são decrementadas duas vezes, deixando o seguinte estado.
v
000 254 252
Nas próximas 126 iterações, a inicial -
diminui a célula do meio, [>]<
salta para a célula mais à direita e --<--
diminui a célula do meio e a direita. Como resultado, 3 é subtraído da célula do meio (módulo 256 ) e 2 é subtraído da célula mais à direita.
Como 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 e 252 ÷ 3 = 84 , a célula mais à direita é zerada antes da do meio, deixando o seguinte estado.
v
000 132 000
Da mesma forma que a primeira iteração do loop, a próxima iteração agora subtrai 3 da célula do meio e 2 da célula da esquerda, colocando a cabeça na célula da esquerda.
v
254 129 000
As iterações subsequentes, como na iteração 126 anterior, subtraem 3 da célula mais à esquerda e 2 da célula mais à direita.
Como 254 ÷ 3 (mod 256) = 170 e 129 ÷ 2 (mod 256) é indefinido, isso é feito 170 vezes, deixando o seguinte estado.
v
000 045 000
A célula sob a cabeça é zero; o loop termina.
Agora estamos prontos para gerar saída.
, Read a character from STDIN and put it the leftmost cell.
[ While the leftmost cell is non-zero:
[ While the leftmost cell is non-zero:
>. Print the content of the middle cell ('-').
<- Increment the leftmost cell.
] If the leftmost cell held n, the above will print 256 - n minus signs
which, when executed, will put n in cell 0 of the output program.
> Increment the middle cell, setting it to 46 ('.').
. Print its content ('.').
-- Decrement the middle cell twice, setting it to 44 (',').
. Print its content (',').
When executed, since the output program receives no input, the above
will zero cell 0 of the output program.
+ Increment the second cell, setting it back to 45 ('-').
<, Go back to the leftmost cell and read another character from STDIN.
] Once EOF is reached, this will put 0 in the leftmost cell, ending the loop.