Filiali binarie


15

Dato un numero binario, il tuo compito è creare un 'ramo' di quel numero, con una profondità di 2.

Ad esempio, dato 0come input, dovresti generare esattamente questo:

     /000
  /00
 /   \001
0
 \   /010
  \01
     \011

Questo dovrebbe essere abbastanza autoesplicativo su come dovrebbero essere creati i rami. Profondità 2 significa che calcoliamo le diramazioni per numeri fino a 2 numeri più lunghi. Calcoliamo anche i rami in ordine, con gli zeri in alto e quelli in basso.

Altri casi di test:

0

     /000
  /00
 /   \001
0
 \   /010
  \01
     \011

1

     /100
  /10
 /   \101
1
 \   /110
  \11
     \111

00

       /0000
   /000
  /    \0001
00
  \    /0010
   \001
       \0011

01

       /0100
   /010
  /    \0101
01
  \    /0110
   \011
       \0111

10

       /1000
   /100
  /    \1001
10
  \    /1010
   \101
       \1011

11

       /1100
   /110
  /    \1101
11
  \    /1110
   \111
       \1111

Regole

  • Non riceverai mai caratteri nell'input diversi da 1e 0.
  • 0 < length of input < 11.
  • Spazio bianco finale consentito alla fine delle linee.

4
0 < length of input < 11è 11decimale o binario? : P
ETHproductions

@ETHproductions Decimal: P
Okx

Risposte:


4

Gelatina , 39 38 byte

