Le tessere duodadiche sono tipi di blocchi funzionali quadrati che accettano due ingressi, uno dal lato superiore e uno dal lato sinistro, e hanno due uscite, uno sul lato destro e uno sul lato inferiore. Ciascuno dei loro output è una funzione separata di entrambi i loro input.
Ad esempio, se #
rappresenta una piastrella generico, l'uscita di destra R
è una funzione f
degli ingressi T
e L
, e l'uscita inferiore B
è un'altra funzione g
di T
e L
:
T
L#R R = f(T, L)
B B = g(T, L)
(Le tessere sono chiamate "duo" poiché ci sono due funzioni e "diadica" poiché entrambe le funzioni hanno due argomenti .)
Le tessere possono quindi essere composte insieme su una griglia, le uscite di una tessera vanno direttamente negli ingressi delle tessere vicine. Qui ad esempio, l'output destro di sinistra #
va nell'input sinistro di destra #
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Puoi immaginare che, dato un insieme di tessere duodadiche, ognuna con funzionalità specifiche, si possano creare composizioni complesse (e potenzialmente utili).
In questa sfida, ci occuperemo solo dell'insieme tradizionale di dieci riquadri duodadici basati sulla logica , in cui tutti gli ingressi e le uscite sono numeri binari a bit singolo (zeri o uno). Useremo un carattere ASCII separato per indicare ogni tipo di riquadro.
I caratteri del riquadro e le loro relazioni input-output sono i seguenti:
( T
è per l'input superiore, L
per l'input sinistro, R
per l'output destro, B
per l'output inferiore).
- Zero:
0
o(spazio) →
R = 0
,B = 0
- Uno:
1
→R = 1
,B = 1
- Croce:
+
→R = L
,B = T
- Specchio:
\
→R = T
,B = L
- Solo in alto:
U
→R = T
,B = T
- Solo a sinistra:
)
→R = L
,B = L
- Non:
!
→R = not L
,B = not T
- E:
&
→R = L and T
,B = L and T
- Oppure:
|
→R = L or T
,B = L or T
- Xor:
^
→R = L xor T
,B = L xor T
Sfida
Scrivi un programma o una funzione che 0 1+\U)!&|^
includa una griglia rettangolare di caratteri che rappresenta un "circuito" realizzato usando le dieci tessere duodadiche basate sulla logica. Devi anche prendere due stringhe di 0
'e 1
'; uno sarà la colonna di input a sinistra e uno sarà la riga di input in alto. Il programma / funzione deve stampare / restituire la riga di output in basso e la colonna di output a destra (anche in 0
'se 1
').
Ad esempio, in questa griglia
+++
+++
tutti gli ingressi scorrono direttamente attraverso la griglia verso le uscite
ABC
D+++D
E+++E
ABC
quindi un input di 010
/ 01
avrebbe output 010
/ 01
:
010
0+++0
1+++1
010
L'output esatto del tuo programma sarebbe [bottom output row]\n[right output column]
o [bottom output row]/[right output column]
:
010
01
o
010/01
Se hai scritto una funzione, potresti restituire le due stringhe in una tupla o in un elenco (o comunque stamparle).
Dettagli
- Prendi i tre input come stringhe in qualsiasi modo ragionevole (preferibilmente nella griglia dell'ordine, nella riga superiore, nella colonna di sinistra): riga di comando, file di testo, sdtin, funzione arg.
- Puoi presumere che le lunghezze delle righe e delle colonne di input corrispondano alle dimensioni della griglia e conterranno solo
0
"e1
". - La griglia deve utilizzare i caratteri appropriati (
0 1+\U)!&|^
). Ricordalo0
eintendi la stessa cosa.
Casi test
(Leggi I / O come top
/ left
→ bottom
/ right
.)
Nand:
&!
00
/ 0
→ 01
/ 1
00
/ 1
→ 01
/ 1
10
/ 0
→ 01
/ 1
10
/ 1
→ 11
/0
Tutti quelli:
1111
1\+\
1+\+
1\+\
Qualsiasi input dovrebbe risultare in 1111
/ 1111
.
Xor di Nand: (nota la colonna degli spazi finali)
\)+\
U&!&
+! !
\&!&
!
00000
/ 00000
→ 00000
/ 00000
00000
/ 10000
→ 00010
/ 00000
10000
/ 00000
→ 00010
/ 00000
10000
/ 10000
→ 00000
/00000
Zig zag:
+++\00000000
000\!!!!\000
00000000\+++
Il primo bit dell'ingresso sinistro diventa l'ultimo bit dell'uscita destra. Tutto il resto è 0
.
000000000000
/ 000
→ 000000000000
/ 000
000000000000
/ 100
→ 000000000000
/001
Propagazione:
)))
UUU
U+U
U+U
UUU
Il primo bit dell'ingresso sinistro va a tutte le uscite.
000
/ 00000
→ 000
/ 00000
000
/ 10000
→ 111
/11111
Ecco un esempio di tutti i casi di test della griglia 1 × 1.
punteggio
Vince l' invio più breve in byte .
Bonus: quali "circuiti" fantastici puoi realizzare?
PS Non preoccuparti di googling "tessere duodadiche". Li ho inventati ieri; D
Se vuoi discutere di espandere questa idea in un linguaggio di programmazione completo, vieni in questa chat .