Os blocos duodádicos são tipos de blocos funcionais quadrados que recebem duas entradas, uma do lado superior e outra do lado esquerdo, e têm duas saídas, uma no lado direito e outra no lado inferior. Cada uma de suas saídas é uma função separada de ambas as entradas.
Por exemplo, se #
representa um bloco genérico, a saída correta R
é uma função f
das entradas T
e L
, e a saída inferior B
é outra função g
de T
e L
:
T
L#R R = f(T, L)
B B = g(T, L)
(Os blocos são denominados "duo", pois existem duas funções, e "diádico", pois as duas funções têm dois argumentos .)
Os ladrilhos podem então ser compostos juntos em uma grade, as saídas de um ladrilho indo diretamente para as entradas dos ladrilhos vizinhos. Aqui, por exemplo, a saída direita da esquerda #
entra na entrada esquerda da direita #
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Você pode imaginar que, dado um conjunto de blocos duodádicos, cada um com funcionalidade específica, composições complexas (e potencialmente úteis) possam ser feitas.
Neste desafio, nos preocuparemos apenas com o conjunto tradicional de dez blocos duodádicos baseados em lógica , em que todas as entradas e saídas são números binários de bit único (zeros ou uns). Usaremos um caractere ASCII separado para denotar cada tipo de bloco.
Os caracteres do bloco e suas relações de entrada e saída são os seguintes:
( T
é para entrada superior, L
entrada esquerda, R
saída direita,B
saída inferior).
- Zero:
0
ou(espaço) →
R = 0
,B = 0
- Um:
1
→R = 1
,B = 1
- Cruz:
+
→R = L
,B = T
- Espelho:
\
→R = T
,B = L
- Somente no topo:
U
→R = T
,B = T
- Apenas à esquerda:
)
→R = L
,B = L
- Não:
!
→R = not L
,B = not T
- E:
&
→R = L and T
,B = L and T
- Ou:
|
→R = L or T
,B = L or T
- Xor:
^
→R = L xor T
,B = L xor T
Desafio
Escreva um programa ou função que 0 1+\U)!&|^
consiga uma grade retangular de caracteres que represente um "circuito" feito usando os dez ladrilhos duodádicos baseados em lógica. Você também precisa inserir duas cadeias de 0
's e 1
' s; uma será a coluna de entrada esquerda e a outra será a linha de entrada superior. Seu programa / função precisa imprimir / retornar a linha de saída inferior e a coluna de saída direita (também em 0
's e1
' s).
Por exemplo, nesta grade
+++
+++
todas as entradas fluem diretamente pela grade para as saídas
ABC
D+++D
E+++E
ABC
portanto, uma entrada de 010
/ 01
teria saída 010
/ 01
:
010
0+++0
1+++1
010
A saída exata do seu programa seria [bottom output row]\n[right output column]
ou [bottom output row]/[right output column]
:
010
01
ou
010/01
Se você escreveu uma função, você pode retornar as duas strings em uma tupla ou lista (ou ainda imprimi-las).
Detalhes
- Pegue as três entradas como seqüências de caracteres de qualquer maneira razoável (de preferência na grade de pedidos, linha superior, coluna esquerda): linha de comando, arquivo de texto, sdtin, função arg.
- Você pode assumir que os comprimentos de linha e coluna de entrada corresponderão às dimensões da grade e conterão apenas
0
's e1
' s. - Sua grade deve usar os caracteres adequados (
0 1+\U)!&|^
). Lembre-se disso0
esignifique a mesma coisa.
Casos de teste
(Leia 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:
1111
1\+\
1+\+
1\+\
Qualquer entrada deve resultar em 1111
/ 1111
.
Xor de Nand: (observe a coluna de espaços finais)
\)+\
U&!&
+! !
\&!&
!
00000
/ 00000
→ 00000
/ 00000
00000
/ 10000
→ 00010
/ 00000
10000
/ 00000
→ 00010
/ 00000
10000
/ 10000
→ 00000
/00000
Ziguezague:
+++\00000000
000\!!!!\000
00000000\+++
O primeiro bit da entrada esquerda se torna o último bit da saída direita. Tudo o resto é 0
.
000000000000
/ 000
→ 000000000000
/ 000
000000000000
/ 100
→ 000000000000
/001
Propagação:
)))
UUU
U+U
U+U
UUU
O primeiro bit da entrada esquerda vai para todas as saídas.
000
/ 00000
→ 000
/ 00000
000
/ 10000
→ 111
/11111
Aqui está uma pasta de todos os casos de teste de grade 1 × 1.
Pontuação
O menor envio em bytes vence.
Bônus: Que "circuitos" legais você pode fazer?
PS: Não se incomode com o Google "azulejos duodádicos". Eu as criei ontem; D
Se você quiser discutir a expansão dessa idéia em uma linguagem de programação completa, venha para esta sala de bate-papo .