Griglia binaria a 16 bit


29

Dato qualsiasi numero intero a 16 bit senza segno, converti il ​​suo numero decimale (cioè base-10) in una griglia ASCII 4x4 dei suoi bit, con il bit più significativo (MSB) in alto a sinistra, il bit meno significativo (LSB) a in basso a destra, leggi attraverso e poi in basso (come il testo inglese).

Esempi

Ingresso: 4242

+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+

Ingresso: 33825

+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+

Requisiti specifici

  1. L'input deve essere in decimale (base-10), tuttavia è possibile convertirlo in binario nel modo desiderato (incluso l'uso del linguaggio incorporato, se disponibile).

  2. Il formato della tabella di output deve corrispondere esattamente . Questo significa che si devono utilizzare i caratteri ASCII specifico ( -, +e |) per le linee della griglia tabella come mostrato, all'interno di ogni cella è 3 caratteri, e veri bit sono rappresentati da #mentre falsa è rappresentato da uno spazio ( ).

  3. Gli spazi bianchi iniziali o finali non sono consentiti. Newline finale è richiesto .

  4. L'ordine dei bit deve corrispondere agli esempi come descritto.

indennità

  1. L'input deve essere un numero di base 10 sulla riga di comando, input standard o input dell'utente, ma non deve essere codificato nel codice sorgente.

Che vinca il codice più corto più chiaro ! :-)



2
La prima frase mi sembra confusa, dove dice "converti la sua forma decimale ". Sulla base del resto del post e dell'esempio, sembra che l' input sia dato in forma decimale, ma devi convertire la forma binaria del valore in una griglia.
Reto Koradi,

1
@RetoKoradi hai sostanzialmente ragione, ma la domanda non richiede di convertire un numero decimale in una griglia binaria . Non è necessario esplicitamente lavorare con un numero binario, ma solo un probabile dettaglio di implementazione.
type_outcast,

Scrivere una funzione con il numero base-10 come argomento della funzione conta come input dell'utente?
Alex A.

2
Dato che dici che il numero dato è un " numero intero a 16 bit senza segno ", è per definizione in forma binaria. Quando l'ho letto per la prima volta, in realtà sembrava che l'input sarebbe stato dato in forma binaria. Tutto diventa chiaro verso la fine. Ma almeno per me, il primo paragrafo non risolve affatto il problema.
Reto Koradi,

Risposte:


21

J, 26 byte

