SQL Çıktı Tablosu Çiz


12

Çoğumuz SQL sonuçlarını bir terminalde gördük, hepsi düzgün bir şekilde satırlara ve sütunlara biçimlendirildi. Eğer yapmadıysanız, işte size bir örnek:

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

Bu meydan okuma için hedefiniz, bir tablonun sütunları ve satır verileri göz önüne alındığında, tabloyu bu stilde çizmektir. Tablonun üstünde ve altında, başlık satırının hemen altında yatay bir çizgi olmalıdır. Her sütun arasında ve tablonun her iki tarafında birer tane olmak üzere dikey çizgiler olmalıdır. Dikey çizgiler için borular, yatay çizgiler için kısa çizgiler ve kesiştikleri yerler için artılar kullanmalısınız.

Özellikleri:

  • Veriler stdin aracılığıyla veya bir işlevin bağımsız değişkeni olarak girilebilir, ancak bir tür dize biçiminde olmalıdır
  • Veriler dize sınırlayıcısına bölünmelidir ;
  • Veriler yalnızca ASCII karakterlerden oluşacak, tırnak içine alınmayacak ve sınırlayıcı içermeyecektir.
  • Verilerin ilk satırı sütun başlıkları için kullanılacaktır
  • Veriler her zaman aynı sayıda sütuna sahip olacaktır
  • Giriş her zaman en az iki satır (bir başlık, bir veri) içerecektir. Boş kümeleri idare etmek zorunda değilsiniz.
  • Sondaki veya önceki satırsonuna izin verilir
  • Her sütun en geniş eleman kadar geniş olmalı, sağda daha kısa elemanlar doldurmalıdır (solda rakamları doldurursanız% -5 bonus)
  • Sütunun daha geniş olduğu durumlar hariç, üstbilgilerden ve verilerden önce ve sonra 1 dolgu alanı olmalıdır
  • mysqlTabloyu oluşturmak için gerçek programı kullanmanıza izin verilmiyor
  • Standart boşluklar geçerlidir

Örnek Giriş:

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

Çıktı

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

puanlama:

Tabii ki en az bayt kazanır. Soldaki dolgu numaraları için% -5 bonus (teknik özelliklere bakın).


Programın çalışma süresinde herhangi bir zaman sınırı var mı?
Downgoat

Hayır; gerçekte bittiği sürece istediğiniz kadar sürebilir.
Glenn Smith

1
Yalnızca bir satır giriş varsa çıktı ne olmalıdır?
Zgarb

Her zaman en az iki satır giriş olacağını varsayabilirsiniz. MySQL boş bir küme için bir tablo bile göstermez; ikisine de gerek yok.
Glenn Smith

Yanıtlar:



2

JavaScript (ES6), 262 bayt

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

gösteri

ES6 olduğu için bu demo şu anda Firefox ve Edge'de çalışıyor. Herhangi bir nedenle, deneysel JavaScript özellikleri etkinleştirilmiş olsa bile Chrome / Opera'da çalışmaz.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.