Brainfuck, 39 33 32 31 bajtów
-[-[>]<--<--],[[>.<+]>+.--.+<,]
Algorytm, który umieszcza 45 na taśmie jest pobierany ze stałych Brainfuck Esolanga .
Ta odpowiedź zakłada, że interpreter programu wyjściowego ma zawijane, ograniczone komórki; i to ,
zeruje bieżącą komórkę (co oznacza, że program wyjściowy jest uruchamiany bez danych wejściowych). Wypróbuj online!
Aby uzyskać (dłuższe) rozwiązanie, które działa bezwarunkowo, zobacz moją drugą odpowiedź .
Testowe uruchomienie
Dla danych wejściowych Code Golf
generowane są następujące dane wyjściowe.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Wypróbuj online!
Jak to działa
Zaczynamy od podania liczby całkowitej 45 (kod znaku -
) w komórce taśmy. Poniższy kod osiąga to.
- 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.
]
Zanim wejdziemy w pętlę, taśma wygląda następująco.
v
000 000 255
Te trzy komórki - -2 , -1 i 0 - są jedynymi, których użyjemy w tym programie.
W pierwszej każdej iteracji pętli najbardziej prawą komórką jest, następnie komórka i środkowa komórka są dwukrotnie zmniejszane, pozostawiając następujący stan.
v
000 254 252
W następnych 126 iteracjach początkowy -
zmniejsza komórkę środkową, [>]<
przeskakuje do komórki znajdującej się najbardziej na prawo i --<--
zmniejsza komórkę środkową i prawą. W rezultacie 3 odejmuje się od środkowej komórki (modulo 256 ) i 2 jest odejmowane od prawej komórki.
Ponieważ 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 i 252 ÷ 3 = 84 , skrajna prawa komórka jest zerowana przed środkową, pozostawiając następujący stan.
v
000 132 000
Podobnie jak w pierwszej iteracji pętli, kolejna iteracja odejmuje teraz 3 od środkowej komórki i 2 od lewej komórki, umieszczając głowę na lewej komórce.
v
254 129 000
Kolejne iteracje, podobnie jak w iteracji 126 przed nimi, odejmij 3 od komórki skrajnie lewej i 2 od komórki skrajnie prawej.
Ponieważ 254 ÷ 3 (mod 256) = 170 i 129 ÷ 2 (mod 256) jest niezdefiniowany, odbywa się to 170 razy, pozostawiając następujący stan.
v
000 045 000
Komórka pod głową ma zero; pętla się kończy.
Teraz jesteśmy gotowi do generowania wyników.
, 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.