Las teselas duodádicas son tipos de bloques de función cuadrados que toman dos entradas, una desde su lado superior y otra desde su lado izquierdo, y tienen dos salidas, una en su lado derecho y otra en su lado inferior. Cada una de sus salidas es una función separada de sus dos entradas.
Por ejemplo, si #
representa un mosaico genérico, la salida derecha R
es una función f
de entradas T
y L
, y la salida inferior B
es otra función g
de T
y L
:
T
L#R R = f(T, L)
B B = g(T, L)
(Los mosaicos se denominan "dúo" ya que hay dos funciones y "diádico" ya que ambas funciones tienen dos argumentos ).
Los mosaicos se pueden componer juntos en una cuadrícula, las salidas de un mosaico van directamente a las entradas de los mosaicos vecinos. Aquí, por ejemplo, la salida derecha de la izquierda #
entra en la entrada izquierda de la derecha #
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Puede imaginar que, dado un conjunto de mosaicos duodádicos, cada uno con una funcionalidad específica, se podrían hacer composiciones complejas (y potencialmente útiles).
En este desafío, solo nos ocuparemos del conjunto tradicional de diez mosaicos duodádicos basados en lógica , donde todas las entradas y salidas son números binarios de un solo bit (ceros o unos). Usaremos un carácter ASCII separado para denotar cada tipo de mosaico.
Los caracteres de mosaico y sus relaciones de entrada-salida son los siguientes:
( T
es para la entrada superior, L
para la entrada izquierda, R
para la salida derecha, B
para la salida inferior).
- Cero:
0
o(espacio) →
R = 0
,B = 0
- Uno:
1
→R = 1
,B = 1
- Cruz:
+
→R = L
,B = T
- Espejo:
\
→R = T
,B = L
- Solo superior:
U
→R = T
,B = T
- Solo izquierda:
)
→R = L
,B = L
- No:
!
→R = not L
,B = not T
- Y:
&
→R = L and T
,B = L and T
- O:
|
→R = L or T
,B = L or T
- Xor:
^
→R = L xor T
,B = L xor T
Reto
Escriba un programa o función que tome en una cuadrícula rectangular de los caracteres 0 1+\U)!&|^
que representa un "circuito" hecho usando los diez mosaicos duodádicos basados en lógica. También necesita tomar dos cadenas de 0
'sy 1
' s; una será la columna de entrada izquierda y la otra será la fila de entrada superior. Su programa / función necesita imprimir / devolver la fila de salida inferior y la columna de salida derecha (también en 0
'sy 1
' s).
Por ejemplo, en esta cuadrícula
+++
+++
todas las entradas fluyen directamente a través de la cuadrícula a las salidas
ABC
D+++D
E+++E
ABC
entonces una entrada de 010
/ 01
tendría salida 010
/ 01
:
010
0+++0
1+++1
010
El resultado exacto de su programa sería [bottom output row]\n[right output column]
o [bottom output row]/[right output column]
:
010
01
o
010/01
Si escribió una función, podría devolver las dos cadenas en una tupla o lista (o aún imprimirlas).
Detalles
- Tome las tres entradas como cadenas de cualquier manera razonable (preferiblemente en la cuadrícula de orden, fila superior, columna izquierda): línea de comando, archivo de texto, sdtin, función arg.
- Puede suponer que las longitudes de fila y columna de entrada coincidirán con las dimensiones de la cuadrícula y solo contendrán
0
'sy1
' s. - Su cuadrícula debe usar los caracteres adecuados (
0 1+\U)!&|^
). Recuerda eso0
ysignifica lo mismo.
Casos de prueba
(Lea E / S como top
/ left
→ bottom
/ right
.)
Nand:
&!
00
/ 0
→ 01
/ 1
00
/ 1
→ 01
/ 1
10
/ 0
→ 01
/ 1
10
/ 1
→ 11
/0
Todos unos:
1111
1\+\
1+\+
1\+\
Cualquier entrada debe resultar en 1111
/ 1111
.
Xor de Nand: (observe la columna de espacios finales)
\)+\
U&!&
+! !
\&!&
!
00000
/ 00000
→ 00000
/ 00000
00000
/ 10000
→ 00010
/ 00000
10000
/ 00000
→ 00010
/ 00000
10000
/ 10000
→ 00000
/00000
Zig zag:
+++\00000000
000\!!!!\000
00000000\+++
El primer bit de la entrada izquierda se convierte en el último bit de la salida derecha. Todo lo demás es 0
.
000000000000
/ 000
→ 000000000000
/ 000
000000000000
/ 100
→ 000000000000
/001
Propagación:
)))
UUU
U+U
U+U
UUU
El primer bit de la entrada izquierda va a todas las salidas.
000
/ 00000
→ 000
/ 00000
000
/ 10000
→ 111
/11111
Aquí hay un pastebin de todos los casos de prueba de cuadrícula 1 × 1.
Tanteo
La presentación más corta en bytes gana.
Bonus: ¿Qué "circuitos" geniales puedes hacer?
PD: No te molestes en buscar en Google "baldosas duodádicas". Los inventé ayer; D
Si quieres discutir expandir esta idea a un lenguaje de programación completo, ven a esta sala de chat .