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\?