놀라운 68 66 바이트
}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous는 Rube Goldberg와 같은 기계에서 구슬로만 표현되는 값을 가진 8 비트 언어이므로 매우 쉽지 않았습니다. 이 접근 방식은 다음 의사 코드와 거의 같습니다.
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
최대 값은 256이므로 (다른 위치에서 다르게 처리되는 Marbleous 프로그램에서 0으로 표시됨) recursiveFunction (1)은 총계가 256!*512^256
약 10^1200
, 즉 우주보다 오래 지속될 정도로 충분히 호출됩니다 .
Marbelous는 매우 빠른 인터프리터를 가지고 있지 않으므로 10^11
매년이 함수의 호출에 대해 실행할 수있는 것처럼 보입니다. 즉, 우리는 10^1189
수년 의 런타임을보고 있습니다.
Marbelous 보드에 대한 추가 설명
00@0
--/\=0
\\@0&0
00
16 진수 (0)로 표시되는 언어 리터럴 (또는 대리석)입니다. 이 구슬은으로 떨어지며 --
구슬은 1 씩 줄어 듭니다 (00은 줄 바꿈하여 소수점 이하 FF 또는 255로 바)). 값이 FF 인 Marble은 아래로 내려가 \\
오른쪽으로 한 열을 아래로 밉니다 @0
. 이것은 포털이며 구슬을 다른 @0
장치 로 순간 이동시킵니다 . /\
복사기는 장치 에 대리석이 있으며, 대리석의 사본 하나 --
를 왼쪽에 배치합니다 (이 대리석은 포털 사이에서 계속 반복되고 모든 루프에서 감소합니다) =0
.=0
구슬을 값 0과 비교하고 구슬이 같으면 구슬이 떨어지도록하고 그렇지 않으면 오른쪽으로 밉니다. 구슬의 값이 0이면, &0
동기화 장치 에 착륙합니다 . 나중에 자세히 설명하겠습니다.
결국, 이것은 루프에서 0 값 구슬로 시작하여 다시 0에 도달 할 때까지 감소시킨 다음 0 값 구슬을 동기화 프로그램에 넣고 동시에 반복합니다.
}0@1
&0/\>0!!
--
@1
}0
입력 장치이며, 처음에는 프로그램을 호출 할 때 n 번째 (기본 0) 명령 줄 입력이 모든 }n
장치에 배치됩니다 . 따라서 명령 행 입력 2로이 프로그램을 호출하면 02 값 대리석이 이것을 대체합니다 }0
. 그런 다음이 구슬은 &0
다른 동기화 장치 인 다른 싱크로 나이저 로 떨어지며 다른 &n
모든 해당 항목 &n
이 제출 될 때까지 구슬을 고정 시킵니다. 그런 다음 이전에 설명한 루프에서와 같이 대리석이 감소, 순간 이동 및 복제됩니다. 그런 다음 올바른 사본은 0이 아닌 >0
경우 0 ( )으로 부등식을 검사합니다 . 0이면 오른쪽으로 밀리고에 착륙 !!
하여 보드를 종료합니다.
자, 지금까지 우리는 255에서 0까지 지속적으로 카운트 다운하는 루프를 가지고 있으며 0에 도달 할 때마다 다른 유사한 루프 (명령 행 입력으로 공급)가 한 번만 실행되도록합니다.이 두 번째 루프가 n 번 실행되면 (최대 256) ) 프로그램이 종료됩니다. 루프의 최대 65536 런입니다. 우주보다 오래 살기에는 충분하지 않습니다.
}0
--@2
@2/\=0MB
이것은 친숙해 보이기 시작하고 입력이 한 번 감소한 다음이 값이 반복되어 복사됩니다 (대리석이 모든 루프 실행이 아니라 한 번만 감소됨). 그런 다음 0과 같고 0이 아닌지 확인합니다 MB
. 이것은 Marbelous의 함수이며, 모든 파일은 여러 개의 보드를 포함 할 수 있으며 각 보드는 함수 :[name]
입니다. 파일의 첫 번째 기능 (표준 이름 : MB)을 제외한 모든 기능. 따라서이 루프 n - 1
는 n이 함수의이 인스턴스가 호출 된 값의 값으로 메인 보드를 계속 호출합니다 .
왜 n*512
?
첫 번째 루프는 4 틱 (256 회)으로 실행되고 두 번째 루프는 보드가 종료되기 전에 n 번 실행됩니다. 이것은 보드가 n*4*256
진드기 에 대해 작동한다는 것을 의미합니다 . 마지막 루프 (재귀 함수 호출)는 더 작고 2 틱으로 실행되므로 함수 n*4*256/2 = n*512
시간 을 호출 할 수 있습니다 .
언급하지 않은 기호는 무엇입니까?
\/
쓰레기통은 보드에서 대리석을 제거합니다. 이렇게하면 분리 된 대리석이 둥글게 반복되는 다른 대리석을 방해하지 않고 프로그램이 종료되지 않습니다.
보너스
놀라운 보드의 바닥에서 떨어지는 대리석이 STDOUT으로 출력되기 때문에이 프로그램은 실행되는 동안 많은 ASCII 문자를 인쇄합니다.