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.