('   ';' # '){~4 4$_16{.#:

Un verbo anonimo. Per fortuna, J è molto bravo a disegnare scatole. Proviamolo:

   f =. ('   ';' # '){~4 4$_16{.#:
   f 4242
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+

Come alcuni commentatori hanno menzionato, il modo in cui J disegna le caselle dipende dal sistema: su alcune piattaforme, questo codice funzionerà con le impostazioni predefinite, ma su altre le caselle verranno disegnate usando i caratteri di disegno al tratto Unicode. (I comandi 9!:6e9!:7 ti permettono di interrogare e impostare i caratteri con cui disegnare i valori in box, rispettivamente.)


Sai (o chiunque altro) se esiste un consenso sul comando di disegno della scatola per il punteggio del golf, allora? Personalmente penso che il presupposto con il golf del codice sia che le soluzioni funzionano sulla maggior parte dei sistemi su cui il linguaggio della soluzione funziona, giusto? Come sarebbe una soluzione che restituisce le caselle corrette su tutte (o quasi) le installazioni J? Comunque mi piace molto la tua soluzione! Il mio cervello sta ancora lavorando, ed è esattamente quello che mi piace del code golf.
type_outcast,

5
@type_outcast Non è richiesta la portabilità per le sfide del code golf. Finché funziona con qualche implementazione su una piattaforma, è valido.
Dennis,

Grazie per la risposta @Dennis. Sono felice che la mia presunzione non sia corretta, quindi, perché (ancora) mi piace molto la soluzione di Mauris! :-)
type_outcast,

14

JavaScript (ES6), 102

... o 96 usando returninvece di console.log.

Prova a eseguire lo snippet di seguito in un browser compatibile con EcmaScript 6.

f=n=>{for(o=h=`
+---+---+---+---+
`,z=16;z--;n/=2)o=(z&3?'':h+'|')+` ${' #'[n&1]} |`+o;console.log(o)}

// TEST
console.log=x=>O.innerHTML=x+O.innerHTML

function test(n) { f(n); console.log(n); }
<input id=I value=4680><button onclick='test(+I.value)'>-></button>
<pre id=O></pre>


6
È "JavaScripy" qualche strano mashup javascript / Python? ;-)
Digital Trauma,

6
@DigitalTrauma ovviamente. Ma poiché il mondo non è pronto ( tvtropes.org/pmwiki/pmwiki.php/Main/TheWorldIsNotReady ) per questa nuova evoluzione, tornerò a JavaScript
edc65,

Bene, questo funziona su Edge!
Arturo Torres Sánchez,

Deve ... non ... fare clic su ... tvtropes ...
RK.

14

Befunge -93, 196 218 byte

&00p12*v>>4>"---+",v v <
v*:*:*:<   | :-1,,,< #
>:*2/10p^  >"+",25*,10g|
     > #v^#         $< @
 25*,^  >4" |",,v ,*<>
v>"#",00g10g-00p 10g
 |`-1g01g00     <>48^
v>" ",10g
>2/10p>"| ",,1-:#^_$>^

Per eseguire il programma ...

  1. Vai all'interprete online .
  2. Incolla questo codice nella grande casella di testo.
  3. Fare clic Show.
  4. Inserisci il numero desiderato nella Inputcasella.
  5. Fare clic Run. (O passare Slowa qualcosa come 5 millisecondi e quindi fare clic Show.)
  6. Ta-da!

Uscita per 4242:

+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+

Uscita per 33825:

+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+

Spiegazione

Oh cielo, in cosa mi sono preso? Bene, ecco qui! (Il codice irrilevante è sostituito da .s.)

Parte 1: ottieni input (archivia in 0,0) e calcola 32768 (archivia in 1,0).

&00p12*v>
v*:*:*:< 
>:*2/10p^

Parte 2: Stampa "+ --- + --- + --- + ---".

>4>"---+",v
  | :-1,,,<

Parte 3: Stampa "+" e una nuova riga e controlla se (1,0) è 0 (ovvero abbiamo finito). In tal caso, terminare. Altrimenti, continua.

 ........... v <
   | ....... # 
   >"+",25*,10g|
v.#         $< @
>4" |",,v ...

Parte 4: Ottieni cifre binarie di input, aggiornando (0,0) e (1,0) mentre procediamo. Stampa le cose giuste. Approfitto del comportamento avvolgente di Befunge.

 .....  >4" |",,v ,*<.
v>"#",00g10g-00p 10g
 |`-1g01g00     <>48^
v>" ",10g
>2/10p>"| ",,1-:#^_...

Parte 5: stampa una nuova riga e torna alla parte che stampa "+ --- + --- + --- + --- +". Viene utilizzato un trucco avvolgente.

     > #.^.         .. .
 25*,^  ......... ...>
................ ...
 .........      .....
........
.................._$>^

Ta-da!


10

Julia, 156 143 byte

n->(p=println;l="+"*"---+"^4;for i=1:4 p(l,"\n| ",join([j>"0"?"#":" "for j=reshape(split(lpad(bin(n),16,0),""),4,4)[:,i]]," | ")," |")end;p(l))

Ungolfed:

function f(n::Int)
    # Convert the input to binary, padded to 16 digits
    b = lpad(bin(n), 16, 0)

    # Split b into a 4x4 matrix
    m = reshape(split(b, ""), 4, 4)

    # Store the line separator for brevity
    l = "+" * "---+"^4

    # Print each column of the matrix as a row
    for i = 1:4
        println(l, "\n| ", join([j > "0" ? "#" : " " for j = m[:,i]], " | "), " |")
    end

    # Print the bottom of the table
    println(l)
end

Provalo online


10

Python 2, 157 153 151 146 byte

J=''.join;R='+---'*4;i=format(input(),'016b')
print J(R+'+\n|'+J(' '+('#'if int(l)else' ')+' |'for l in i[n*4:-~n*4])+'\n'for n in range(4)),R+'+'

Grazie a Morgan Thrapp per aver salvato 4 byte e a Jonathan Frech per aver salvato 5 byte.

uso

$ python test.py
33825
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+

È possibile salvare due byte se si '+---'*4j=''.join
inserisce

Nessun problema! In realtà stavo lavorando a una soluzione molto simile.
Morgan Thrapp,

@downvoter Care per spiegare?
Zach Gates,

Poiché non si utilizza Python 3, è possibile sostituire int(input())con input()e salvare cinque byte.
Jonathan Frech,

9

Ruby, 118 114

b="%016b"%gets
l=?++"---+"*4
1.upto(16){|i|puts l if i%4==1
print"| #{b[i-1]==?0?' ':?#} "
puts ?|if i%4<1}
puts l

grazie per @ w0lf per aver salvato alcuni caratteri.


1
Puoi salvare alcuni byte se scrivi caratteri letterali usando la ?notazione (es: ?|invece di '|'). Questo funziona per tutto tranne lo spazio.
Cristian Lupascu,

@ w0lf Ho scoperto che ?\sfunziona per lo spazio, tuttavia non è davvero utile qui.
Mhmd,

7

GNU sed + dc, 116

Il punteggio include +1 per le -rbandiere a sed:

s/.*/dc -e2o&p/e
:
s/^.{,15}$/0&/;t
s/./| & /g
s/.{16}/\n+---+---+---+---+\n&|/g
y/01/ #/
s/\n([-+]+)(.*)/\1\2\n\1/

Uscita di prova:

$ { echo 4242 ; echo 33825 ; } | sed -rf 16bitgrid.sed
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
$ 

In alternativa:

Pura sed, 146

Potresti pensare che sia imbarazzante usare sedl'estensione GNU per valutare un dccomando. In tal caso, possiamo farlo in modo leggermente diverso, secondo questa meta-risposta . Naturalmente la domanda afferma chiaramente che l'input deve essere nella base 10, ma qui sto tentando di affermare che possiamo ignorare quello per le sedrisposte e usare invece unario (base 1).

:
s/11/</g
s/<([ #]*)$/< \1/
s/1/#/
y/</1/
t
:a
s/^.{,15}$/0&/;ta
s/./| & /g
s/.{16}/\n+---+---+---+---+\n&|/g
y/01/ #/
s/\n([-+]+)(.*)/\1\2\n\1/

Uscita di prova

Utilizzo printfper generare la stringa unaria necessaria:

$ printf "%33825s" | tr ' ' 1 | sed -rf 16bitgrid.sed 
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
$ 

Ben fatto. Questo sembra in qualche modo simile alla soluzione Perl che ho escogitato come una prova (privata) del concetto mentre mettevo a punto la domanda.
type_outcast,

@type_outcast A proposito, è perfettamente OK pubblicare la propria soluzione come risposta :)
Digital Trauma,

Lo so :-) Non ho passato molto tempo a giocare a golf, dato che ero più concentrato nel formulare una buona domanda, ma potrei ancora rivederlo e pubblicarlo se posso giocare a golf in qualcosa di almeno a metà rispettabile. Al momento mi sto divertendo troppo a fare trekking sulle risposte di tutti gli altri.
type_outcast,

6

C ++ 11, 193 191 190 176 172 byte

La mia prima soluzione su codegolf di sempre, quindi non date la colpa a me.

#include<iostream>
int n,j,i=65536;int main(){std::cin>>n;for(;j<9;){for(int k:{0,0,0,0})if(j%2)printf("| %s",n&(i/=2)?"# ":"  ");else printf("+---");puts(j++%2?"|":"+");}}

Ungolfed

#include <iostream>
int n, i = 65536, j;

int main()
{
    std::cin >> n;

    for (; j < 9;)
    {
        for(int k:{0,0,0,0})
        {
            if (j % 2)
            {
                printf("| %s", n & (i /= 2) ? "# " : "  ");
            }
            else
            {
                printf("+---");
            }
        }
        puts(j++ % 2 ? "|" : "+");
    }
}

Versione precedente

#include <iostream>
using namespace std;

int n, i = 65536, j;
int main()
{
    cin >> n;

    for (; j < 9;)
    {
        for(int k:{0,0,0,0})
        {
            if (j % 2)
            {
                cout << "| " << (n & (i /= 2) ? "# " : "  ");
            }
            else
            {
                cout << "+---";
            }
        }
        cout << (j++ % 2 ? "|\n" : "+\n");
    }
}

Suggerimento: 0x10000 è 65536, con prefisso '0x', hex è sempre più lungo del decimale
edc65

Suggerimento 2: dovresti evitare using namespace stdnel codice di produzione. E non è utile anche qui.
edc65,

@ edc65 dec-> hex buona idea, ho sempre pensato che hex avesse una rappresentazione più breve, ma dimenticavo 0x. using namespace stdsalva pochi byte, perché non devo anteporre coute cincon std::. Anche usando using std::cout;non aiuterà.
Zereges,

Ehi Zereges. È possibile rimuovere lo spazio tra l'inclusione e la libreria .. e rimuovere il tipo restituito per la funzione principale.
Wendelbsilva,

C++non supporta l'auto int.
Zereges,

6

Pyth, 37 byte

Jj*3\-*5\+JVc4_m@" #".>Qd16jd.i*5\|NJ

Provalo online: Dimostrazione o Test Suite

Spiegazione:

Jj*3\-*5\+J
  *3\-                       the string "---"
      *5\+                   the string "+++++"
 j                           join second by first string: 
                                "+---+---+---+---+"
J                            save in J
          J                  print J

Vc4_m@" #".>Qd16jd.i*5\|NJ
    m         16             map each d in [0, 1, ..., 15] to:
          .>Qd                 input number Q shifted to the right by d
     @" #"                     and take the ^th char in " #" (modulo 2)
   _                         reverse this list of chars
 c4                          split into 4 groups
V                            for each group N in ^:
                    *5\|       the string "|||||"
                  .i    N      interleave ^ with N
                jd             join chars with spaces and print
                         J     print J

5

CJam, 43 41 byte

'+5*'-3**N+ri2bG0e[4/{" #"f='|5*.\S*N2$}/

Sicuramente golfabile, ma immagino sia un inizio. Genera la riga superiore, quindi per ogni 4 bit crea una riga pari e copia la riga dispari precedente.

Provalo online .


4

Python 2, 122 121 120 byte

n=bin(4**8+input())[3:]
i=0
exec"print'| %s |'%' | '.join(' #'[x>'0']for x in n[:4])*i or'+---'*4+'+';n=n[4*i:];i^=1;"*9

-1 byte grazie all'astuto 4**8+trucco di @ xnor . La stampa principale viene eseguita ripetendo 9 volte, selezionando la riga appropriata per pari / dispari.


Penso che bin(4**8+input())[3:]risparmi un byte oltreformat
xnor

@xnor Oh, è pulito :)
Sp3000,

4

Python 2, 94

n=input()
s=();exec"s=(' #'[n%2],)+s;n/=2;"*16
a='+---'*4+'+\n'
print(a+'| %s '*4+'|\n')*4%s+a

L'idea è di prendere il modello

+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+

tranne con %sal posto di spazi vuoti ed eseguire la sostituzione della tupla. Sembra la tupla

('#', ' ', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#')

Viene creato togliendo le cifre dall'input in binario e aggiungendo il simbolo corrispondente nella parte anteriore della tupla. Un'espressione con tupla esplicita ha dato la stessa lunghezza.

%tuple(' #'[c>'0']for c in bin(input()+4**8)[3:])

Grazie a Sp3000 per 2 byte.


4

PowerShell, 203 188 182 byte

param($a)$l="+---+---+---+---+";$l;$b=([int64][convert]::ToString($a,2)).ToString(@(,"0"*16)-join'');@(1..16|%{if($b[$_-1]-eq'1'){"| # "}else{"|   "};if($_%4-eq0){"|`n$l`n"}})-join''

Modifica: salvato 15 byte modificando l'ordine che |viene disegnato, in modo da poter scaricare .TrimEnd("|")l'output e invece convertire il for-loop in un blocco di sottocodici che produce un array

Modifica2: salvato altri 6 byte eliminando la necessità di salvare nella $ovariabile e semplicemente eseguendo l'output -join''direttamente.

Ooooooooof.

Disegnare in PowerShell è difficile . Lavorare con cifre binarie in PowerShell è difficile .

Utilizza i built-in per [convert]l'intero di input in una rappresentazione di stringa in binario, quindi esegue nuovamente il cast in [int64]modo che possiamo richiamare .ToString()per anteporre / pad il numero appropriato di zero. (Notare che la creazione di una matrice di stringhe e la loro unione @(,"0"*16)-join''è più corta di 1 carattere rispetto alla stringa letterale "0000000000000000")

Quindi, esegui un semplice ciclo di 1..16|%{...}controllo controllando ogni cifra per creare il nostro array di output, quindi alla fine -join''ricominciamo insieme.


Precedente, 188

param($a)$l="+---+---+---+---+";$l;$b=([int64][convert]::ToString($a,2)).ToString(@(,"0"*16)-join'');$o=@(1..16|%{if($b[$_-1]-eq'1'){"| # "}else{"|   "};if($_%4-eq0){"|`n$l`n"}});$o-join''

Precedente, 203

param($a)$l="+---+---+---+---+`n|";$o=$l;$b=([int64][convert]::ToString($a,2)).ToString(@(,"0"*16)-join'');1..16|%{if($b[$_-1]-eq'1'){$o+=" # |"}else{$o+="   |"};if($_%4-eq0){$o+="`n$l"}};$o.TrimEnd('|')

1
Spero sia stato un "divertimento difficile". :-) +1 per la tua spiegazione; ha aiutato la mia comprensione limitata di PowerShell.
type_outcast,

3

Javascript (ES6), 216 207 byte

Definisce una funzione anonima.

i=>(","+("0".repeat(16)+i.toString(2)).slice(-16).split``.map((v,l,a)=>l%4<1?"| "+a.slice(l,l+4).map(v=>v?"#":" ").join` | `+" |":"").filter(v=>!!v).join`,`+",").replace(/,/g, `
+---+---+---+---+
`).slice(1)

Grazie a ETHproductions per suggerimenti!


Bel lavoro! Dato che stai usando ES6, ecco alcuni suggerimenti: 1. Ogni volta che devi usare una stringa come unico parametro di una funzione, puoi usare una stringa modello, in questo modo: .join` | `​2. Puoi anche usare stringhe modello per interpolare i valori: i=>`,${"0".repeat....join`,`},`.replace...3 Puoi trovare altri suggerimenti ES6 su questa discussione .
ETHproductions,

Questo sembra aver smesso di funzionare, ma giocando a golf un po 'di più, posso ottenere 197 con il risultato corretto:i=>`,${("0".repeat(16)+i.toString(2)).slice(-16).split``.map((v,l,a)=>l%4?"":"| "+a.slice(l,l+4).map(v=>' #'[v]).join` | `+" |").filter(v=>v).join`,`},`.replace(/,/g,`<line break>+---+---+---+---+<line break>`).slice(1)
ETHproductions

2
("0".repeat(16)+i.toString(2)).slice(-16) ->(65536|i).toString(2).slice(1)
edc65,

Mantenendo la tua logica esatta, questo può essere giocato a 169, vedi jsfiddle.net/76fp7aw6
edc65


2

Pyth, 50 byte

j.i*5]<3*5"+---"ms.i*5\|dc4mj@" #"qd\1*2\ .[Z16.BQ

Spiegazione dovrà aspettare fino a un'altra volta, sto pubblicando questo sul mio telefono!


2

Ruby, 102

n=gets.to_i
print j="+---"*4+"+
" 
19.downto(0){|i|print i%5>0?"| #{((n>>i*4/5)%2*3+32).chr} ":"|
"+j}

Algoritmo

Stampa un divisore orizzontale

Ripeti 20 volte (19..0)

Se il numero di loop non si divide per 5, convertirlo in un numero nell'intervallo 16..0 moltiplicando per 4/5. Stampa uno spazio (ascii 32) o #(ascii 32 + 3 = 35) preceduto |e seguito da uno spazio.

Se il numero di loop si divide per 5, stampa una |, nuova riga terminante e un divisore orizzontale identico al primo.


2

Perl, 103 byte

$_=(($l='+---'x4 .'+
').'| x 'x4 .'|
')x4 .$l;@n=(sprintf'%016b',<>)=~/./g;s/x/$n[$x++]?'#':$"/eg;print

Molte ripetizioni di stringhe per creare una griglia di xs, convertire l'input in binario e quindi s///la xs in #o $"( ) a seconda del flag nella posizione specificata ( $x).


2

PHP, 159 byte

bingrid16.php:

<?$r=10;while(--$r){if($r%2){echo str_repeat('+---',4).'+';}else{$c=9;echo'|';while(--$c){echo' '.($c%2?'|':($argv[1]&pow(2,$r*2+$c/2-5)?'#':' '));}}echo"\n";}

Uso:

php bingrid16.php 4242

Niente di speciale, costretto a renderlo bruto.

Ho provato un altro angolo usando array invece di loop, ma era più lungo a 224 byte:

<?=implode(array_map(function($r)use($argv){return($r%2?str_repeat('+---',4).'+':'|'.implode(array_map(function($c)use($r,$argv){return' '.($c%2?'|':($argv[1]&pow(2,$r*2+$c/2-5)?'#':' '));},range(8,1))))."\n";},range(9,1)));

2

Perl 5 , 85 84 byte

84 83 byte di codice + -pflag

-1 byte dopo Dom mi ha ricordato di usare una nuova riga

say$\='+'."---+"x4,"
| ",map y/01/ #/r.' | ',/./g for(sprintf"%016b",$_)=~/..../g}{

Provalo online!


Un approccio molto migliore rispetto al mio! Una nuova riga letterale ti farà risparmiare un byte in più $/!
Dom Hastings,

1

c99 263 byte

golfed:

main(int argc,char **argv){short i=atoi(argv[argc-1]);char *t="| # ", *f="|   ",*a[16],**p=a,*b="+---+---+---+---+\r\n";while(p<a+16){if((i|0x8000)==i)(*(p++))=t;else(*(p++))=f;i<<=1;}for(p=a;p<a+16;p+=4)printf("%s%s%s%s%s|\n",b,*p,p[1],p[2],p[3]);printf("%s",b);}

ungolfed:

main(int argc, char **argv)
{
    short i=atoi(argv[argc -1]);
    char *t ="| # ", *f="|   ",*a[16],**p=a,*b="+---+---+---+---+\r\n";

    while (p<a+16)
    {
        if((i|32768)==i)
            (*(p++))=t;
        else
            (*(p++))=f;

        i<<=1;
    }

    for (p=a;p<a+16;p+=4)
        printf("%s%s%s%s%s|\n",b,*p,p[1],p[2],p[3]);
    printf("%s",b);
}

Mi è solo piaciuto presentare una variante un po 'mutevole e ho sentito che questa è la prima volta che è appropriato (anche se mi costa alcuni byte, ma C non può sfidare questa sfida in byte anche con una possibilità, quindi non mi interessa) usare l'argc / argv


1

Ruby, 95

Annuisci a Mhmd per una concisa conversione di stringhe, ma volevo provare a utilizzare i metodi di stringa anziché i metodi numerici.

->i{puts g='+---'*4+?+;("%016b"%i).scan(/.{4}/){puts$&.gsub(/./){"| #{$&<?1?' ':?#} "}+"|
"+g}}

1

Ruby, 93

Una versione leggermente più corta che utilizza solo operazioni numeriche.

->i{n=g='+---'*4+"+
";15.downto(0){|m|n+="| #{[' ',?#][1&i>>m]} "
n+="|
"+g if m%4<1}
puts n}

1

C # 227 byte

golfed:

class B{public static string G(short v){string s="",b=System.Convert.ToString(v,2).PadLeft(16,'0');for(int i=9;i>0;){s+=i--%2!=0?"+---+---+---+---+\n":"| "+b[i*2+1]+" | "+b[i*2]+" | "+b[i*2-1]+" | "+b[i*2-2]+" |\n";}return s;}}

rientro:

class B
{
    public static string G(short v)
    {
        string s="",b=System.Convert.ToString(v, 2).PadLeft(16,'0');
        for(int i=9;i>0;)
            s+=i--%2!=0?"+---+---+---+---+\n":"| "+b[i*2+1]+" | "+b[i*2]+" | "+b[i*2-1]+" | "+b[i*2-2]+" |\n";
        return s;
    }
}

La prima volta che sto provando qualcosa del genere, i consigli sarebbero i benvenuti!


Innanzitutto, conto 286 byte e puoi rimuovere gli spazi di rientro.
Blue

Come lo conti esattamente? Sono andato alle proprietà per vedere lì le dimensioni del file, ma non sono sicuro che sia il modo di farlo! Senza indentazione sono arrivato a 230 byte!
anthonytimmers,

Usa qualcosa come mothereff.in/byte-counter , o se sei su Linux, usa il wccomando
Blue

1

Python 3, 145 144 byte

In linea:

a="|";b="+"+"---+"*4+"\n";r=0,1,2,3;(lambda x:print(b+b.join(a+a.join(" %s "%'# '[x&2**(i+j*4)<1]for i in r)+a+"\n"for j in r)+b))(int(input()))

Con le nuove linee:

a="|"
b="+"+"---+"*4+"\n"
r=0,1,2,3
lambda x:print(b+b.join(a+a.join(" %s "%'# '[x&2**(i+j*4)<1]for i in r)+a+"\n"for j in r)+b)
x(int(input()))

Modifica: Tanks @manatwork per il salvataggio di 1 byte


1
Sulla base di gnibbler 's punta , hardcoding r=0,1,2,3è 1 carattere più breve di generare con r=range(4).
arte

0

Kotlin , 192 byte

{val v=it.toString(2).padStart(16,'0')
fun p(){(0..3).map{print("+---")}
println("+")}
(0..3).map{p()
v.subSequence(it*4,(it+1)*4).map{print("| ${if(it>'0')'#' else ' '} ")}
println("|")}
p()}

Abbellire

{
    val v = it.toString(2).padStart(16, '0')
    fun p() {
        (0..3).map { print("+---") }
        println("+")
    }
    (0..3).map {
        p()
        v.subSequence(it *4, (it +1) *4).map {print("| ${if (it > '0') '#' else ' '} ")}
        println("|")
    }
    p()
}

Test

var b:(Int) -> Unit =
{val v=it.toString(2).padStart(16,'0')
fun p(){(0..3).map{print("+---")}
println("+")}
(0..3).map{p()
v.subSequence(it*4,(it+1)*4).map{print("| ${if(it>'0')'#' else ' '} ")}
println("|")}
p()}

fun main(args: Array<String>) {
    b(255)
}

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.