Машина
Машина типу «більярдна куля» складається лише з символів, \
_
/
а також великих і малих літер, пробілів та цифри 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
\_/
?