Zeichnen Sie eine SQL-Ausgabetabelle

12

Ich bin sicher, dass die meisten von uns SQL-Ergebnisse in einem Terminal gesehen haben, das alle ordentlich in Zeilen und Spalten formatiert ist. Wenn nicht, hier ein Beispiel:

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

Ihr Ziel für diese Herausforderung ist es, die Tabelle angesichts der Spalten- und Zeilendaten für eine Tabelle in diesem Stil zu zeichnen. Oben und unten in der Tabelle sollte eine horizontale Linie und rechts unter der Kopfzeile eine Linie sein. Zwischen jeder Spalte und einer Spalte auf beiden Seiten der Tabelle sollten vertikale Linien sein. Sie sollten Rohre für vertikale Linien, Bindestriche für horizontale Linien und Punkte für die Schnittpunkte verwenden.

Besonderheiten:

  • Die Daten können über stdin oder als Argument für eine Funktion eingegeben werden, müssen jedoch in Form einer Zeichenfolge vorliegen
  • Die Daten sollten durch den Zeichenkettenbegrenzer getrennt werden ;
  • Die Daten bestehen nur aus ASCII-Zeichen, werden nicht in Anführungszeichen gesetzt und enthalten kein Trennzeichen.
  • Die erste Zeile der Daten wird für Spaltenüberschriften verwendet
  • Die Daten haben immer die gleiche Anzahl von Spalten
  • Die Eingabe enthält immer mindestens zwei Zeilen (eine Kopfzeile, eine Datenzeile). Sie müssen nicht mit leeren Sätzen umgehen.
  • Ein abschließender oder vorangegangener Zeilenumbruch ist zulässig
  • Jede Spalte sollte so breit wie das breiteste Element sein und kürzere Elemente rechts auffüllen (Bonus -5%, wenn Sie Zahlen links auffüllen ).
  • Vor und nach den Überschriften und Daten sollte 1 Auffüllbereich vorhanden sein, es sei denn, die Spalte ist breiter
  • Sie dürfen das eigentliche mysqlProgramm nicht zum Generieren der Tabelle verwenden
  • Es gelten Standardlücken

Beispiel Input:

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

Ausgabe

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

Wertung:

Die niedrigste Anzahl von Bytes gewinnt natürlich. -5% Bonus für das Auffüllen der Zahlen auf der linken Seite (siehe Details).

Glenn Smith
quelle
Gibt es Zeitlimits für die Laufzeit des Programms?
Downgoat
Nee; nimm so lange du willst, so lange es tatsächlich endet.
Glenn Smith
1
Was soll die Ausgabe sein, wenn es nur eine Eingabezeile gibt?
Zgarb,
Sie können davon ausgehen, dass es immer mindestens zwei Eingabezeilen geben wird. MySQL zeigt nicht einmal eine Tabelle für eine leere Menge an. das musst du auch nicht.
Glenn Smith

Antworten:

2

CJam, 67 58 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Dennis
quelle
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

Da es sich um ES6 handelt, funktioniert diese Demo derzeit in Firefox und Edge. Aus irgendeinem Grund funktioniert es in Chrome / Opera nicht, auch wenn experimentelle JavaScript-Funktionen aktiviert sind.

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