두 가지 차원으로 프로그래밍


17

이 세상이 단지 1 배의 차원을 갖는 것은 우연한 사고이지만 그렇게 될 필요는 없습니다. 시간 차원이 2 이상인 세계를 쉽게 상상할 수 있으며, 이러한 세계에서는 컴퓨터와 같이 컴퓨터를 구축하고 소프트웨어를 실행할 수 있습니다.

시스템

다음은 Brainf * ck 프로그램을 두 가지 시간 차원으로 실행하기위한 시스템입니다.

두 시간 차원은 x와 y입니다. 각 Brainf * ck 프로그램은 x half 프로그램과 ay half 프로그램으로 구성됩니다.

x: +>+
y: [-]

두 개의 반 프로그램에는 각각 고유 한 프로그램 포인터가 있지만 단일 테이프 포인터를 공유합니다 (즉, 테이프의 동일한 셀에서 작동 함).

시간은 2 차원이므로 모멘트 그리드로 구성됩니다.

x와 y 액션으로 연결되는 3x3 시간 그리드

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 [0](아주 미쳤지 만 사양이 제안하는 것 같다면), 지시 포인터는 어떻게 결합합니까? 두 개의 스레드가 +and []이면 1 2데이터 테이프 [3]에 있지만 두 번째 명령 포인터는 루프 ( []+경로) 내부 또는 외부 ( [+]경로) 또는 심지어 불법 ( +[])입니까?
John Dvorak

@ JanDvorak 아, 나는 당신이 요구하는 것을 본 것 같아요. 각 프로그램을 추가하는 것을 잊었습니다. 차원에서 인접한 순간부터 명령 포인터를 얻습니다. 그 부분을 편집하고 ( +, >)를 실행 하여 결과가 동일한 지 확인하십시오.
Owen

이것은 좋은 도전이지만 정답을 얻으려면 객관적인 승리 기준이 필요합니다.
Martin Ender

3
도전은 여전히 ​​나에게 분명하지 않습니다. 그리드를 통해 시간이 얼마나 정확하게 진행됩니까? 그래픽에 따르면 내가 도달 할 수있는 것 (1,1)중 하나를 통해 (1,0)또는 (0,1),하지만 하나의 프로그램 시작 >과 하나 시작 +후 반드시 자신의 상대적인 순서 문제를?
Martin Ender

답변:


8

총 4 바이트 : ( [-], >)

나는 짐승 - 포서을 쓴 작은 같은 프로그램을 찾을 수 있습니다.

다음은이 프로그램의 다이어그램입니다. 이 그리드는 사양의 그리드와 유사한 방식으로 왼쪽 하단 모서리에 (0,0), x 축을 따라 x- 시간, y 축을 따라 y- 시간으로 정렬됩니다. 오른쪽 상단에 결과가 포함됩니다.

먼저 다음과 같은 테이프를 사용하십시오 0 0 0.

|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

이제 테이프로 1 0 0:

|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|( 1)  0   0 |( 1)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 
|([)-]       |[(-)]       |[-(])       |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

3 셀 테이프가 둘러 싸여 있다는 사실과 같이 사양에서 명확하게 설명되지 않은 몇 가지 사항이 있습니다.


보너스로 ( >+, [-]) 예제 의 시각화는 다음과 같습니다.

|( 0)  0   0 |( 0)  0   0 |( 1)  1   0 
|(>)+        |>(+)        |>+          
|[-]         |[-]         |[-(])       
+------------+------------+------------
|( 0)  0   0 |  0   0 ( 0)|  0   1 ( 1)
|(>)+        |>(+)        |>+          
|[-]         |[-]         |[(-)]       
+------------+------------+------------
|( 0)  0   0 |  0 ( 0)  0 |  0 ( 1)  0 
|(>)+        |>(+)        |>+          
|([)-]       |([)-]       |([)-]       
+------------+------------+------------

그리고 ( >+, +>) 예제 중 하나 :

|( 1)  0   0 |  1   1 ( 0)|  1   3 ( 1)
|(>)+        |>(+)        |>+          
|+(>)        |+(>)        |+(>)        
+------------+------------+------------
|( 0)  0   0 |  0 ( 0)  0 |  0 ( 1)  0 
|(>)+        |>(+)        |>+          
|(+)>        |(+)>        |(+)>        
+------------+------------+------------

오른쪽 상단 모서리는 나열된 것과 다릅니다. 내 코드는 내가 시도한 다른 모든 예제와 일치하기 때문에 예제에서 오류라고 생각합니다.


이거 엄청나 네! 오류에 대해 옳을 수도 있습니다. 다시 확인하겠습니다.
Owen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.