Brainfuck, 39 33 32 31 octets
-[-[>]<--<--],[[>.<+]>+.--.+<,]
L'algorithme qui place 45 sur la bande est tiré des constantes Brainfuck d' Esolang .
Cette réponse suppose que l'interpréteur du programme de sortie a des cellules enveloppantes et délimitées; et cela,
zéro la cellule actuelle (ce qui implique que le programme de sortie est exécuté sans entrée). Essayez-le en ligne!
Pour une solution (plus longue) qui fonctionne sans condition, voir mon autre réponse .
Essai
Pour l'entrée Code Golf
, la sortie suivante est générée.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Essayez-le en ligne!
Comment ça fonctionne
Nous commençons par mettre l'entier 45 (code de caractère de -
) dans une cellule de la bande. Le code suivant y parvient.
- 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.
]
Avant d'entrer dans la boucle, la bande ressemble à ceci.
v
000 000 255
Ces trois cellules - -2 , -1 et 0 - sont les seules que nous utiliserons dans ce programme.
Dans la première chaque itération de la boucle, la cellule la plus à droite est, puis cette cellule et la cellule du milieu sont décrémentées deux fois, laissant l'état suivant.
v
000 254 252
Dans les 126 itérations suivantes, l'initiale -
décrémente la cellule du milieu, [>]<
saute à la cellule la plus à droite et --<--
décrémente la cellule du milieu et la cellule de droite. Par conséquent, 3 est soustrait de la cellule centrale (modulo 256 ) et 2 est soustrait de la cellule la plus à droite.
Puisque 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 et 252 ÷ 3 = 84 , la cellule la plus à droite est mise à zéro avant celle du milieu, laissant l'état suivant.
v
000 132 000
Comme pour la première itération de la boucle, l'itération suivante soustrait maintenant 3 de la cellule du milieu et 2 de la cellule la plus à gauche, en plaçant la tête sur la cellule la plus à gauche.
v
254 129 000
Les itérations suivantes, comme dans l'itération 126 avant elles, soustraient 3 de la cellule la plus à gauche et 2 de la cellule la plus à droite.
Puisque 254 ÷ 3 (mod 256) = 170 et 129 ÷ 2 (mod 256) n'est pas défini, cela se fait 170 fois, laissant l'état suivant.
v
000 045 000
La cellule sous la tête est nulle; la boucle se termine.
Nous sommes maintenant prêts à générer une sortie.
, 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.