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 R
jest funkcją f
wejść T
i L
, a dno wyjście B
to kolejna funkcja g
of T
a 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:
( T
dotyczy górnego wejścia, L
lewego wejścia, R
prawego wyjścia, B
dolnego wyjścia).
- Zero:
0
lub(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 0
i 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
/ 01
miał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 tym0
ioznacz 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 .