SQL出力テーブルを描く


12

私たちのほとんどは、端末でSQLの結果を見て、行と列にきちんとフォーマットされていると確信しています。まだお持ちでない場合の例を以下に示します。

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

この課題の目標は、テーブルの列と行のデータが与えられたら、このスタイルでテーブルを描画することです。テーブルの上下に水平線があり、ヘッダー行のすぐ下に1本あるはずです。すべての列とテーブルの両側に1本の垂直線が必要です。垂直線にはパイプ、水平線にはハイフン、交差する場所にはプラス記号を使用する必要があります。

詳細:

  • データは、stdinを介して、または関数の引数として入力できますが、何らかの形式の文字列でなければなりません
  • データは文字列区切り文字で分割する必要があります ;
  • データはASCII文字のみで構成され、引用符で囲まれず、区切り文字は含まれません。
  • データの最初の行は列ヘッダーに使用されます
  • データの列数は常に同じです
  • 入力には常に少なくとも2行(1つのヘッダー、1つのデータ)が含まれます。空のセットを処理する必要はありません。
  • 末尾または前の改行が許可されます
  • 各列は最も幅の広い要素と同じ幅にし、右側に短い要素をパディングします(左側に数字をパディングするとボーナス-5%)
  • 列が広い場合を除いて、ヘッダーとデータの前後に1スペースのパディングが必要です。
  • 実際のmysqlプログラムを使用してテーブルを生成することは許可されていません
  • 標準的な抜け穴が適用されます

サンプル入力:

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

出力

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

得点:

もちろん、最小バイト数が勝ちます。左側のパディング番号に-5%のボーナス(詳細を参照)。


プログラムの実行時間に制限はありますか?
— ダウンゴート

いや; 実際に終了する限り、必要なだけ時間がかかります。
— グレンスミス

1
入力が1行しかない場合、出力はどうなりますか?
— ズガルブ

常に少なくとも2行の入力があると仮定できます。MySQLは空のセットのテーブルも表示しません。どちらも必要ありません。
— グレンスミス

回答:



2

JavaScript(ES6)、262バイト

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

デモ

ES6であるため、このデモは現時点ではFirefoxおよびEdgeで動作します。何らかの理由で、実験的なJavaScript機能を有効にしても、Chrome / Operaでは機能しません。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.