Disegna una tabella di output SQL


12

Sono sicuro che molti di noi hanno visto risultati SQL in un terminale, tutti accuratamente formattati in righe e colonne. In caso contrario, ecco un esempio:

+----------+-----------+----------------+
| column 1 | column 2  | column 3       |
+----------+-----------+----------------+
| data     | more data | even more data |
| etc      | just goes | on and on      |
+----------+-----------+----------------+

Il tuo obiettivo per questa sfida è, dati le colonne e i dati di riga per una tabella, disegnare la tabella in questo stile. Dovrebbe esserci una linea orizzontale nella parte superiore e inferiore della tabella e una a destra sotto la riga di intestazione. Dovrebbero esserci linee verticali tra ogni colonna e una su entrambi i lati della tabella. È necessario utilizzare i tubi per le linee verticali, i trattini per le linee orizzontali e le traverse per il punto in cui si intersecano.

specifiche:

  • I dati possono essere inseriti tramite stdin o come argomento di una funzione, ma devono essere in qualche forma di stringa
  • I dati devono essere divisi dal delimitatore di stringa ;
  • I dati saranno composti solo da caratteri ASCII, non saranno quotati e non conterranno il delimitatore.
  • La prima riga dei dati verrà utilizzata per le intestazioni di colonna
  • I dati avranno sempre lo stesso numero di colonne
  • L'input conterrà sempre almeno due righe (un'intestazione, un dato). Non è necessario gestire set vuoti.
  • È consentita una nuova riga finale o precedente
  • Ogni colonna dovrebbe essere larga quanto l'elemento più largo, riempiendo gli elementi più corti a destra (bonus -5% se si padano i numeri a sinistra)
  • Dovrebbe esserci 1 spazio di riempimento prima e dopo le intestazioni e i dati, tranne quando la colonna è più larga
  • Non è consentito utilizzare il mysqlprogramma effettivo per generare la tabella
  • Si applicano scappatoie standard

Input di esempio:

column 1;column 2;column 3
hello;world;test
longer data;foo;bar

Produzione

+-------------+----------+----------+
| column 1    | column 2 | column 3 |
+-------------+----------+----------+
| hello       | world    | test     |
| longer data | foo      | bar      |
+-------------+----------+----------+

punteggio:

Il numero più basso di byte vince, ovviamente. -5% di bonus per i numeri di riempimento a sinistra (vedi dettagli).


Esistono limiti di tempo per l'esecuzione del programma?
Downgoat,

No; impiega tutto il tempo che vuoi, finché finisce davvero.
Glenn Smith,

1
Quale dovrebbe essere l'output se esiste solo una riga di input?
Zgarb,

Puoi presumere che ci saranno sempre almeno due righe di input. MySQL non mostra nemmeno una tabella per un set vuoto; non devi neanche.
Glenn Smith,

Risposte:


2

CJam, 67 58 byte

' qN/';f/ff+z_.{[z,):TS*'|+f.e|T'-*'++:T\(T@~T]}z{s_W=\N}/

Provalo online nell'interprete CJam .


2

JavaScript (ES6), 262 byte

f=x=>{w=[],o=z=>y(`| ${z[m]((c,i)=>(c+' '.repeat(w[i]-c.length))).join` | `} |`),(d=x.split`
`[m='map'](r=>r.split`;`))[m](r=>r[m]((c,i)=>w[i]=Math.max(c.length,w[i]||0)));(y=console.log)(s=`+${w[m](c=>'-'.repeat(c+2)).join`+`}+`);o(d.shift());y(s);d[m](o);y(s)}

dimostrazione

Dal momento che è ES6, questa demo funziona in questo momento su Firefox e Edge. Per qualche motivo non funziona in Chrome / Opera anche con le funzionalità JavaScript sperimentali abilitate.

// Snippet stuff
console.log = x => document.getElementsByTagName('output')[0].innerHTML += x + '\n';
document.getElementsByTagName('button')[0].addEventListener('click', () => {
  f(document.getElementById('I').value);
});


// Actual code
f = x => {
  w = [], o = z => y(`| ${z[m]((c,i)=>(c+' '.repeat(w[i]-c.length))).join` | `} |`), (d = x.split `
` [m = 'map'](r => r.split `;`))[m](r => r[m]((c, i) => w[i] = Math.max(c.length, w[i] || 0)));
  (y = console.log)(s = `+${w[m](c=>'-'.repeat(c+2)).join`+`}+`);
  o(d.shift());
  y(s);
  d[m](o);
  y(s)
}
<p>
  <textarea id=I cols=80 rows=15>column 1;column 2;column 3
hello;world;test
longer data;foo;bar</textarea>
</p>
<button type=button>Go</button>
<pre><output></output></pre>

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.