Brainfuck,39 33 32 31字节
-[-[>]<--<--],[[>.<+]>+.--.+<,]
在磁带上放置45的算法取自Esolang的Brainfuck常数。
这个答案假设输出程序的解释器具有包装的,有界的单元格;并且,
将当前单元格清零(这意味着输出程序在没有输入的情况下运行)。在线尝试!
对于(更长)无条件工作的解决方案,请参阅我的其他答案。
测试运行
对于input 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.