Stackylogic - це мова програмування, заснована на логіці, яку я склав, що приймає 0
's і 1
' s для введення та виведення одного 0
чи 1
після завершення.
Програма Stackylogic складається з рядків, які можуть містити лише три символи 01?
, а також точно один <
в кінці одного з рядків. Лінії не можуть бути порожніми і лінія з <
повинна мати принаймні один 0
, 1
або ?
перед ним.
Ось зразок програми, яка (як я поясню) обчислює NAND з двох біт:
1
?<
11
?
0
Кожен рядок у програмі Stackylogic вважається стеком , внизу зліва та вгорі праворуч. Безпосередньо перед першим рядком програми та після останнього рядка є порожній стек (порожній рядок).
Команда <
, яку ми будемо називати курсором , позначає стек, який повинен запускатися при запуску програми Stackylogic. Виконання програми Stackylogic відбувається наступним чином:
Спустіть верхній символ із стека, на який вказує курсор.
- Якщо символ є
?
, запропонуйте користувачеві a0
або a1
і діяти так, як ніби це був символ. - Якщо символ є
0
, перемістіть курсор на один стек вгору (до рядка над поточним рядком). - Якщо символ є
1
, перемістіть курсор на одну стек вниз (до рядка нижче поточного рядка).
- Якщо символ є
Якщо стек, на який рухається курсор, порожній, виведіть останнє значення, яке вискочило з стека (завжди a
0
або1
), і закінчіть програму.В іншому випадку, якщо стек, на який рухається курсор, не порожній, поверніться до кроку 1 і повторіть процес.
Зауважте, що програми Stackylogic завжди закінчуються, оскільки вони з часом повинні вичерпати свій набір.
Приклад NAND
У програмі NAND курсор запускається на ?
:
1
?<
11
?
0
Ми будемо вважати, що користувач вводить один 1
раз, коли ?
спливає, що означає, що курсор буде рухатися вниз, завдяки чому програма виглядає так:
1
11<
?
0
Тепер 1
у верхній частині стеку курсора рівнина . Він належним чином спливає, і курсор рухається знову:
1
1
?<
0
Тепер припустимо, що користувальницькі введення 0
для ?
, що означає, що курсор переміститься вгору:
1
1<
0
Знову ж, a 1
стоїть на стеці курсору, тому курсор спливає і рухається вниз:
1
<
0
Нарешті стек курсорів порожній, тому 1
виводиться останнє значення , виводиться, і програма закінчується.
Це точно для воріт NAND, оскільки 1 NAND 0
є 1
. Це, звичайно, працює для інших трьох двобітних входів, якщо ви хочете перевірити.
АБО Приклад
Ця програма Stackylogic імітує ворота АБО :
?
?<
Неважко помітити, що початковий вхід 1
воріт підштовхне курсор до неявного порожнього стека нижче останнього рядка, закінчивши програму та вивівши те, 1
що було тільки введенням.
Для введення з 00
іншого боку, курсор пробивається до неявного порожнього стека вгорі, закінчуючи програму і виводячи останній 0
для введення.
Виклик
Напишіть програму або функцію, яка приймає в програмі Stackylogic як рядок і запускає її, друкуючи або повертаючи отримані 0
або 1
.
Після ?
's, ви можете запропонувати користувачеві ввести 0
або 1
ввести або прочитати значення з попередньо заданих рядків 0
' s і 1
', які ви також приймаєте як вхідні дані. (Це може бути ще один рядковий вхід до вашої програми / функції, або ви можете просто припустити, що перший або останній рядок рядка програми буде вхідним потоком).
Ви можете припустити, що програма і введення завжди добре сформовані. Можливо, ви можете припустити, що програми введення поставляються з одним зворотним новим рядком (хоча пам’ятайте, що в кінці завжди є неявний порожній стек).
Виграє найкоротший код у байтах.
Більше зразкових програм
ZERO
0<
ONE
1<
BUFFER
?<
NOT
1
?<
0
AND
?<
?
NAND
1
?<
11
?
0
OR
?
?<
NOR
1
?
00
?<
0
XOR(v1)
?
0
1?<
?
0
XOR(v2)
?
?<
11
?
0
XNOR(v1)
1
?
0?<
1
?
XNOR(v2)
1
?
00
?<
?
MEDIAN(v1)
1
???<
0
MEDIAN(v2)
?
1?<
??
1\???<\0
.
111\???????<\000
.
?\1?<\??
. Як варіант, ось симетрична 5-рядова реалізація:?\?0\?<\?1\?