이 세상이 단지 1 배의 차원을 갖는 것은 우연한 사고이지만 그렇게 될 필요는 없습니다. 시간 차원이 2 이상인 세계를 쉽게 상상할 수 있으며, 이러한 세계에서는 컴퓨터와 같이 컴퓨터를 구축하고 소프트웨어를 실행할 수 있습니다.
시스템
다음은 Brainf * ck 프로그램을 두 가지 시간 차원으로 실행하기위한 시스템입니다.
두 시간 차원은 x와 y입니다. 각 Brainf * ck 프로그램은 x half 프로그램과 ay half 프로그램으로 구성됩니다.
x: +>+
y: [-]
두 개의 반 프로그램에는 각각 고유 한 프로그램 포인터가 있지만 단일 테이프 포인터를 공유합니다 (즉, 테이프의 동일한 셀에서 작동 함).
시간은 2 차원이므로 모멘트 그리드로 구성됩니다.
x 차원을 따라 이동하면 x 반 프로그램이 한 번만 실행됩니다. y 치수를 따라 이동하면 y 하프 프로그램이 한 번만 실행됩니다.
예를 들어, 테이프가 [0] 0 0
( []
테이프 포인터를 나타냄) 시작 하고 x / y 프로그램이 +
and 라고 가정 해 봅시다 ->-
. 이 프로그램의 실행은 다음과 같습니다 :
x y tape x-action y-action
0 0 [ 0] 0 0 + at 0 - at 0
1 0 [ 1] 0 0 (done) - at 0
0 1 [-1] 0 0 + at 0 move >
1 1 [ 0] 0 0 (done) move >
시간이 y 방향으로 이동함에 따라 x 반 프로그램은 시간이 진행되지 않기 때문에 계속 동일한 작업을 반복합니다.
각 순간의 테이프에는 공급되는 모든 동작의 누적 효과가 포함됩니다 (각 동작은 한 번 계산). 예를 들어, 시간 (2, 1)의 테이프에는 다음과 같은 누적 효과가 포함됩니다.
- (0, 0)의 x- 액션
- (1, 0)의 x- 액션
- (0, 1)의 x- 액션
- (1, 1)의 x- 액션
- (0, 0)의 y 작용
- (1, 0)의 y 작용
- (2, 0)의 y 작용
누적 수단 :
- 셀에 대한 모든 증가 및 감소가 함께 합산됩니다.
- 테이프 포인터에 대한 모든 왼쪽 (-1) 및 오른쪽 (+1) 이동이 합산됩니다.
명령 포인터가 누적되지 않습니다. 각 반 프로그램은 차원의 이전 순간부터 명령 포인터를 가져옵니다. 즉, x 프로그램 포인터는 x 차원에서만 진행되고 y 프로그램 포인터는 y 차원에서만 진행됩니다. 예를 들어에서 시작 하는 프로그램 ( []
, +
)에서 [0] 0 0
실행은
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 0 0 0 + at 0 0 0
1 0 0 0 0 + at 0 2 (from jump) 0
0 1 1 0 0 0 1
1 1 2 0 0 1 (from NO jump) 1
위의 ( +
, ->-
) 시뮬레이션 에서 몇 가지 순간은 다음 과 같습니다.
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 + at 0 - at 0 0 0
1 0 [ 1] 0 0 - at 0 1 0
2 0 [ 1] 0 0 - at 0 1 0
0 1 [-1] 0 0 + at 0 > 0 1
1 1 [ 0] 0 0 > 1 1
2 1 [-1] 0 0 > 1 1
0 2 -1 [ 0] 0 + at 1 - at 1 0 2
1 2 0 1 [ 0] - at 2 1 2
2 2 [-1] 1 0 - at 0 1 2
허용되는 Brainf * ck 연산자는 다음과 같습니다 (표준 의미가 있음).
+
,-
: 증가, 감소;[
,]
: 0까지 반복 ( 표준 Brainf * ck에서와 같이 a를 처리[
하거나]
한 단계 씩 수행);<
,>
: 테이프에서 왼쪽 / 오른쪽으로 이동합니다.
복잡한 예
다음으로 시작 하는 프로그램 ( >
, +
) [0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 > + at 0 0 0
1 0 0 [ 0] 0 + at 1 1 0
0 1 [ 1] 0 0 > 0 1
1 1 1 1 [ 0] 1 1
로 시작하는 ( +
, -
)의 경우 [0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 + at 0 - at 0 0 0
1 0 [ 1] 0 0 - at 0 1 0
0 1 [-1] 0 0 + at 0 0 1
1 1 [ 0] 0 0 1 1
참고 테이프로서 끝나는 [0] 0 0
각 인해 +
과 -
0으로 합산 회 발생한다.
다음으로 시작 하는 프로그램 ( >+
, [-]
) [0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 > 0 0
1 0 0 [ 0] 0 + at 1 1 0
2 0 0 [ 1] 0 2 0
0 1 [ 0] 0 0 > 0 3
1 1 0 0 [ 0] + at 2 1 3
2 1 0 1 [ 1] - at 2 2 1
0 2 [ 0] 0 0 > 0 3
1 2 [ 0] 0 0 + at 0 1 3
2 2 [ 1] 1 0 2 2
화살표가있는 다이어그램
아래 다이어그램은 조치 및 테이프를 계산하는 방법을 보여줍니다.
퍼즐
3 셀 테이프에서 실행되도록 2D Brainf * ck 프로그램 (x 반 프로그램 및 반 프로그램)을 작성하여 다음 조건을 모두 만족하십시오.
- 테이프가
[0] 0 0
시간 (5, 5)으로 시작0
하면 0 번째 셀에 있습니다. - 테이프가
[1] 0 0
시간 (5, 5)으로 시작0
하면 0 번째 셀에 있습니다.
요구 사항을 충족하는 가장 짧은 프로그램이 승리합니다.
+
, >
)를 실행 하여 결과가 동일한 지 확인하십시오.
(1,1)
중 하나를 통해 (1,0)
또는 (0,1)
,하지만 하나의 프로그램 시작 >
과 하나 시작 +
후 반드시 자신의 상대적인 순서 문제를?
+
와>
? 그것이1 1 [0]
(아주 미쳤지 만 사양이 제안하는 것 같다면), 지시 포인터는 어떻게 결합합니까? 두 개의 스레드가+
and[]
이면1 2
데이터 테이프[3]
에 있지만 두 번째 명령 포인터는 루프 ([]+
경로) 내부 또는 외부 ([+]
경로) 또는 심지어 불법 (+[]
)입니까?