Brainfuck, 39 33 32 31 bytes
-[-[>]<--<--],[[>.<+]>+.--.+<,]
El algoritmo que coloca 45 en la cinta se toma de las constantes Brainfuck de Esolang .
Esta respuesta supone que el intérprete del programa de salida tiene celdas ajustadas y ajustadas; y eso ,
pone a cero la celda actual (lo que implica que el programa de salida se ejecuta sin entrada). Pruébalo en línea!
Para una solución (más larga) que funcione incondicionalmente, vea mi otra respuesta .
Prueba de funcionamiento
Para la entrada Code Golf
, se genera la siguiente salida.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Pruébalo en línea!
Cómo funciona
Comenzamos colocando el número entero 45 (código de caracteres de -
) en una celda de la cinta. El siguiente código logra esto.
- 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 entrar en el bucle, la cinta se ve así.
v
000 000 255
Estas tres celdas, -2 , -1 y 0 , son las únicas que usaremos en este programa.
En la primera cada iteración del bucle, la celda más a la derecha es, luego esa celda y la celda central se disminuyen dos veces, dejando el siguiente estado.
v
000 254 252
En las siguientes 126 iteraciones, la inicial -
disminuye la celda del medio, [>]<
salta a la celda más a la derecha y --<--
disminuye la celda del medio y la derecha. Como resultado, 3 se resta de la celda central (módulo 256 ) y 2 se resta de la celda más a la derecha.
Desde 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 y 252 ÷ 3 = 84 , la celda más a la derecha se pone a cero antes que la del medio, dejando el siguiente estado.
v
000 132 000
De manera similar a la primera iteración del bucle, la siguiente iteración ahora resta 3 de la celda central y 2 de la celda más a la izquierda, colocando la cabeza en la celda más a la izquierda.
v
254 129 000
Las iteraciones posteriores, como en la iteración 126 anterior, restan 3 de la celda más a la izquierda y 2 de la celda más a la derecha.
Como 254 ÷ 3 (mod 256) = 170 y 129 ÷ 2 (mod 256) no está definido, esto se hace 170 veces, dejando el siguiente estado.
v
000 045 000
La celda debajo de la cabeza es cero; El bucle termina.
Ahora estamos listos para generar resultados.
, 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.