Stackylogic - мова програмування, яку я склав у попередньому виклику: Run Stackylogic . Прочитайте цю публікацію для отримання детальної інформації та прикладів, але ось як це перефразовано працює:
Stackylogic приймає
0
's і1
' для введення та виведення єдиного0
або1
після завершення.Програма складається з рядків, які містять лише символи
01?
, а також точно одного<
в кінці одного з рядків. Лінії не можуть бути порожніми і лінія з<
повинна мати принаймні один0
,1
або?
перед ним.Ось зразок програми, яка обчислює NAND з двох біт:
1 ?< 11 ? 0
Кожен рядок програми вважається стеком , нижній зліва та верхній праворуч. Безпосередньо перед першим рядком програми та після останнього рядка є порожній стек (тобто порожній рядок).
<
, Названий курсором, зазначає стек , щоб почати при запуску програми. Виконання триває наступним чином:
Спустіть верхній символ із стека, на який вказує курсор.
- Якщо символ є
?
, запропонуйте користувачеві a0
або a1
і діяти так, як ніби це був символ.- Якщо символ є
0
, перемістіть курсор на один стек вгору (до рядка над поточним рядком).- Якщо символ є
1
, перемістіть курсор на одну стек вниз (до рядка нижче поточного рядка).Якщо стек, на який рухається курсор, порожній, виведіть останнє значення, яке вискочило з стека (завжди a
0
або1
), і закінчіть програму.В іншому випадку, якщо стек, на який рухається курсор, не порожній, поверніться до кроку 1 і повторіть процес.
Ключове, що потрібно усвідомити для цього виклику - це те, що всі програми Stackylogic прирівнюються до таблиці істинності . Деякі заздалегідь задані кількості булевих значень вводяться, і рівно один булевий показник детерміновано виводиться.
Отже, ваше завдання - створити програму Stackylogic, яка задовольняє або моделює, тобто має такий же вихід, як і будь-яка дана таблиця істинності. Але не очевидно, що Stackylogic може імітувати будь-яку таблицю істинності, тому ось доказ за допомогою індукції :
Базова справа
Ці дві таблиці 0-вхід істина таблиці , які завжди виводяться
0
або1
. Стаклогічні еквіваленти цих таблиць є0<
і1<
відповідно.Індуктивний крок
Припустимо, що Stackylogic може імітувати будь-яку таблицю істинності N-вводу. Нехай M = N + 1.
Таблиця M-введення, T, може бути виражена у вигляді двох N-вхідних таблиць, T 0 і T 1 , плюс додатковий вхідний біт B. Коли B дорівнює 0, використовується результат T 0 . Коли B дорівнює 1, використовується результат T 1 .
Наприклад, 3-вхідна таблиця правдивості, що відповідає псевдокоду
if B: result = x OR y else: result = x NAND y
є
B x y | result 0 0 0 | 1 0 0 1 | 1 0 1 0 | 1 0 1 1 | 0 1 0 0 | 0 1 0 1 | 1 1 1 0 | 1 1 1 1 | 1
що насправді дві таблиці істинності 2-вхідних даних для NAND та АБО, складених на вершині один одного за допомогою муксирующего біта B.
Нехай S 0 і S 1 - програми Стаккілогіки, які задовольняють T 0 і T 1 відповідно (ми знаємо, що вони існують на основі першого припущення). Програма S, яка задовольняє T, може бути побудована як:
[lines of S0 excluding the cursor, with 0 appended to all lines below the cursor] ?< [lines of S1 excluding the cursor, with 1 appended to all lines above the cursor]
Це розташування ефективно змінюється між S 0 і S 1 на основі першого вхідного біта (з рядка
?<
). Якщо це так0
, курсор поверне додане0
до початкового положення курсору S 0 , яке потім буде межене порожніми стеками та знизу, і таким чином виконати точно ідентично вихідному S 0 . Так само, якщо1
вводиться, курсор буде їздити1
вниз до положення курсора S 1 і продовжує виконувати його так, як ніби він був один.Наприклад, програми Stackylogic для АБО та NAND є
? ?<
і
1 ?< 11 ? 0
Їх можна комбінувати для імітації
if B: result = x OR y else: result = x NAND y
так:
1 ? 110 ?0 00 0 ?< ?1 ?
Таким чином, будь-яка таблиця істинності може бути змодельована програмою Stackylogic.
Виклик
Напишіть програму або функцію, яка приймає таблицю істинності N вхідних даних (N> 0) у вигляді списку 2 N булевих значень, які представляють результати таблиці в бінарному порядку.
Будь-який розумний формат введення в порядку. наприклад для таблиці АБО ІСТИНИ
x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
будь-який із цих стилів введення буде добре:
0111
0, 1, 1, 1
0
1
1
1
[False, True, True, True]
Роздрукуйте або поверніть програму Stackylogic, яка задовольняє таблицю істинності, тобто має точно той же вихід, що заданий тим самим входом. Будь-яка кінцева програма, яка задовольняє цій таблиці, є дійсним результатом. Не потрібно дотримуватися методу побудови індуктивного доказу. Програми Stackylogic не повинні бути оптимально короткими.
Наприклад, якби вхід був 11100111
, був би один дійсний вихід
1
?
110
?0
00
0
?<
?1
?
але є багато інших.
Виграє найкоротший код у байтах.
Дивіться оригінальний виклик Stackylogic, якщо вам потрібен перекладач.