Duodyadische Kacheln sind Arten von quadratischen Funktionsblöcken , die zwei Eingänge (einen von oben und einen von links) und zwei Ausgänge (einen von rechts und einen von unten) haben. Jeder ihrer Ausgänge ist eine separate Funktion für beide Eingänge.
Wenn beispielsweise #
eine generische Kachel dargestellt wird, ist die rechte Ausgabe R
eine Funktion f
der Eingaben T
und L
und die untere Ausgabe B
eine weitere Funktion g
von T
und L
:
T
L#R R = f(T, L)
B B = g(T, L)
(Die Kacheln werden als "Duo" bezeichnet, da es zwei Funktionen gibt, und als "dyadisch", da beide Funktionen zwei Argumente haben .)
Kacheln können dann in einem Raster zusammengesetzt werden, wobei die Ausgaben einer Kachel direkt in die Eingaben der benachbarten Kacheln fließen. Hier geht zum Beispiel die rechte Ausgabe der linken #
in die linke Eingabe der rechten #
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Sie können sich vorstellen, dass mit einer Reihe von duodyadischen Kacheln mit jeweils spezifischen Funktionen komplexe (und möglicherweise nützliche) Kompositionen erstellt werden könnten.
In dieser Herausforderung werden wir uns nur mit dem traditionellen Satz von zehn logikbasierten duodyadischen Kacheln befassen, bei denen alle Ein- und Ausgänge Einzelbit-Binärzahlen (Nullen oder Einsen) sind. Wir verwenden ein separates ASCII-Zeichen, um jeden Kacheltyp zu kennzeichnen.
Die Kachelzeichen und ihre Eingabe-Ausgabe-Beziehungen lauten wie folgt:
( T
gilt für die obere Eingabe, L
für die linke Eingabe, R
für die rechte Ausgabe, B
für die untere Ausgabe.)
- Null:
0
oder(Leerzeichen) →
R = 0
,B = 0
- Eins:
1
→R = 1
,B = 1
- Kreuz:
+
→R = L
,B = T
- Spiegel:
\
→R = T
,B = L
- Nur oben:
U
→R = T
,B = T
- Nur links:
)
→R = L
,B = L
- Nicht:
!
→R = not L
,B = not T
- Und:
&
→R = L and T
,B = L and T
- Oder:
|
→R = L or T
,B = L or T
- Xor:
^
→R = L xor T
,B = L xor T
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die ein rechteckiges Raster der Zeichen enthält 0 1+\U)!&|^
, das eine "Schaltung" darstellt, die mit den zehn duodyadischen Kacheln auf Logikbasis erstellt wurde. Sie müssen auch zwei Folgen von 0
's und 1
' s aufnehmen; Eine wird die linke Eingabespalte sein und eine wird die obere Eingabezeile sein. Ihr Programm / Ihre Funktion muss die unterste Ausgabezeile und die rechte Ausgabespalte (auch in 0
's und 1
' s) drucken / zurückgeben .
Zum Beispiel in diesem Raster
+++
+++
Alle Eingänge fließen direkt über das Netz zu den Ausgängen
ABC
D+++D
E+++E
ABC
Ein Eingang von 010
/ 01
hätte also einen Ausgang von 010
/ 01
:
010
0+++0
1+++1
010
Die genaue Ausgabe Ihres Programms wäre [bottom output row]\n[right output column]
oder [bottom output row]/[right output column]
:
010
01
oder
010/01
Wenn Sie eine Funktion geschrieben haben, können Sie die beiden Zeichenfolgen in einem Tupel oder einer Liste zurückgeben (oder sie trotzdem drucken).
Einzelheiten
- Nehmen Sie die drei Eingaben in einer angemessenen Weise als Zeichenfolge (vorzugsweise in der Reihenfolge Tabelle, obere Zeile, linke Spalte): Befehlszeile, Textdatei, SDTIN, Funktion arg.
- Sie können davon ausgehen, dass die Länge der Eingabezeilen und -spalten mit den Rastermaßen übereinstimmt und nur
0
's und1
' s enthält. - Ihr Raster muss die richtigen Zeichen enthalten (
0 1+\U)!&|^
). Denken Sie daran0
undmeinen Sie dasselbe.
Testfälle
(Lese I / O als top
/ left
→ bottom
/ right
.)
Nand:
&!
00
/ 0
→ 01
/ 1
00
/ 1
→ 01
/ 1
10
/ 0
→ 01
/ 1
10
/ 1
→ 11
/0
Alle:
1111
1\+\
1+\+
1\+\
Jede Eingabe sollte zu 1111
/ führen 1111
.
Xor from Nand: (Beachten Sie die Spalte mit den nachgestellten Leerzeichen)
\)+\
U&!&
+! !
\&!&
!
00000
/ 00000
→ 00000
/ 00000
00000
/ 10000
→ 00010
/ 00000
10000
/ 00000
→ 00010
/ 00000
10000
/ 10000
→ 00000
/00000
Zick-Zack:
+++\00000000
000\!!!!\000
00000000\+++
Das erste Bit des linken Eingangs wird zum letzten Bit des rechten Ausgangs. Alles andere ist 0
.
000000000000
/ 000
→ 000000000000
/ 000
000000000000
/ 100
→ 000000000000
/001
Vermehrung:
)))
UUU
U+U
U+U
UUU
Das erste Bit des linken Eingangs geht an alle Ausgänge.
000
/ 00000
→ 000
/ 00000
000
/ 10000
→ 111
/11111
Hier ist ein Pastebin aller 1 × 1-Rastertestfälle.
Wertung
Die kürzeste Übermittlung in Bytes gewinnt.
Bonus: Welche coolen "Circuits" kannst du machen?
PS: Googeln Sie nicht mit "duodyadischen Kacheln". Ich habe sie gestern erfunden. D
Wenn Sie darüber diskutieren möchten, wie Sie diese Idee zu einer vollwertigen Programmiersprache erweitern können, besuchen Sie diesen Chatroom .