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


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.