Brainfuck, 39 33 32 31 byte
-[-[>]<--<--],[[>.<+]>+.--.+<,]
L'algoritmo che posiziona 45 sul nastro è preso dalle costanti Brainfuck di Esolang .
Questa risposta presuppone che l'interprete del programma di output abbia delle celle avvolgenti e limitate; e che ,
azzera la cella corrente (implicando che il programma di output viene eseguito senza input). Provalo online!
Per una soluzione (più lunga) che funziona incondizionatamente, vedi la mia altra risposta .
Prova
Per l'input Code Golf
, viene generato il seguente output.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Provalo online!
Come funziona
Iniziamo inserendo l'intero 45 (codice carattere di -
) in una cella del nastro. Il seguente codice ottiene questo.
- 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.
]
Prima di entrare nel loop, il nastro appare così.
v
000 000 255
Queste tre celle - -2 , -1 e 0 - sono le uniche che utilizzeremo in questo programma.
Nella prima di ogni iterazione del ciclo, la cella più a destra è, quindi quella cella e la cella centrale vengono decrementate due volte, lasciando il seguente stato.
v
000 254 252
Nelle successive 126 iterazioni, l'iniziale -
decrementa la cella centrale, [>]<
salta alla cella più a destra e --<--
decrementa la cella centrale e destra. Di conseguenza, 3 viene sottratto dalla cella centrale (modulo 256 ) e 2 viene sottratto dalla cella più a destra.
Poiché 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 e 252 ÷ 3 = 84 , la cella più a destra viene azzerata prima di quella centrale, lasciando il seguente stato.
v
000 132 000
Analogamente alla prima iterazione del ciclo, la successiva iterazione ora sottrae 3 dalla cella centrale e 2 dalla cella più a sinistra, posizionando la testa sulla cella più a sinistra.
v
254 129 000
Le iterazioni successive, come nell'iterazione 126 precedente, sottraggono 3 dalla cella più a sinistra e 2 dalla cella più a destra.
Poiché 254 ÷ 3 (mod 256) = 170 e 129 ÷ 2 (mod 256) non sono definiti, questo viene fatto 170 volte, lasciando il seguente stato.
v
000 045 000
La cella sotto la testa è zero; il ciclo termina.
Ora siamo pronti per generare output.
, 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.