Моделюйте комп'ютер з більярдною кулькою (на основі гравітації)


12

Машина

Машина типу «більярдна куля» складається лише з символів, \ _ /а також великих і малих літер, пробілів та цифри 1.

\і /є пандусами. Куля, що надходить зверху, буде відхилена відповідно в правий або лівий бік. Для обох пандусів, якщо куля виходить з обох боків, вона буде відхилена вниз.

_є логічним елементом. Логіка, яку він виконує, є найбільш не більярдною частиною комп'ютера. По-перше, куля, що йде зліва чи справа, продовжується в тому ж напрямку. Куля, що йде зверху, буде зупинена. Потім, після закінчення його виконання (див. Запуск машини нижче), якщо кількість кульок, що перетинають / приземляються на ньому, є додатним парним числом, то з нижньої частини елемента вивільняється одна куля.

Простір нічого не робить. Будь-які кулі, що виходять з будь-якого напрямку, падають прямо вниз через гравітацію.

Малі літери - це введення. Усі входи будуть або одним, або 0.

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

Номер 1випускає додаткову кулю для більярду в цьому місці. Він являє собою логічний 1.

Усі символи, крім того, \_/призводять до того, що будь-яка куля, що приходить з будь-якого напрямку, падає прямо вниз через гравітацію.

Кульки ніколи не поєднуються, не розбиваються і не стикаються. Вони створюються лише при звільненні від входу, a _або a 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

У вашому першому прикладі чому перша куля падає під А? Чи існує неписане правило, що кулі зупиняються, коли вони переходять на персонаж, якого немає \_/?
Пітер Тейлор

@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];призначено для помилки, згаданої в редакції 1 . Причина, яку ми не можемо просто сказати, r[d]+=r[c];полягає в тому \_/, що при обробці буде двічі рахувати кулі /
- else if(C<'2')обробляє обидва випадки '1'і ' ', що ~~Cперетворюється відповідно на 1 і 0.


Редагувати 1: Виправити помилку, коли м'яч перебіг _не включений у Aзразок коду.


Зауважте, що я завжди ігнорую вимоги STDIN та STDOUT, оскільки вони є нецікавими обмеженнями. Я використовую promptдля введення та alertвиводу, що є досить стандартним для JavaScript :-)
mellamokb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.