绘制SQL输出表


12

我敢肯定,我们大多数人都已经在终端中看到了SQL结果,它们都整齐地格式化为行和列。如果您还没有,请参考以下示例:

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

您面临的这个挑战的目标是,在给定表格的列和行数据的情况下,以这种样式绘制表格。在表格的顶部和底部应该有一条水平线,在标题行的正下方。每列之间应有垂直线,表格两边应有一条垂直线。您应该将管道用于垂直线,将连字符用于水平线,并将加号用于相交的位置。

细节:

  • 数据可以通过stdin输入,也可以作为函数的参数输入,但是必须采用某种字符串形式
  • 数据应由字符串定界符分隔 ;
  • 数据将仅包含ASCII字符,不加引号,并且不包含定界符。
  • 数据的第一行将用于列标题
  • 数据将始终具有相同的列数
  • 输入将始终至少包含两行(一个标题,一个数据)。您不必处理空集。
  • 尾随或换行符是允许的
  • 每列应与最宽的元素一样宽,在右侧填充较短的元素(如果在左侧填充数字,则加-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%的奖金(请参见详细信息)。


它们对程序运行时间有时间限制吗?
Downgoat

不; 只要您想要,只要它实际完成即可。
格伦·史密斯

1
如果只有一行输入,输出应该是什么?
Zgarb 2015年

您可以假设将始终至少有两行输入。MySQL甚至不显示一个空集的表。您也不需要。
格伦·史密斯

Answers:



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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.