Brainfuck, 39 33 32 31 바이트
-[-[>]<--<--],[[>.<+]>+.--.+<,]
테이프에 45 를 배치하는 알고리즘 은 Esolang의 Brainfuck 상수 에서 가져옵니다 .
이 대답은 출력 프로그램의 인터프리터가 랩핑 된 경계 셀을 가지고 있다고 가정합니다. 그리고 ,
현재 셀 을 0으로 만듭니다 (출력 프로그램이 입력없이 실행 됨). 온라인으로 사용해보십시오!
무조건 작동하는 (더 긴) 솔루션에 대해서는 내 다른 대답을 참조하십시오 .
시운전
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 와 ÷ 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
머리 아래의 셀은 0입니다. 루프가 끝납니다.
이제 출력을 생성 할 준비가되었습니다.
, 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.