Disegna il diagramma temporale digitale XNOR


12

Di seguito è riportato un diagramma di schema digitale (schematico) , per la porta logica XNOR .

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

Il tuo obiettivo è riprodurlo esattamente come rappresentato.

Regole:

  • Puoi stamparlo o restituire una stringa multilinea;

  • È consentito il numero arbitrario di traling e / o newline principali;

  • È consentito lo spazio bianco finale (ma non in testa!);

  • Se non è possibile utilizzare i caratteri estesi di disegno a scatola ASCII, è possibile sostituirli con gli equivalenti unicode (senza penalità di byte).

Questo è quindi vince la risposta più breve in byte.

Rappresentazione binaria

Per comodità, la rappresentazione binaria del diagramma sopra è la seguente:

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

Uscita campione

inserisci qui la descrizione dell'immagine

Nota a margine

Mentre lavoro su questa domanda, ho implementato due diverse soluzioni bash per esso, una lunga 122 caratteri / byte (come illustrato sopra) e un'altra lunga esattamente 100 byte.

Non ho intenzione di pubblicarli (dato che normalmente non pubblico risposte alle mie domande), quindi è solo per riferimento.

Credo anche che siano possibili almeno alcune soluzioni con valori inferiori a 100 byte.


2
Quello è un cancello XNOR, no ...
Clismique,

@ Qwerp-Derp Sì, forse lo è :)
zeppelin

2
Invece di suggerire (0 == 0) == 0 o B o X non iniziano e finiscono con 1?
Roman Czyborra,

@Roman Czyborra Non sono sicuro di aver capito l'idea, potresti approfondire un po 'questo?
Zeppelin,

1
@zeppelin Guarda esattamente all'inizio del modello: i primi due pixel. A, B e X sono tutti bassi lì. Lo stesso vale alla fine. Perché è così? (Credo che questa sia la domanda di Roman).
Isaacg,

Risposte:


5

05AB1E , 101 byte + 5 UTF-8 byte = 116 Byte totali = 106 byte

(VERSIONE LEGACY 05AB1E, NON PIÙ SU TIO)

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

Provalo online!

La compressione:

•=(Í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.

La conversione:

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.

Utilizzo della codifica CP-1252 .


Puoi contare ogni carattere di disegno a scatola unicode come solo 1 byte, ai fini di questa sfida (vedi "Regole"), quindi la tua risposta è lunga 106 byte secondo questo. La logica è che questi caratteri unicode possono essere sostituiti con caratteri a 1 byte, ad esempio in CP437 o IBM850, ma questi possono essere più difficili da visualizzare.
Zeppelin,

Sono d'accordo con lo zeppelin. Data la concessione data nelle regole, si tratterebbe quindi di 106 byte.
Level River St

Metodo alternativo che funziona solo nella nuova versione di 05AB1E usando il builtin Åв(ho anche aggiornato il suggerimento del generatore di arte ASCII con questo): 106 byte
Kevin Cruijssen

4

Bubblegum , 76 byte

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.

Provalo online!

Utilizza caratteri di disegno a tratteggio dal set di caratteri alternativo VT100, che TIO non può dimostrare. Esegui in un terminale UNIX per i migliori risultati. Il mio terminale converte l'ACS in UTF-8 su copia e incolla, quindi puoi vedere l'effetto qui.

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

Bene, la sfida non ha detto che dobbiamo riportare il terminale fuori dalla modalità ACS prima di tornare alla shell. Buona fortuna.


3

Rubino, 113 byte

contando i simboli stampati come un byte come autorizzato dalla sfida (sono stato sorpreso di scoprire che in realtà sono 3 byte).

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 righe di output si prestano a una codifica di 6 bit per ogni carattere della stringa magica. Ma i caratteri della stringa magica in realtà codificano per ogni transizione così:

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)

Questo viene decodificato per trovare i 2 caratteri che devono essere stampati per ogni transizione (il primo dei quali è uno spazio o una linea orizzontale). Le stringhe di 8 caratteri per le righe superiore e inferiore si sovrappongono: gli ultimi due caratteri per la riga superiore 11sono due linee orizzontali, che corrispondono a ciò che è necessario per i primi due caratteri della riga inferiore 00. Gli 8 caratteri per la riga inferiore si avvolgono: sono gli ultimi 6 e i primi 2 caratteri della stringa del simbolo.

Codice 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
}

Si tratta in realtà di 129 byte, 113 caratteri.
Magic Octopus Urn

1
@carusocomputing Vedo che hai fatto lo stesso commento sulla maggior parte delle risposte qui. Si prega di fare riferimento alla prima riga della mia risposta e alla regola 4 del PO: If you can not use the extended ASCII box-drawing characters, you may substitute them for the unicode equivalents (at no byte penalty)tutti abbiamo assegnato un punteggio alle nostre risposte secondo le regole.
Level River St

2

PowerShell, 255 caratteri, 265 byte (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

Funziona sul mio computer, ma non sembra analizzare correttamente i byte su TIO ...

immagine dello schermo

Imposta $auna stringa a più righe piena di numeri e spazi, quindi passa 0..4|%{...}. Ogni iterazione, abbiamo -replacela cifra appropriata $_con il carattere appropriato '┌─┐┘└'[$_]e la memorizziamo nuovamente in $a. Quindi, lasciamo $asulla pipeline e l'output è implicito.


Puoi contare i caratteri Unicode come byte singoli, in base alla sfida
FlipTack

2

JavaScript (ES6), 163 158 154 byte

NB: contando i caratteri UTF-8 come byte, come autorizzato dalla sfida.

_=>[..." 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`
`

dimostrazione

Risparmiato 4 byte grazie a Neil


j%2?" ─"[p^i&1]:" ┐┌─└┘ "[p+(p=[27370,42843,12878][i>>1]>>j/2&1)*2+i%2*3]salva 3 byte.
Neil,

Oh, e cambia anche da 17 a 33.
Neil,

Ancora una volta, 152 caratteri, 164 byte.
Magic Octopus Urn

2

C, 213 205 byte

Per una modifica, la dimensione del programma C, in questa sfida, non è completamente ridicola rispetto ad altre lingue.

#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');}

Non golfato, definito espanso e commentato:

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: la stringa C non deve contenere caratteri unicode. Tutti i caratteri visualizzabili devono essere semplici caratteri a 8 bit (ma possono essere scelti nell'intervallo esteso). Quindi, fondamentalmente, la validità dell'output dipende dalla tua tabella codici.


1

tcl, 221 caratteri, 299 byte

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└────"}

può essere eseguito su: http://rextester.com/live/VVQU99270


228 caratteri, tuttavia è 306 byte.
Magic Octopus Urn

@carusocomputing: quale strumento online usi per contare i byte anziché i caratteri? Tks in anticipo.
sergiol

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.