Brainfuck, 39 33 32 31 байт
-[-[>]<--<--],[[>.<+]>+.--.+<,]
Алгоритм, який розміщує 45 на стрічці, взято від констант Brainfuck Esolang .
Ця відповідь передбачає, що інтерпретатор вихідної програми має обгорткові, обмежені комірки; і це,
дорівнює нулю поточної комірки (мається на увазі, що вихідна програма працює без введення). Спробуйте в Інтернеті!
Про (довше) рішення, яке працює безумовно, див іншу мою відповідь .
Тестовий запуск
Для введення 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 (mod 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 (mod 256) = 170 і 129 ÷ 2 (mod 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.