@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0
Marbelous는 8 비트 언어이므로 256 미만의 값에 대해서만 작동합니다.
작동 원리
Marbelous는 8 비트 구슬로 표현 된 값을 가진 2D 언어로, 일부 장치가 넘어지지 않도록하지 않는 한 각 진드기마다 한 셀 아래로 떨어집니다. 이 놀라운 프로그램은 3 개의 보드로 구성됩니다. 가장 쉬운 것으로 시작합시다.
:O
}0
+Z
+C
{0
:O
보드의 이름입니다 (정확히 말하면 O는 이름입니다. : :이 줄이 이름임을 해석합니다. 보드에 이름을 부여하면 다른 보드
}0
가 입력 장치 일 수 있음) 이 함수의 인수.이 셀이 함수가 호출되는 입력 대리석 (값)로 대체 얻을 것이다는.
+Z
. 그것을 통해 가을 위로 통과 할 수있는 대리석으로 35을 추가 +C
동일하지 만 (12)가 추가 {0
출력 세포입니다 , 대리석이이 셀에 도달하면 함수가 종료되고이 출력 장치의 값을 반환합니다.
따라서이 보드는 하나의 가치를 취한 다음 47을 더합니다. 우리에게 이것은 하나의 숫자가 숫자 -1의 ASCII 코드로 바뀐다는 것을 의미합니다 (물론 10도 가능합니다).
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
이 보드는 조금 더 복잡해 보입니다. :I
보드 이름 으로 식별 할 수 있어야하며 일부 입력 및 출력 장치를 발견했습니다. 당신은 우리가 두 개의 서로 다른 입력 장치가있는 것을 알, 수 있습니다 }0
및 }1
. 이것은이 기능이 2 개의 입력을 받는다는 것을 의미합니다. 또한 }1
장치의 두 인스턴스가 있음을 알 수 있습니다 . 함수를 호출하면 두 셀 모두 동일한 값을 포함합니다. }0
입력 장치들은 직접 위에 \/
이것은 휴지통 역할 바로 그 위에 떨어지는 모든 대리석 제거 장치.
}1
입력 장치 가 보드에 넣은 구슬 중 하나에 어떤 일이 발생하는지 살펴 보겠습니다 .
}1
=9 &1
&0
{>
첫 번째 틱에서 떨어지고 =9
장치를 누르십시오 . 이것은 구슬의 값을 9와 비교하고 문장이 =9
평가 되면 구슬이 빠지게 합니다. 그렇지 않으면 대리석이 오른쪽으로 밀려납니다. &0
그리고 &1
동기화 자입니다. 그들은 다른 모든 &n
동기화 장치가 채워질 때까지 구슬에 붙습니다 . 예상대로, 이것은 보드의 다른 부분에서 조건 적으로 다른 동작을 트리거합니다.
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
이것이 ++
증분 장치라고 말하면 이미 다른 동기화 프로그램으로 채워지는 것을 말할 수 있어야합니다. 왼쪽 &1
에는 입력 값 }1
+ 1 이 포함되고 그 &0
옆에는 0이 포함됩니다 ( 00
16 진수로 표시되는 언어 리터럴 임). 두 번째 &1
는 값 1을 포함하고 오른쪽 &0
은으로 채워 F7
지며 Marbelous의 덧셈은 모듈로 256이므로 값에서 9를 뺍니다.
//
디플렉터 장치로, 대리석을 떨어 뜨리지 않고 왼쪽으로 밀어냅니다.
이 모든 것을 합치면 다음과 같은 결과를 얻을 수 있습니다. 구슬 }1
이 9이면 &0
동기화 장치가 채워집니다. 이로 인해 값 0이 {0
출력 으로 떨어지고 F7
(또는 -9) 출력 으로 떨어집니다 {1
. }1
9가 아닌 경우 + 1 {0
로 채워지고 }1
1 {0
을 포함합니다. {>
장치 도 있습니다. 이것은 보드 대신 대리석을 보드 옆에 출력하는 특수 출력입니다. }1
9와 같으면 채워집니다 .
@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
자 이제 큰 것입니다. 이 보드는 파일의 메인 보드이므로 명시적인 이름이 없습니다. 내재 된 이름은 Mb
입니다. 일부 셀을 인식 할 수 있어야합니다. 입력 장치, 일부 언어 리터럴 ( 00
및 FF
)이 있습니다. 싱크로 나이저와 디플렉터가 있습니다. 이 조각을 단계별로 살펴 보겠습니다.
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
따라서 입력 값 (이것이 메인 보드이므로 명령 행 입력)은 두 번째 셀에서 위치의 맨 위에서 시작합니다 }0
. 넘어져서 >0
다른 비교 장치 인 장치에 도달합니다 . 0보다 큰 구슬은 쓰러지고 다른 구슬은 오른쪽으로 밀립니다. (Marbelous 변수는 부호가 없으므로 정확히 0 만 오른쪽으로 푸시됩니다). 이 제로 값 대리석은 @6
장치에 부딪칩니다 . 이것은 포털이며 대리석을 다른 해당 포털 (이 경우 바로 위)로 전송합니다. 그런 다음 0 구슬은 &0
동기화 장치에 도달하여 다른 곳을 트리거합니다.
대리석이 0이 아닌 경우, 그것은 아래로 폭포에 의해 오른쪽으로 편향됩니다 \\
안타 --
하나를 감소시키고 그 다음에 하강 /\
하는 클론 업체입니다. 이 장치는 대리석을 가져 와서 사본 하나를 오른쪽으로, 하나는 왼쪽으로 출력합니다. 왼쪽 하나는 다른 쪽 위로 @0
올라 가면서 대리석이 다시 같은 순서로 진행됩니다. 왼쪽은 다른 곳으로 가져갑니다. 이것은 루프를 제공하여 루프 당 한 번 명령 행 입력을 감소시키고 0에 도달 할 때까지 모든 루프에서 일부 동작을 트리거합니다. 그런 다음 다른 동작을 트리거합니다.
@4
각 루프에 구슬이 밀려 났을 때 어떤 일이 발생하는지 살펴 보겠습니다 .
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
여기에는 3 개의 언어 리터럴이 있으며 ( FF
) 즉시 포털에 포함됩니다. 이 포털은 3 개의 II
장치로 연결됩니다. 파일을 더 정의한 II
보드를 나타냅니다 :I
. :I
2 개의 개별 입력 장치가 있기 때문에 다른 보드의 표현은 2 셀 너비 여야합니다. II
우리는를 포함하는 6 개의 셀을 가지고 있기 때문에 , 우리는이 함수의 인스턴스가 3 개 있다고 보드에 알려줍니다.
FF
(또는 256 -1 당신이 할 경우) 구슬이의 입력 셀에 앉을 :I
전까지가 충분한 입력 대리석 석재가 기능을 시작 대기 기능 (하나입니다). 그것이 바로 @4
포털이 들어오는 곳 입니다. 감소 된 명령 행 입력의 사본은 각 루프에 있습니다. 가장 왼쪽 :I
보드 가 트리거됩니다 . 값 256 (또는 -1) 및 명령 행 입력이 -1 인 모든 값으로 초기화합니다. 왼쪽 대리석은 보드 의 }0
장치에, 오른쪽 대리석은에 있습니다 . 이 게시판이 무엇을했는지 기억한다면, 그 결과가 무엇인지 알 수 있습니다. 왼쪽 출력에 오른쪽 입력의 증분 버전을 출력하고 (9가 10이 아닌 0으로 바)) 오른쪽에 1 또는 -9를 출력합니다.:I
}1
증가 된 값은 포털에서 오른쪽 입력 셀로 바로 가져 오며 오른쪽의 값은 동기화 프로그램에 속합니다. 싱크로 나이저가 이미 구슬을 가지고 있다면 두 구슬이 충돌합니다. 충돌하는 구슬은 모듈로 256에 합쳐집니다. 따라서 싱크로 라이저의 값은 다음을 수행합니다. 다시 1 (247이 모듈로 256에 추가되기 때문에).
입력 값이 다시 0으로 루프 될 때 구슬이 오른쪽으로 출력된다는 것을 기억할 수도 있습니다. :I
보드가 서로 바로 옆에 있기 때문에 보드가 오른쪽으로 한 번 트리거됩니다. 이렇게하면 세 개의 동기화 프로그램이 명령 줄 입력의 단순 표현보다 값이 1보다 높은 값으로 채워집니다.이 시간은 0으로 줄어 듭니다.
:O
함수가 값을 숫자 -1을 나타내는 숫자의 ASCII 값으로 변환 한다는 것을 기억할 수도 있습니다 . 이 OO
셀 의 출력은 보드에서 떨어져 해당 ASCII 문자를 STDOUT에 인쇄합니다.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
명령 행 입력 대리석이 0에 도달하여 &0
동기화 프로그램을 채우면 어떻게됩니까? 글쎄, 약간의 0 값 구슬이 떨어지고 보드 하단에 단수의 자릿수 (+ 1)를 보유하고있는 세 개의 동기화 장치를 트리거합니다. &3
가장 중요한 숫자가 포함되어 있기 때문에 먼저 트리거 &2
됩니다 &1
. 그런 다음이 구슬 @5
은 !!
셀에 부딪 치기 전에 다른 장치로 순간 이동 하여 보드를 종료합니다.
19, 20, 21, 22
10 진수로 된 시퀀스 는 짧은 것으로 매핑 된다는 점에 유의해야합니다08, 09, 10, 11
. 그렇기 때문에 내가 혼동했습니다100 -> 89
!