Дюодіадичні плитки - це різновиди квадратних функціональних блоків, які приймають два входи, один з їх верхньої та один з лівого боку, і мають два виходи, один з правого боку та один з нижньої. Кожен їх вихід є окремою функцією обох входів.
Наприклад, якщо #
є загальну плитку, правий вихід 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
'і 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
s та1
s. - Ваша сітка повинна використовувати відповідні символи (
0 1+\U)!&|^
). Пам'ятайте про це0
іозначайте те саме.
Випробування
(Читати введення / виведення як 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
Zig zag:
+++\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
Якщо ви хочете обговорити розширення цієї ідеї на повноцінну мову програмування, заходьте до цієї чатової кімнати .