Brainfuck, 39 33 32 31 Bytes
-[-[>]<--<--],[[>.<+]>+.--.+<,]
Der Algorithmus, der 45 auf das Band legt, wird aus Esolangs Brainfuck-Konstanten entnommen .
Diese Antwort setzt voraus, dass der Interpreter des Ausgabeprogramms umschließende, begrenzte Zellen hat. und das setzt ,
die aktuelle Zelle auf Null (was bedeutet, dass das Ausgabeprogramm ohne Eingabe ausgeführt wird). Probieren Sie es online!
Eine (längere) Lösung, die bedingungslos funktioniert, finden Sie in meiner anderen Antwort .
Testlauf
Für die Eingabe Code Golf
wird die folgende Ausgabe generiert.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Probieren Sie es online!
Wie es funktioniert
Wir beginnen damit, die Ganzzahl 45 (Zeichencode von -
) in eine Zelle des Bandes zu schreiben. Der folgende Code erreicht dies.
- 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.
]
Bevor wir in die Schleife eintreten, sieht das Band so aus.
v
000 000 255
Diese drei Zellen - -2 , -1 und 0 - sind die einzigen, die wir in diesem Programm verwenden.
In der ersten Iteration der Schleife ist die Zelle ganz rechts, dann werden diese Zelle und die mittlere Zelle zweimal dekrementiert, wobei der folgende Zustand verbleibt.
v
000 254 252
In den nächsten 126 Iterationen -
dekrementiert der Anfang die mittlere Zelle, [>]<
springt zur Zelle ganz rechts und --<--
dekrementiert die mittlere und die rechte Zelle. Infolgedessen wird 3 von der mittleren Zelle (Modulo 256 ) und 2 von der Zelle ganz rechts subtrahiert.
Da 254 ≤ 3 (mod 256) = (254 + 256) ≤ 3 = 510 ≤ 3 = 170 und 252 ≤ 3 = 84 ist , wird die Zelle ganz rechts vor der mittleren auf Null gesetzt, wodurch der folgende Zustand verbleibt.
v
000 132 000
Ähnlich wie bei der ersten Iteration der Schleife werden bei der nächsten Iteration nun 3 von der mittleren Zelle und 2 von der Zelle ganz links subtrahiert , wobei der Kopf auf die Zelle ganz links gelegt wird.
v
254 129 000
Nachfolgende Iterationen subtrahieren, wie in der vorhergehenden Iteration 126, 3 von der Zelle ganz links und 2 von der Zelle ganz rechts.
Da 254 ≤ 3 (mod 256) = 170 und 129 ≤ 2 (mod 256) undefiniert ist, wird dies 170 Mal durchgeführt, wobei der folgende Zustand verbleibt.
v
000 045 000
Die Zelle unter dem Kopf ist Null; Die Schleife endet.
Jetzt können wir die Ausgabe generieren.
, 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.