Vẽ bảng đầu ra SQL


12

Tôi chắc rằng hầu hết chúng ta đã thấy kết quả SQL trong một thiết bị đầu cuối, tất cả được định dạng gọn gàng thành các hàng và cột. Nếu bạn chưa có, đây là một ví dụ:

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

Mục tiêu của bạn cho thử thách này là, đưa ra các cột và dữ liệu hàng cho một bảng, vẽ bảng theo kiểu này. Cần có một đường ngang ở trên cùng và dưới cùng của bảng, và một bên phải dưới hàng tiêu đề. Cần có các đường thẳng đứng giữa mỗi cột và một ở cả hai bên của bảng. Bạn nên sử dụng các đường ống cho các đường thẳng đứng, dấu gạch ngang cho các đường ngang và kìm cho nơi chúng giao nhau.

Cụ thể:

  • Dữ liệu có thể được nhập thông qua stdin hoặc làm đối số cho hàm, nhưng nó phải ở dạng chuỗi nào đó
  • Dữ liệu nên được phân tách bằng dấu phân cách chuỗi ;
  • Dữ liệu sẽ chỉ bao gồm các ký tự ASCII, không được trích dẫn và sẽ không chứa dấu phân cách.
  • Hàng đầu tiên của dữ liệu sẽ được sử dụng cho các tiêu đề cột
  • Dữ liệu sẽ luôn có cùng số cột
  • Đầu vào sẽ luôn chứa ít nhất hai hàng (một tiêu đề, một dữ liệu). Bạn không phải xử lý các bộ trống.
  • Một dòng mới hoặc trước dòng được cho phép
  • Mỗi cột phải rộng bằng phần tử rộng nhất, đệm các phần tử ngắn hơn ở bên phải (phần thưởng -5% nếu bạn đệm số ở bên trái)
  • Cần có 1 khoảng trống của phần đệm trước và sau phần đầu và dữ liệu, ngoại trừ khi cột rộng hơn
  • Bạn không được phép sử dụng mysqlchương trình thực tế để tạo bảng
  • Áp dụng sơ hở tiêu chuẩn

Đầu vào mẫu:

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

Đầu ra

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

Ghi điểm:

Số byte thấp nhất sẽ thắng, tất nhiên. -5% tiền thưởng cho số đệm ở bên trái (xem chi tiết cụ thể).


Họ có giới hạn thời gian về thời gian chạy chương trình không?
Hạ cấp

Không; mất bao lâu bạn muốn, miễn là nó thực sự kết thúc.
Glenn Smith

1
Đầu ra phải là gì nếu chỉ có một hàng đầu vào?
Zgarb

Bạn có thể giả định rằng sẽ luôn có ít nhất hai hàng đầu vào. MySQL thậm chí không hiển thị bảng cho một tập hợp trống; bạn cũng không phải
Glenn Smith

Câu trả lời:



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

Bản giới thiệu

Vì là ES6, bản demo này hoạt động trong Firefox và Edge tại thời điểm này. Vì một số lý do, nó không hoạt động trong Chrome / Opera ngay cả khi bật các tính năng JavaScript thử nghiệm.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.