วาดตารางผลลัพธ์ 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

Nope; ใช้เวลานานเท่าที่คุณต้องการตราบเท่าที่มันเสร็จสิ้นจริง
เกล็นสมิ ธ

1
เอาต์พุตควรมีอะไรหากมีอินพุตเพียงแถวเดียว?
Zgarb

คุณสามารถสันนิษฐานได้ว่าจะมีอินพุตอย่างน้อยสองแถวเสมอ 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 ในเวลานี้ ด้วยเหตุผลบางอย่างมันไม่ทำงานใน Chrome / Opera แม้จะเปิดใช้งานคุณลักษณะ JavaScript แบบทดลองอยู่ก็ตาม

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