Brainfuck, 39 33 32 31 bytes
-[-[>]<--<--],[[>.<+]>+.--.+<,]
The algorithm that places 45 on the tape is taken from Esolang's Brainfuck constants.
This answer assumes that the output program's interpreter has wrapping, bounded cells; and that ,
zeroes the current cell (implying that the output program is run without input). Try it online!
Koşulsuz çalışan (daha uzun) bir çözüm için diğer cevabıma bakın .
Test sürüşü
Giriş Code Golf
için aşağıdaki çıktı üretilir.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Çevrimiçi deneyin!
Nasıl çalışır
45 tamsayısını (karakter kodu -
) kaset hücresine koyarak başlarız . Aşağıdaki kod bunu başarır.
- 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.
]
Döngüye girmeden önce kaset buna benziyor.
v
000 000 255
Bu üç hücre - -2 , -1 ve 0 - bu programda kullanacağımız tek hücrelerdir .
Döngünün ilk her yinelemesinde, en sağdaki hücre, daha sonra bu hücre ve orta hücre iki kez azaltılır ve aşağıdaki durum bırakılır.
v
000 254 252
Sonraki 126 yinelemede, başlangıç -
orta hücreyi azaltır, [>]<
en sağdaki hücreye atlar ve --<--
orta ve sağ hücreyi azaltır. Sonuç olarak, 3 orta hücreden (modulo 256 ) çıkarılır ve 2 çıkarılır en sağdaki hücreden çıkarılır.
Yana 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 ve ÷ 3 = 84 252 , en sağ hücre aşağıdaki durum bırakarak ortadaki önce sıfırlanır.
v
000 132 000
Benzer şekilde döngünün ilk yineleme için bir sonraki iterasyon hemen çıkarır 3 orta hücreden ve 2 soldaki hücre üzerinde kafa yerleştirilmesi, en soldaki hücreden.
v
254 129 000
Subsequent iterations, as in the 126 iteration before them, subtract 3 from the leftmost cell and 2 from the rightmost cell.
254 ÷ 3 (mod 256) = 170'ten beri and 129 ÷ 2 (mod 256) is undefined, this is done 170 times, leaving the following state.
v
000 045 000
The cell under the head is zero; the loop ends.
Artık çıktı üretmeye hazırız.
, 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.