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
Если вы хотите обсудить расширение этой идеи на полноценный язык программирования, заходите в этот чат .