Brainfuck、39 33 32 31バイト
-[-[>]<--<--],[[>.<+]>+.--.+<,]
45をテープに配置するアルゴリズムは、Esolangの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
これらの3つのセル--2、-1、および0-は、このプログラムで使用する唯一のセルです。
ループの最初の各反復では、右端のセルが次の状態になり、そのセルと中央のセルが2回デクリメントされ、次の状態が残ります。
v
000 254 252
次の126回の繰り返しで、最初-
は中央のセルをデクリメント[>]<
し、右端のセルにジャンプして--<--
、中央と右のセルをデクリメントします。その結果、中央のセルから3が減算され(モジュロ256)、右端のセルから2が減算されます。
以来、254÷3(MOD 256)=(254 + 256)÷3 = 510÷3 = 170と÷3 = 84 252は、右端のセルは、以下の状態を残して、真ん中の前にゼロにされます。
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.