Brainfuck, 39 33 32 31 байт
-[-[>]<--<--],[[>.<+]>+.--.+<,]
Алгоритм, который размещает 45 на ленте, взят из констант Эзоланга Brainfuck .
Этот ответ предполагает, что интерпретатор выходной программы имеет обернутые ограниченные ячейки; и это ,
обнуляет текущую ячейку (подразумевая, что выходная программа выполняется без ввода). Попробуйте онлайн!
Для (более длительного) решения, которое работает безоговорочно, см. Мой другой ответ .
Тестовый забег
Для ввода Code Golf
генерируется следующий вывод.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,
Попробуйте онлайн!
Как это устроено
Мы начинаем с помещения целого числа 45 (код символа -
) в ячейку ленты. Следующий код достигает этого.
- 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.
]
Прежде чем мы войдем в цикл, лента выглядит следующим образом.
v
000 000 255
Эти три ячейки - -2 , -1 и 0 - единственные, которые мы будем использовать в этой программе.
На первой итерации цикла самая правая ячейка, затем эта ячейка и средняя ячейка уменьшаются в два раза, оставляя следующее состояние.
v
000 254 252
В следующих 126 итерациях начальное значение -
уменьшает среднюю ячейку, [>]<
переходит в крайнюю правую ячейку и --<--
уменьшает среднюю и правую ячейку. В результате 3 вычитается из средней ячейки (по модулю 256 ), а 2 вычитается из крайней правой ячейки.
Поскольку 254 ÷ 3 (мод 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 и 252 ÷ 3 = 84 , крайняя правая ячейка обнуляется перед средней, оставляя следующее состояние.
v
000 132 000
Подобно первой итерации цикла, следующая итерация теперь вычитает 3 из средней ячейки и 2 из самой левой ячейки, помещая голову в крайнюю левую ячейку.
v
254 129 000
Последующие итерации, как и в 126 итерациях перед ними, вычитают 3 из самой левой ячейки и 2 из самой правой ячейки.
Поскольку 254 ÷ 3 (мод 256) = 170 и 129 ÷ 2 (мод 256) не определены, это делается 170 раз, оставляя следующее состояние.
v
000 045 000
Клетка под головой равна нулю; цикл заканчивается.
Теперь мы готовы генерировать вывод.
, 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.