Програмування у двох часових вимірах


17

Дивна випадковість, що цей світ має лише один часовий вимір, але він не повинен бути таким. Легко уявити світи з двома і більше часовими вимірами, і в цих світах ви могли б створити комп'ютери та запустити на них програмне забезпечення, як у цьому.

Система

Ось система для запуску програм Brainf * ck у двох часових вимірах:

Два часові розміри - x і y. Кожна програма Brainf * ck складається з x напівпрограми, і будь-яка напівпрограма, наприклад, програма може бути

x: +>+
y: [-]

Дві напівпрограми мають власну вказівку програми, але вони поділяють один покажчик стрічки (тобто обидва вони працюють на одній клітинці стрічки).

Час двовимірний, тому складається з сітки моментів:

3x3 сітка разів, з'єднання за допомогою x та y дій

Рухаючись по розміру x, половина програми x виконує один крок часу. Рухаючись по розміру y, півпрограма виконує один крок часу.

Наприклад, скажімо, стрічка починається як [0] 0 0( []являє собою покажчик стрічки), а програми x / y є +і ->-. Виконання цієї програми виглядатиме так:

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 >

Зауважте, що, коли час рухається у напрямку у, половина програми x продовжує робити те саме, що повторюється, оскільки його час не прогресує.

Стрічка в кожен момент включає сукупний ефект усіх дій, які в неї подаються (кожна дія рахується один раз). Так, наприклад, стрічка в момент часу (2, 1) містить сукупний ефект:

Які дії подаються в знімок стрічки, як зазначено нижче

  • x-дія від (0, 0)
  • x-дія від (1, 0)
  • x-дія від (0, 1)
  • x-дія від (1, 1)
  • y-дія від (0, 0)
  • y-дія з (1, 0)
  • y-дія з (2, 0)

Накопичувальні засоби:

  • Всі прирости і зменшення до клітинки сумуються разом.
  • Усі ліві (-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 (вони мають своє стандартне значення):

  • +, -: приріст, декремент;
  • [, ]: цикл до нуля (обробка a [або ]займає один крок часу, як у стандартному Brainf * ck);
  • <, >: рухайтесь ліворуч / праворуч на стрічці.

Складний приклад

Для програми ( >, +), що починається з [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

Діаграма зі стрілками

На схемі нижче показано, як обчислити дії та стрічку:

Діаграма зі стрілками, що показують, як обчислюються частини програми

Головоломка

Напишіть програму 2D Brainf * ck (з х-програмою та половиною програми) для запуску на триклітинній стрічці, яка задовольняє обом наступним умовам:

  • Якщо стрічка починається так [0] 0 0, як за часом (5, 5), вона має 0нульову комірку.
  • Якщо стрічка починається так [1] 0 0, як за часом (5, 5), вона має 0нульову комірку.

Виграє найкоротша програма, що відповідає вимогам.


Просто для перевірки: що є результатом запуску +та >? Якщо це 1 1 [0](досить божевільно, але, як видається, пропонує специфікація), як поєднуються вказівники інструкцій? Якщо два потоки є +і [], то на 1 2стрічці даних буде [3], але чи є другий вказівник інструкції всередині циклу ( []+шлях), або зовні ( [+]шлях), або навіть незаконний ( +[])?
Джон Дворак

@JanDvorak Ах, я думаю, я бачу те, що ви просите. Я забув додати, що кожна програма отримує свій покажчик інструкцій із суміжного моменту в її вимірі. Я відредагую це і спробуйте запустити ( +, >), щоб побачити, чи отримаю я такий самий результат, як і ви.
Оуен

Це приємний виклик, але для оцінювання відповідей потрібен об'єктивний критерій виграшу.
Мартін Ендер

3
Виклик досі мені не дуже зрозумілий. Як саме просувається час через сітку. Згідно з вашою графікою, здається, що я можу доїхати (1,1)через (1,0)або (0,1), але це одна програма починається з >однієї і починається +, то, безумовно, їх відносний порядок має значення?
Мартін Ендер

Відповіді:


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 
|(>)+        |>(+)        |>+          
|(+)>        |(+)>        |(+)>        
+------------+------------+------------

Зауважте, що верхній правий кут відрізняється від того, що ви вказали, я вважаю, що це помилка у вашому прикладі, оскільки мій код відповідає кожному іншому прикладу, який я намагався.


Це дивно! Ви можете мати рацію щодо помилки. Я ще раз перевірю.
Оуен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.