Desenhe o diagrama de tempo digital XNOR

12

Abaixo está um diagrama de tempo digital (esquemático) , para a porta lógica XNOR .

    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐       
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐ 
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐   
X ──┘     └───┘ └───┘ └───┘   └────

Seu objetivo é reproduzi-lo exatamente como representado.

Regras:

  • Você pode imprimi-lo ou retornar uma sequência de múltiplas linhas;

  • O número arbitrário de traling e / ou novas linhas principais é permitido;

  • O espaço em branco à direita (mas não à esquerda!) É permitido;

  • Se você não puder usar os caracteres de desenho de caixa ASCII estendidos, poderá substituí-los pelos equivalentes unicode (sem penalidade de bytes).

Isso é então a resposta mais curta em bytes vence.

Representação binária

Para sua conveniência, a representação binária do diagrama acima é a seguinte:

INP A=0101011101010110
INP B=1101101011100101
  ___
X=A⊕B=0111001001001100

Saída de amostra

insira a descrição da imagem aqui

Nota

Enquanto trabalhava nessa questão, implementei duas soluções diferentes para o bash, uma com 122 caracteres / bytes (como mostrado acima), e outra com exatamente 100 bytes.

Não tenho planos de publicá-las (como normalmente não posto respostas para minhas próprias perguntas), então isso é apenas para referência.

Eu também acredito que pelo menos algumas soluções abaixo de 100 bytes são possíveis.

zepelim
fonte
2
Isso é uma porta XNOR, não é ...
clismique
@ Qwerp-Derp Sim, talvez seja :)
zeppelin
2
Em vez de sugerir (0 == 0) == 0, B ou X não começam e terminam em 1?
Roman Czyborra
@ Roman Czyborra Não sei se entendi a idéia, você poderia elaborar um pouco sobre isso?
Zeppelin
1
@ zeppelin Olhe logo no início do padrão - os primeiros dois pixels. A, B e X são todos baixos lá. O mesmo é verdade no final. Por que esse é o caso? (Eu acredito que essa é a pergunta de Roman).
Isaacg

Respostas:

5

05AB1E , 101 bytes + 5 bytes UTF-8 = 116 bytes totais = 106 bytes

(VERSÃO LEGACY 05AB1E, NÃO MAIS NO TIO)

•=(Ín§Àoà`œ¯_eè8y1ÜŸ,Ú®:¹$:,õKA–x[Âì0ãXÔfz}y×ì¹Ï½uEÜ5äÀTë@ºQÈ™ñó:ò…Eä•6B"102345"" ┌─┐└┘"‡6ävyN" A B X"èì}»

Experimente online!

A compactação:

•=(Ín§Àoà`œ¯_eè8y1ÜŸ,Ú®:¹$:,õKA–x[Âì0ãXÔfz}y×ì¹Ï½uEÜ5äÀTë@ºQÈ™ñó:ò…Eä• 
# Pattern, converted to base-6 in base-6=214.

111023102310222223102310231022231112251425142511111425142514251114221022231022231023102222231110231023151114251114251425111114222514251411102222231110231110231110222311111225111114222514222514222511142222
# Actual base-6 pattern.

1110231023102222231023102310222311
1225142514251111142514251425111422
1022231022231023102222231110231023
1511142511142514251111142225142514
1110222223111023111023111022231111
1225111114222514222514222511142222
#Pattern split into chunks of 34.

   ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐  
 ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
 ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
 ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
   ┌─────┐   ┌─┐   ┌─┐   ┌───┐    
 ──┘     └───┘ └───┘ └───┘   └────
# Pattern after replacing 0,1,2,3,4,5 with appropriate blocks.

A conversão:

6B                                   # Convert back to base-6.
  "102345"" ┌─┐└┘"‡                  # Replace numbers with appropriate counterparts.
                   6ä                # Split into 6 equal parts (the rows).
                     vy           }  # For each row (chunk).
                       N" A B X"èì   # Push label at index [i], prepend to line.
                                   » # Print all separated by newlines.

Usando a codificação CP-1252 .

