Płytki duodyadyczne są rodzajem kwadratowych bloków funkcyjnych które pobierają dwa dane wejściowe, jeden z góry i jeden z lewej strony, i mają dwa wyjścia, jeden po prawej stronie i jeden od spodu. Każde z ich wyjść stanowi osobną funkcję obu wejść.
Na przykład, jeśli #reprezentuje płytki rodzajowe, prawo wyjściowy Rjest funkcją fwejść Ti L, a dno wyjście Bto kolejna funkcja gof Ta L:
T
L#R R = f(T, L)
B B = g(T, L)
(Kafelki są nazywane „duetem”, ponieważ istnieją dwie funkcje, i „dyadyczne”, ponieważ obie funkcje mają dwa argumenty .)
Płytki mogą być następnie składane razem na siatce, a wyjścia jednego kafelka przechodzą bezpośrednio do wejść sąsiadujących ze sobą kafelków. Tutaj, na przykład, prawe wyjście z lewej #idzie do lewego wejścia z prawej #:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Można sobie wyobrazić, że biorąc pod uwagę zestaw płytek duodyadycznych, z których każda ma określoną funkcjonalność, można tworzyć złożone (i potencjalnie przydatne) kompozycje.
W tym wyzwaniu zajmiemy się tylko tradycyjnym zestawem dziesięciu duodyadycznych płytek logicznych , w których wszystkie wejścia i wyjścia są jednobitowymi liczbami binarnymi (zerami lub jedynymi). Użyjemy osobnego znaku ASCII do oznaczenia każdego rodzaju kafelka.
Znaki kafelków i ich relacje wejścia-wyjścia są następujące:
( Tdotyczy górnego wejścia, Llewego wejścia, Rprawego wyjścia, Bdolnego wyjścia).
- Zero:
0lub(spacja) →R = 0,B = 0 - Jeden:
1→R = 1,B = 1 - Krzyż:
+→R = L,B = T - Lustro:
\→R = T,B = L - Tylko najlepsze:
U→R = T,B = T - Tylko w lewo:
)→R = L,B = L - Nie:
!→R = not L,B = not T - I:
&→R = L and T,B = L and T - Lub:
|→R = L or T,B = L or T - Xor:
^→R = L xor T,B = L xor T
Wyzwanie
Napisz program lub funkcję, która przyjmuje prostokątną siatkę znaków 0 1+\U)!&|^reprezentującą „obwód” wykonany przy użyciu dziesięciu logicznych płytek duodyadycznych. Musisz także wziąć dwa ciągi znaków 0i 1; jeden będzie lewą kolumną wejściową, a drugi będzie górnym wierszem wejściowym. Twój program / funkcja musi wydrukować / zwrócić dolny wiersz wyjściowy i prawą kolumnę wyjściową (także w 0's i1 ”).
Na przykład w tej siatce
+++
+++
wszystkie wejścia przepływają prosto przez siatkę do wyjść
ABC
D+++D
E+++E
ABC
więc wejście 010/ 01miałoby wynik 010/ 01:
010
0+++0
1+++1
010
Dokładna wyjście programu będzie [bottom output row]\n[right output column]albo [bottom output row]/[right output column]:
010
01
lub
010/01
Jeśli napisałeś funkcję, możesz zwrócić dwa ciągi w krotce lub liście (lub nadal je wydrukować).
Detale
- Weź trzy dane wejściowe jako ciągi znaków w jakikolwiek rozsądny sposób (najlepiej w tabeli kolejności, górnym rzędzie, lewej kolumnie): wiersz poleceń, plik tekstowy, sdtin, funkcja arg.
- Możesz założyć, że wejściowe długości wierszy i kolumn będą pasować do wymiarów siatki i będą zawierać tylko
0„i1”. - Twoja siatka musi używać odpowiednich znaków (
0 1+\U)!&|^). Pamiętaj o tym0ioznacz to samo.
Przypadki testowe
(Czytaj I / O jako top/ left→ bottom/ right.)
Nand:
&!
00/ 0→ 01/ 1
00/ 1→ 01/ 1
10/ 0→ 01/ 1
10/ 1→ 11/0
Wszystkie:
1111
1\+\
1+\+
1\+\
Każde wejście powinno skutkować 1111/ 1111.
Xor z Nand: (zwróć uwagę na kolumnę końcowych spacji)
\)+\
U&!&
+! !
\&!&
!
00000/ 00000→ 00000/ 00000
00000/ 10000→ 00010/ 00000
10000/ 00000→ 00010/ 00000
10000/ 10000→ 00000/00000
Zig zag:
+++\00000000
000\!!!!\000
00000000\+++
Pierwszy bit lewego wejścia staje się ostatnim bitem prawego wyjścia. Wszystko inne jest 0.
000000000000/ 000→ 000000000000/ 000
000000000000/ 100→ 000000000000/001
Propagacja:
)))
UUU
U+U
U+U
UUU
Pierwszy bit lewego wejścia trafia do wszystkich wyjść.
000/ 00000→ 000/ 00000
000/ 10000→ 111/11111
Oto skrót wszystkich przypadków testowych siatki 1 × 1.
Punktacja
Najkrótsze przesłanie w bajtach wygrywa.
Bonus: Jakie fajne „obwody” możesz zrobić?
PS Nie przejmuj się Googlingiem „duodyadycznymi kafelkami”. Wymyśliłem je wczoraj; D
Jeśli chcesz porozmawiać o rozszerzeniu tego pomysłu na pełnoprawny język programowania, odwiedź ten czat .