Brainfuck, 39 33 32 31 byte
-[-[>]<--<--],[[>.<+]>+.--.+<,]
Algoritma yang menempatkan 45 pada rekaman itu diambil dari konstanta Brainfuck Esolang .
Jawaban ini mengasumsikan bahwa interpreter program keluaran memiliki sel pembungkus dan terikat; dan itu,
nol sel saat ini (menyiratkan bahwa program output dijalankan tanpa input). Cobalah online!
Untuk solusi (lebih lama) yang berfungsi tanpa syarat, lihat jawaban saya yang lain .
Uji coba
Untuk input Code Golf
, output berikut dihasilkan.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Cobalah online!
Bagaimana itu bekerja
Kita mulai dengan meletakkan integer 45 (kode karakter -
) ke dalam sel rekaman. Kode berikut mencapai ini.
- 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.
]
Sebelum kita memasuki loop, rekaman itu terlihat seperti ini.
v
000 000 255
Tiga sel ini - -2 , -1 , dan 0 - adalah satu-satunya yang akan kita gunakan dalam program ini.
Dalam setiap iterasi pertama dari loop, sel paling kanan adalah, kemudian sel dan sel tengah dikurangi dua kali, meninggalkan keadaan berikut.
v
000 254 252
Dalam 126 iterasi berikutnya, awal -
mengurangi sel tengah, [>]<
melompat ke sel paling kanan, dan --<--
mengurangi tengah dan sel kanan. Akibatnya, 3 dikurangi dari sel tengah (modulo 256 ) dan 2 dikurangkan dari sel paling kanan.
Karena 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 dan 252 ÷ 3 = 84 , sel yang paling kanan adalah nol sebelum yang tengah, meninggalkan keadaan berikut.
v
000 132 000
Demikian pula dengan iterasi pertama loop, iterasi berikutnya sekarang mengurangi 3 dari sel tengah dan 2 dari sel paling kiri, menempatkan kepala di sel paling kiri.
v
254 129 000
Iterasi berikutnya, seperti pada iterasi 126 sebelum mereka, kurangi 3 dari sel paling kiri dan 2 dari sel paling kanan.
Karena 254 ÷ 3 (mod 256) = 170 dan 129 ÷ 2 (mod 256) tidak terdefinisi, ini dilakukan 170 kali, meninggalkan status berikut.
v
000 045 000
Sel di bawah kepala adalah nol; loop berakhir.
Sekarang kita siap untuk menghasilkan keluaran.
, 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.