Urna de polvo mágico
fonte
Você pode contar cada caractere de desenho de caixa unicode como apenas 1 byte, para os propósitos deste desafio (consulte "Regras"), portanto, sua resposta tem 106 bytes de comprimento, de acordo com isso. A lógica é que esses caracteres unicode podem ser substituídos por caracteres de 1 byte, por exemplo, no CP437 ou IBM850, mas esses podem ser mais difíceis de exibir.
Zeppelin
Eu concordo com o zeppelin. Dada a concessão dada nas regras, isso seria 106 bytes.
Level River St
Método alternativo que só funciona na nova versão do 05AB1E usando o builtin Åв(eu também tenho atualizado a ponta gerador de ASCII-art com isso): 106 bytes
Kevin Cruijssen
4

Bubblegum , 76 bytes

00000000: 92d6 3000 5431 1505 1403 50e8 4e0a aafc  ..0.T1....P.N...
00000010: 9f62 15e6 a3ff 61fa dc05 e06d 8b66 cbc7  .b....a....m.f..
00000020: e6b6 cff8 519a b85a 3eb6 b67d 95c0 0feb  ....Q..Z>..}....
00000030: 35b5 521d 7f7e 68af a916 fa20 d999 564d  5.R..~h.... ..VM
00000040: 1f03 d559 59ed 265c f243 42be            ...YY.&\.CB.

Experimente online!

Usa caracteres de desenho de caixa do conjunto alternativo de caracteres do VT100, que o TIO não pode demonstrar. Execute em um terminal UNIX para obter melhores resultados. Meu terminal converte o ACS em UTF-8 em copiar e colar, para que você possa ver o efeito aqui.

anders@change-mode:/tmp$ bubblegum xnor.zlib
    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐
X ──┘     └───┘ └───┘ └───┘   └────
▒┼␍␊⎼⎽@␌␤▒┼±␊-└⎺␍␊:/├└⎻$ 

Bem, o desafio não disse que precisa tomar a parte de trás do terminal para fora de modo ACS antes de retornar para o shell. Boa sorte com isso.

Anders Kaseorg
fonte
3

Ruby, 113 bytes

contando símbolos impressos como um byte, conforme autorizado pelo desafio (fiquei surpreso ao descobrir que na verdade são 3 bytes).

6.times{|i|s=' A B X'[i]
'D]zunIWkF]nIRukFH'.bytes{|b|s+='   ┌─┐───┘ └'[(b*2>>i/2*2&6)-i%2*6,2]}
s[1]=' '
puts s}

6 linhas de saída se prestam a uma codificação de 6 bits por cada caractere da string mágica. Mas os caracteres da string mágica, na verdade, codificam para cada transição assim:

least significant bit 0 New value for A  
                      1 Current value for A
                      2 New value for B
                      3 Current value for B
                      4 New value for X
                      5 Current value for X
most significant bit  6 Always 1 (to remain in printable range)

Isso é decodificado para localizar os 2 caracteres que devem ser impressos para cada transição (o primeiro é espaço ou uma linha horizontal.) As cadeias de caracteres de 8 caracteres para as linhas superior e inferior se sobrepõem: Os dois últimos caracteres da linha superior 11são duas linhas horizontais, que correspondem ao que é necessário para os dois primeiros caracteres da linha inferior 00. Os 8 caracteres da linha inferior são agrupados: são os últimos 6 e os 2 primeiros caracteres da sequência de símbolos.

Código ungolfed

6.times{|i|s=' A B X'[i]               #iterate through 6 lines of output. Set s to the 1st character.
  'D]zunIWkF]nIRukFH'.bytes{|b|        #for each byte in the magic string
     s+='   ┌─┐───┘ └'[(b*2>>i/2*2&6)- #add 2 bytes to s, index 0,2,4, or 6 of the symbol string depending on relevant 2 bits of the magic string.
     i%2*6,2]                          #if the second (odd) row of a particular graph, modify index to -6,-4,-2, or 0 
  }                                    #(ruby indices wrap around. mystring[-1] is the last character of the string.)
  s[1]=' '                             #replace intitial ─ of the curve with space to be consistent with question
  puts s                               #output line
}
Level River St
fonte
Na verdade, são 129 bytes, 113 caracteres.
Magic Octopus Urn
1
@carusocomputing Vejo que você fez o mesmo comentário na maioria das respostas aqui. Por favor, consulte a primeira linha do meu aviso e a regra 4 do OP: If you can not use the extended ASCII box-drawing characters, you may substitute them for the unicode equivalents (at no byte penalty)Todos nós pontuamos nossas respostas de acordo com as regras.
Level River St
2

PowerShell, 255 caracteres, 265 bytes (UTF-8)

$a='    012 012 0111112 012 012 01112
A 113 413 413     413 413 413   411
  01112 01112 012 0111112   012 012
