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

아니; 실제로 끝나는 한 원하는 시간을 가져야합니다.
Glenn Smith

1
입력 행이 하나 뿐인 경우 출력은 어떻게됩니까?
Zgarb

항상 최소한 두 개의 입력 행이 있다고 가정 할 수 있습니다. MySQL은 빈 세트에 대한 테이블도 표시하지 않습니다. 당신도 할 필요가 없습니다.
Glenn Smith

답변:


2

CJam, 67 58 바이트

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

CJam 통역사 에서 온라인으로 사용해보십시오 .


2

자바 스크립트 (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에서 작동합니다. 어떤 이유로 실험적인 자바 스크립트 기능이 활성화 된 경우에도 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.