Имитация (на основе гравитации) компьютера типа бильярдного шара

12

Машина

Машина типа бильярдного шара состоит только из символов \ _ /вместе с прописными и строчными буквами, пробелами и числом 1.

\и /пандусы. Мяч, идущий сверху, будет отклоняться либо вправо, либо влево соответственно. Для обеих рамп, если мяч идет с любой стороны, он будет отклонен вниз.

_это логический элемент. Логика, которую он выполняет, - самая не бильярдоподобная часть компьютера. Сначала мяч, идущий слева или справа, продолжает в том же направлении. Мяч, идущий сверху, будет остановлен. Затем, после окончания его выполнения (см. «Запуск машины» ниже), если число шаров, пересекающих / приземляющихся на нем, является положительным четным числом, то один единственный шар высвобождается из нижней части элемента.

Пространство ничего не делает. Любые шары, идущие с любого направления, падают прямо под действием силы тяжести.

Строчные буквы являются входными данными. Все входы будут либо 1, либо 0.

Прописные буквы выводятся. Выведенное число будет количеством бильярдных шаров, попавших в его местоположение.

Номер 1выпускает дополнительный бильярдный шар в этом месте. Это представляет логическую 1.

Кроме того, все персонажи \_/приводят к тому, что любой шар, падающий с любого направления, падает из-за силы тяжести.

Шары никогда не объединяются, не разделяются и не сталкиваются. Они создаются только при освобождении от входа _, или 1. Они уничтожаются только тогда, когда падают прямо на _.

Пример машины-

1 a
\_/ b
  \_/
 \/
 /\ /
_  _
A  B

В машине никогда не будет пустых строк, но из _-за этого может показаться, что есть пустая строка.

Запуск машины

Машина запускается слоями или рядами. Все движения бильярдного шара в верхнем слое выполняются до того, как что-либо произойдет во втором слое.

Машина

ab
\_A
 C

выполняется следующим образом:

Во-первых, он запрашивает ввод aв форме a:. Затем пользователь будет вводить 1 или 0 (с последующим вводом). Это повторяет это для ввода b. Это конец первого слоя. Я собираюсь предположить, что пользователь ввел 1 для обоих входов.

Затем он прослеживает путь первого шарика (из a), который проходит вдоль \, поперек _, в Aи падает в точку под A. Затем он отслеживает путь для второго шара (из b), который идет прямо вниз _и заканчивается. Это конец второго слоя.

Теперь, перед третьим слоем, так как на _нем было два шарика, он выпускает один шарик. На выходе Aбыл один шарик пересекает его, поэтому он выводит A:1.

Для третьего слоя он отслеживает путь первого шара (от _), который проходит через Cи падает прямо вниз. Второй мяч (который провалился A) также падает прямо вниз.

Теперь, перед четвертым слоем, поскольку на выходе Cбыл один шарик, он выводит C:1.

Поскольку четвертый слой пуст, программа завершается.

Общий результат должен выглядеть

a:1     (the user entered the one)
b:1     (same here)
A:1
C:1

Цель

Ваша цель состоит в том, чтобы взять машину из STDIN и смоделировать ее, беря входные данные и вывод на печать по мере необходимости в STDOUT. Первая часть ввода в вашу программу будет состоять из запускаемой машины, за которой следует пустая строка. Любые введенные буквы должны приводить к тому, что ваша программа запрашивает ввод в виде имени ввода, за которым следует двоеточие. Любые выходные данные должны быть показаны в форме имени выходного файла, за которым следует двоеточие, за которым следует количество шаров, проходящих над этим местом.

Это гольф.

Примеры

Проводной переход

ab
\/
AB

Ворота XOR

ab1
\_/
 C

Полный сумматор

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C
PhiNotPi
источник
В вашем первом примере, почему первый шар падает под А? Есть ли неписанное правило, что шары останавливаются, когда они попадают на персонажа, которого нет \_/?
Питер Тейлор
@PeterTaylor Да, я должен добавить, что все буквы ведут себя как пустое пространство, когда дело доходит до воздействия на шар, и гравитация тянет шар вниз.
PhiNotPi
1
Вы случайно не имеете в виду «флиппер», а не «биллард»?
пользователь неизвестен
СДЕЛАЙТЕ ДИС ЭСОЛАНГА
Мэтью Ро
1
@AlexL. Также актуально: Marbelous
PhiNotPi

Ответы:

3

JavaScript ( 392 423)

Предполагается, что машина установлена ​​в переменной с именем m, а затем оповещает об окончательном выводе.

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

Пример источника (запускает сумматор, см. Историю, чтобы найти меньше источников): http://jsfiddle.net/96yLj/12/

Спойлеры:

- rотслеживает количество шаров в текущем ряду, nотслеживает количество шаров в следующем ряду.
- Алгоритм: обрабатывать каждую строку символ за символом, но процесс является _последним.
- Алгоритм: \-> следовать _и увеличивать, rпока не _. То же самое, /но в обратном направлении. В конце увеличьте nгравитацию, потянув шарики вниз. gдержит направление.
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];для ошибки, упомянутой в Edit 1 . Причина, по которой мы не можем просто сказать, r[d]+=r[c];заключается в том, что \_/при обработке будет учитываться количество шаров в два раза /
- else if(C<'2')обрабатывает оба случая '1'и ' ', что ~~Cпревращается в 1 и 0 соответственно.


Редактировать 1: Исправить ошибку с мячом, _не включенным в Aпример кода.

mellamokb
источник
Обратите внимание, что я всегда игнорирую требования STDIN и STDOUT, потому что это неинтересные ограничения. Я использую promptдля ввода и alertдля вывода, который является довольно стандартным для JavaScript :-)
mellamokb