Намалюйте вихідну таблицю 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% бонус за додаткові номери зліва (див. Специфіку).


Чи є якісь обмеження часу виконання програми?
Пуховик

Ніп; забирайте стільки, скільки хочете, до тих пір, поки воно фактично закінчиться.
Гленн Сміт

1
Яким повинен бути вихід, якщо є лише один рядок вводу?
Згарб

Ви можете припустити, що завжди буде щонайменше два ряди введення. 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.