L⁶ẋ,W;“/0¶\1 ”ṃ@“ð&ẏ{×ẏĊfẏȷ®ỤṪ⁻ʠaƇGⱮȷ’

Provalo online!

Come?

L'arte da stampare è:

L  L /N00
L /N0
L/ L \N01
N
L\ L /N10
L \N1
L  L \N11

Dove si Ntrova la stringa di input ed Lè una stringa di spazi della lunghezza della stringa di input.

Come tale è costituito da otto componenti ( L, N, /, 0, il carattere di nuova riga, \, 1, e il carattere di spazio) e pertanto possono essere memorizzati come numero in base 8 (che può essere compresso come numero in base 250 in gelatina). L' atomo combina la conversione di base e l'indicizzazione in un elenco (in effetti si possono definire cifre arbitrarie da utilizzare).

L⁶ẋ,W;“/0¶\1 ”ṃ@“ð&ẏ{×ẏĊfẏȷ®ỤṪ⁻ʠaƇGⱮȷ’ - Main link: binary string s  e.g. "100"
 ⁶                                     - space character
  ẋ                                    - repeat by:
L                                      -     length(s)                    [' ',' ',' ']
    W                                  - wrap s in a list                 [['1','0','0']]
   ,                                   - pair               [[' ',' ',' '],['1','0','0']]
      “/0¶\1 ”                         - char list: ['/','0',<newline>,'\',','1',' ']

     ;                                 - concatenate        [[' ',' ',' '],['1','0','0'],'/','0',<newline>,'\',','1',' ']
                “ð&ẏ{×ẏĊfẏȷ®ỤṪ⁻ʠaƇGⱮȷ’ - base 250 number: 91531517467460683226372755994113932025707662527
              ṃ@                       - base decompression [reversed @arguments]
                                        -     this uses the concatenated list above as
                                        -     the 8 digits of that number in base 8.
                                        - implicit print

5

Lotto, 178 170 159 byte

@set/pb=
@set s=%b:0= %
@set s=%s:1= %
@set e=@echo %s%
%e%  %s% /%b%00
%e% /%b%0
%e%/ %s% \%b%01
@echo %b%
%e%\ %s% /%b%10
%e% \%b%1
%e%  %s% \%b%11

Modifica: salvato 11 byte grazie a @ ConorO'Brien.


Conto solo 149 byte .
Ingegnere Toast,

Presumo che Neil stia contando le interruzioni di riga come CRLF in stile Windows, mentre TIO le sta contando come LF. Non sono sicuro che LF funzioni per Batch su Windows.
Alex A.

4

JavaScript (ES6), 112 byte

s=>`22   /300
2 /30
2/2  4301
3
242  /310
2 431
22   4311`.replace(/./g,n=>[s.replace(/./g,' '),s,'\\'][n-2]||n)

dimostrazione


perchè no [n,n,s.replace(/./g,' '),s,'\\'][n]?
TSH

@tsh Ciò richiederebbe /\d/gpiuttosto che /./gignorare caratteri non numerici.
Arnauld,

4

Python 3 , 117 109 byte

lambda k:'ll   /g00\nl /g0\nl/l  \g01\ng\nl\l  /g10\nl \g1\nll   \g11'.replace('l',' '*len(k)).replace('g',k)

Provalo online!

  • salvato 8 byte grazie a JonathanAllan (Uso della funzione lambda)

La stringa di formato stampata appare come:

ll   /g00
l /g0
l/l  \g01
g
l\l  /g10
l \g1
ll   \g11

Questo sembra già buono per una stringa di lunghezza di 1. Tutto quello che dobbiamo fare è sostituire l con spazi di lunghezza pari a quello di g e, ovviamente, g deve essere sostituito dalla stringa originale


1
È possibile salvare un byte utilizzando un lambda senza nome, il che significa anche che è possibile eliminare la stampa (poiché la restituzione della stringa dovrebbe essere accettabile) e salvare altri sette byte. Puoi quindi salvarne altri due usando una stringa multilinea che ti porta a 107 ... TIO
Jonathan Allan

4

Python 3.6, 172 153 128 byte

Letteralmente non diventa più semplice di così ... Questo è in realtà più breve del mio tentativo originale di generarlo con un algoritmo. Che triste.

k=input()
l=len(k)
b=' '*l
print(f'{b*2}   /{k}00\n{b} /{k}0\n{b}/ {b}\\{k}01\n{k}\n{b}\\ {b}/{k}10\n{b} \\{k}1\n{b*2} \\{k}01')

-19 byte grazie a @Leo
-25 byte grazie a @ L3viathan


Penso che sarebbe più breve rilasciare a, c e d, e usare solo b e spazi nella stringa finale. (a is b*2+' ')
Leone

Strano, mi sembra ancora 172 byte.
programmatore

@ programmer5000 Spiacente, sarebbe perché ho dimenticato di aggiornare il codice stesso.
HyperNeutrino

Salva 26 caratteri con stringhe di formato:print(f'{a}/{k}00\n{b} /{k}0\n{b}/ {b}\\{k}01\n{k}\n{b}\\ {b}/{k}10\n{b} \\{k}1\n{b*2} \\{k}01')
L3viathan,

@ L3viathan Puoi verificarne la sintassi? Mi sta dando un errore di sintassi.
HyperNeutrino,

3

C, 170 168 byte

Grazie a @Neil per aver salvato due byte!

n;f(char*s){n=strlen(s);printf("%*c%s00\n%*c%s0\n %*c%*c%s01\n%s\n %*c%*c%s10\n%*c%s1\n%*c%s11",2*n+4,47,s,n+2,47,s,n,47,n+3,92,s,s,n,92,n+3,47,s,n+2,92,s,2*n+4,92,s);}

Provalo online!


1
Invece di stampare a /o ` padded to width n + 1 , why not print a space, and then a / `o \imbottito in larghezza n?
Neil,

Fammi provare ancora. Invece di stampare una /o \imbottita in larghezza n+1, perché non stampare uno spazio e quindi una /o \imbottita in larghezza n?
Neil,

3

Python 3 , 96 byte

lambda s:"""   /00
 /0
/  \01

\  /10
 \1
   \11""".translate([s,' '*len(s),s])

Provalo online! I caratteri non stampabili non vengono visualizzati correttamente; il formato stringa è lo stesso di officialaimm , ma con \x01for le \x02for g.

ll   /g00
l /g0
l/l  \g01
g
l\l  /g10
l \g1
ll   \g11

Utilizza la sostituzione di stringhe con Python 3 flessibiletranslate . L'elenco di traduzioni è [s,' '*len(s),s]mappato \x01su ' '*len(s)e \x02su s. I caratteri più grandi restano invariati perché forniscono indici fuori limite per l'elenco. \x00non può essere utilizzato perché un byte null viene letto come fine del programma, quindi la prima voce viene sprecata.



2

Impilato , 81 byte

{!n#'' '*@s's  s /n00
s /n0
s/ s \n01
n
s\ s /n10
s \n1
s  s \n11' '\l'$#~1/repl}

Provalo online!

Purtroppo non molto interessante. Ecco la parte più interessante:

'\l'$#~1/repl
         repl     replace all
'\l'              letters
    $#~           by evaluating
       1/         over one argument (otherwise, it would evaluate the "last" thingy)

Fondamentalmente si tratta di interpolazione di stringhe, ma 10 byte più brevi di quelli incorporati.


2

/// , 116 byte

/[/\\\///x///*/[y\\0[ y\/\/y\\1[ y\//**********/y///s/yx//~/  /~ ss[x00
 s[x0
s[~s\\x01
x
s\\~s[x10
 s\\x1
~ ss\\x11

Provalo online!

L'input è il seguente:

/[/\\\///x/INPUT HERE!!!!!!!!//*/[y\\0[ y\/\/y\\1[ y\//**********/y///s/yx//~/  /~ ss[x00
 s[x0
s[~s\\x01
x
s\\~s[x10
 s\\x1
~ ss\\x11

Funziona utilizzando un modello di base e aggiungendo spazi e caratteri dove necessario.

Il conteggio dei byte è aumentato perché Ørjan Johansen ha capito che all'inizio non gestiva la spaziatura. Ma il problema è noto risolto.


Ti ho dato un voto prima di verificare che funzionasse, ma non stai regolando la distanza per la lunghezza. Non vedo un modo sintetico per farlo con un formato di input così letterale.
Ørjan Johansen,

O aspetta, non è del tutto senza speranza poiché c'è un limite di lunghezza in ingresso di 11.
Ørjan Johansen

Qualcosa del genere /*/\/y0\/ y\/\/y1\/ y\//**********/y///s/yx/e poi ti diverti s.
Ørjan Johansen,

@ ØrjanJohansen Oops, ho dimenticato di spaziare ... grazie. Come avrei incorporato il tuo codice nella risposta?
Compagno SparklePony,

FWIW /00/0|0//01/0|1//10/1|0//11/1|1//|/<\\y>//z/<y>x//<y>0/ //<y>1/ //<\\y\>///s/z/può gestire lunghezza arbitraria.
Ørjan Johansen,

1

Python 2 , 101,91 byte 113 byte

lambda y:'   ++/_00\n +/_0\n+/  +\\_01\n_\n+\\  +/_10\n +\\_1\n   ++\\_11'.replace('_',y).replace('+',' '*len(y))

Provalo online!

L'input è una stringa di 0 e 1 di lunghezza 1 o 2! Sono 0,01,10 o 11!

+12 byte - corretta la spaziatura in \ per input di lunghezza due.


3
l'output non viene regolato in base alla lunghezza della stringa.
officialaimm,

1
... e la domanda specifica " 0 < length of input < 11".
Jonathan Allan,

1
@officialaimm oh yeah. Appena notato. Grazie. Aggiornerò la mia risposta! Jonathan .. quello era un errore di battitura. Grazie l'ho corretto.
Keerthana Prabhakaran,

0

Carbone , 34 byte

P<³←⮌θF²«J³⁻×⁴ι²θP<²Iι↗F²«P⁺⁺θικ↓↓

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

P<³

Stampa le coppie di sinistra di / s e \s.

←⮌θ

Stampa l'ingresso giustificato a destra nella posizione corrente.

F²«

Passa attraverso i rami.

J³⁻×⁴ι²

Sposta la posizione del ramo. Possiamo farlo perché la radice è stata stampata giustificata a destra in modo che il ramo centrale sia sempre nella stessa posizione assoluta.

θ

Stampa l'input.

P<²

Stampa la coppia giusta di /e \.

Iι

Stampa il suffisso del ramo.

Passa alla prima foglia.

F²«

Passa attraverso le foglie.

P⁺⁺θικ

Stampa l'input e il suffisso di ramo e foglia.

↓↓

Passa alla foglia successiva. Nota: se lo spazio bianco finale fosse accettabile, F²⁺⁺⁺θι궶si risparmierebbe un byte.

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.