B 3   413   413 413     41113 413 4
    0111112   012   012   01112
X 113     41113 41113 41113   41111'
0..4|%{$a=$a-replace$_,('┌─┐┘└'[$_])};$a

Isso funciona no meu computador, mas não parece analisar os bytes corretamente no TIO ...

captura de tela

Isso define $acomo uma sequência de várias linhas preenchida com números e espaços e, em seguida, faz um loop 0..4|%{...}. A cada iteração, obtemos -replaceo dígito apropriado $_com o caractere apropriado '┌─┐┘└'[$_]e o armazenamos novamente $a. Em seguida, deixamos $ao pipeline e a produção está implícita.

AdmBorkBork
fonte
Você tem permissão para contar os caracteres Unicode como bytes individuais, de acordo com o desafio
FlipTack
2

JavaScript (ES6), 163 158 154 bytes

Nota: contando caracteres UTF-8 como bytes, conforme autorizado pelo desafio.

_=>[..." A B X"].map((c,i)=>c+" "+[...Array(33)].map((_,j)=>j%2?" ─"[p^i&1]:" ┐┌─└┘ "[p+(p=[27370,42843,12878][i>>1]>>j/2&1)*2+i%2*3]).join``,p=0).join`
`

Demo

Guardado 4 bytes graças a Neil

Arnauld
fonte
j%2?" ─"[p^i&1]:" ┐┌─└┘ "[p+(p=[27370,42843,12878][i>>1]>>j/2&1)*2+i%2*3]salva 3 bytes.
Neil
Ah, e mude de 17 para 33 também.
Neil
Mais uma vez, 152 caracteres, 164 bytes.
Magic Octopus Urn
2

C, 213 205 bytes

Para variar, o tamanho do programa C, nesse desafio, não é completamente ridículo comparado a outros idiomas.

#define X(a) u[i]=C[a],l[i++]=C[(a)+4]
p(n,c){char u[34],l[34],*C=" ┐┌──└┘ ",i=0;while(i<34)X(n&3),n>>=1,X((n&1)*3);printf("  %.33s\n%c %.33s\n",u,c,l);}main(){p(0xD5D4,'A');p(0x14EB6,'B');p(0x649C,'X');}

Sem jogar, definir expandido e comentar:

p(n,c){
    // u is the upper line of the graph, l the lower line
    char u[34],l[34],*C=" ┐┌──└┘ ",i=0;
    while(i<34)
        u[i]=C[n&3],            // using the two LSBs to set the transition char depending on the current and next state
        l[i++]=C[(n&3)+4],      // do for both upper and lower lines
        n>>=1,                  // shift bits right to go to next state
        u[i]=C[(n&1)*3],        // using only the LSB to set the "steady" char depending on current state only
        l[i++]=C[((n&1)*3)+4];  // do for both upper and lower lines
    printf("  %.33s\n%c %.33s\n",u,c,l);
}
main() {
    // Call p for each graph
    // Constants are chosen so the display is consistent with the request.
    // Each bit represents a state, but the order is reversed
    // (leftmost is put on lowest significant bit, after a 0)
    p(0xD5D4,'A');p(0x14EB6,'B');p(0x649C,'X');
}

Nota: a cadeia C não deve conter caracteres unicode. Todos os caracteres exibidos devem ser caracteres simples de 8 bits antigos (mas podem ser escolhidos no intervalo estendido). Então, basicamente, a validade da saída depende da sua página de código.

pouca fé perdida no SE
fonte
1

tcl, 221 caracteres, 299 bytes

lmap {b _ n u A V} {"   " ┌─────┐ ┌───┐ └───┘ ┌─┐ └─┘} {puts "[set S \ $b][set m $A\ $A] $_ $m $n
A ──┘ [set w $V\ $V][set s \ $S]$w $V$b└──
  $n $n $A $_$b$m
B ┘$b$V$b$w$s$u $V └
$S$_$b$A$b$A$b$n
X ──┘$s$u $u $u$b└────"}

pode ser executado em: http://rextester.com/live/VVQU99270

sergiol
fonte
228 caracteres, no entanto, são 306 bytes.
Magic Octopus Urn
@carusocomputing: Qual ferramenta on-line você usa para contar bytes em vez de caracteres? Tks adiantado.
sergiol 14/01
mothereff.in/byte-counter
Magia Octopus Urna