Gambar Tabel Output SQL

12

Saya yakin sebagian besar dari kita telah melihat hasil SQL di terminal, semua diformat rapi menjadi baris dan kolom. Jika belum, berikut ini contohnya:

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

Tujuan Anda untuk tantangan ini adalah, mengingat kolom dan data baris untuk sebuah tabel, gambarlah tabel dengan gaya ini. Harus ada garis horizontal di bagian atas dan bawah tabel, dan satu tepat di bawah baris tajuk. Harus ada garis vertikal antara setiap kolom, dan satu di kedua sisi tabel. Anda harus menggunakan pipa untuk garis vertikal, tanda hubung untuk garis horizontal, dan plusses untuk tempat perpotongannya.

Spesifik:

  • Data dapat dimasukkan melalui stdin, atau sebagai argumen untuk suatu fungsi, tetapi harus dalam bentuk string
  • Data harus dibagi dengan pembatas string ;
  • Data hanya akan terdiri dari karakter ASCII, tidak dikutip, dan tidak akan mengandung pembatas.
  • Baris pertama data akan digunakan untuk tajuk kolom
  • Data akan selalu memiliki jumlah kolom yang sama
  • Input akan selalu mengandung setidaknya dua baris (satu header, satu data). Anda tidak harus menangani set kosong.
  • Baris baru yang tertinggal atau sebelumnya diizinkan
  • Setiap kolom harus selebar elemen terluas, melapisi elemen lebih pendek di sebelah kanan (bonus -5% jika Anda mengisi angka di sebelah kiri)
  • Harus ada 1 ruang bantalan sebelum dan sesudah tajuk dan data, kecuali bila kolomnya lebih lebar
  • Anda tidak diizinkan menggunakan mysqlprogram aktual untuk menghasilkan tabel
  • Celah standar berlaku

Input sampel:

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

Keluaran

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

Mencetak:

Jumlah byte terendah menang, tentu saja. -5% bonus untuk nomor padding di sebelah kiri (lihat spesifik).

Glenn Smith
sumber
Apakah ada batasan waktu untuk menjalankan program?
Downgoat
Nggak; memakan waktu selama yang Anda inginkan, selama itu benar-benar selesai.
Glenn Smith
1
Apa yang seharusnya menjadi output jika hanya ada satu baris input?
Zgarb
Anda dapat mengasumsikan bahwa akan selalu ada setidaknya dua baris input. MySQL bahkan tidak menampilkan tabel untuk set kosong; kamu tidak harus baik.
Glenn Smith

Jawaban:

2

CJam, 67 58 byte

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

Cobalah online di penerjemah CJam .

Dennis
sumber
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)}

Demo

Karena ES6, demo ini berfungsi di Firefox dan Edge saat ini. Untuk beberapa alasan itu tidak berfungsi di Chrome / Opera bahkan dengan fitur JavaScript eksperimental diaktifkan.

// 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>

rink.attendant.6
sumber