Duodyadic тайлы - это разновидности квадратных функциональных блоков, которые принимают два входа, один с их верхней стороны и один с их левой стороны, и имеют два выхода, один с правой стороны и один с нижней стороны. Каждый из их выходов является отдельной функцией обоих их входов.
Например, если #представляет собой общую плитку, правый выход Rявляется функцией fвходов Tи L, а нижний выход Bдругой функции gот Tи L:
T
L#R R = f(T, L)
B B = g(T, L)
(Плитки называются «дуэт», поскольку есть две функции, и «двоичный», поскольку обе функции имеют два аргумента .)
Плитки могут затем быть собраны вместе в сетке, выходы одной плитки идут непосредственно на входы соседних плиток. Вот, например, правый вывод левого #переходит в левый ввод правого #:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Вы можете себе представить, что при наличии набора двенадцатиперстных плиток, каждая из которых имеет определенную функциональность, могут быть созданы сложные (и потенциально полезные) композиции.
В этой задаче мы будем интересоваться только традиционным набором из двенадцати логически-ориентированных мозаичных элементов, где все входы и выходы являются однобитовыми двоичными числами (нулями или единицами). Мы будем использовать отдельный символ ASCII для обозначения каждого типа плитки.
Плитка символов и их отношения ввода-вывода являются следующими:
( Tдля верхнего ввода, Lдля левого ввода, Rдля правого вывода, Bдля нижнего вывода.)
- Ноль:
0или(пробел) →R = 0,B = 0 - Один:
1→R = 1,B = 1 - Крест:
+→R = L,B = T - Зеркало:
\→R = T,B = L - Только сверху:
U→R = T,B = T - Осталось только:
)→R = L,B = L - Не:
!→R = not L,B = not T - И:
&→R = L and T,B = L and T - Или:
|→R = L or T,B = L or T - Xor:
^→R = L xor T,B = L xor T
Вызов
Напишите программу или функцию, которая принимает прямоугольную сетку символов, 0 1+\U)!&|^которая представляет собой «схему», созданную с использованием десяти логических основанных на дуодиках плиток. Вам также нужно взять две строки 0's 1' и 's'; один будет левым входным столбцом, а второй - верхней строкой ввода. Ваша программа / функция должна напечатать / вернуть нижний выходной ряд и правый выходной столбец (также в 0's 1' и 's).
Например, в этой сетке
+++
+++
все входы текут прямо через сетку к выходам
ABC
D+++D
E+++E
ABC
поэтому вход 010/ 01будет иметь выход 010/ 01:
010
0+++0
1+++1
010
Точный вывод вашей программы будет [bottom output row]\n[right output column]или [bottom output row]/[right output column]:
010
01
или
010/01
Если вы написали функцию, вы могли бы вернуть две строки в кортеже или списке (или все равно вывести их).
Детали
- Возьмите три ввода как строки любым приемлемым способом (предпочтительно в сетке порядка, в верхней строке, в левом столбце): командная строка, текстовый файл, sdtin, функция arg.
- Можно предположить, что длина входных строк и столбцов будет соответствовать размерам сетки и будет содержать только
0«и1». - Ваша сетка должна использовать правильные символы (
0 1+\U)!&|^). Помните об этом0изначите одно и то же.
Тестовые случаи
(Прочтите I / O как top/ left→ bottom/ right.)
Nand:
&!
00/ 0→ 01/ 1
00/ 1→ 01/ 1
10/ 0→ 01/ 1
10/ 1→ 11/0
Все:
1111
1\+\
1+\+
1\+\
Любой ввод должен привести к 1111/ 1111.
Xor от Nand: (обратите внимание на колонку конечных пробелов)
\)+\
U&!&
+! !
\&!&
!
00000/ 00000→ 00000/ 00000
00000/ 10000→ 00010/ 00000
10000/ 00000→ 00010/ 00000
10000/ 10000→ 00000/00000
Зигзаг:
+++\00000000
000\!!!!\000
00000000\+++
Первый бит левого входа становится последним битом правого выхода. Все остальное есть 0.
000000000000/ 000→ 000000000000/ 000
000000000000/ 100→ 000000000000/001
Распространение:
)))
UUU
U+U
U+U
UUU
Первый бит левого входа поступает на все выходы.
000/ 00000→ 000/ 00000
000/ 10000→ 111/11111
Вот пастбина из всех тестовых случаев 1 × 1 сетки.
счет
Самая короткая подача в байтах побеждает.
Бонус: Какие крутые "схемы" вы можете сделать?
PS Не утруждайте себя поиском "двенадцатиперстной плитки". Я придумал их вчера; D
Если вы хотите обсудить расширение этой идеи на полноценный язык программирования, заходите в этот чат .