Нарисуйте таблицу вывода SQL


12

Я уверен, что большинство из нас видели результаты SQL в терминале, все аккуратно отформатированы в строки и столбцы. Если нет, вот пример:

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

Ваша цель для этой задачи состоит в том, чтобы, учитывая столбцы и данные строк для таблицы, нарисовать таблицу в этом стиле. В верхней и нижней части таблицы должна быть горизонтальная линия, а справа - строка заголовка. Между каждым столбцом должны быть вертикальные линии, по одной с обеих сторон таблицы. Вы должны использовать трубы для вертикальных линий, дефисы для горизонтальных линий и плюсы для того, где они пересекаются.

Особенности:

  • Данные могут быть введены через стандартный ввод или в качестве аргумента функции, но они должны быть в некоторой форме строки
  • Данные должны быть разделены строковым разделителем ;
  • Данные будут состоять только из символов ASCII, не будут заключены в кавычки и не будут содержать разделитель.
  • Первая строка данных будет использоваться для заголовков столбцов
  • Данные всегда будут иметь одинаковое количество столбцов
  • Входные данные всегда будут содержать как минимум две строки (один заголовок, один данные). Вам не нужно обрабатывать пустые наборы.
  • Трейлинг или предыдущий перевод строки разрешен
  • Каждый столбец должен быть такой же ширины, как и самый широкий элемент, дополняя более короткие элементы справа (бонус -5%, если вы дополняете цифры слева)
  • Должен быть один пробел до и после заголовков и данных, кроме случаев, когда столбец шире
  • Вы не можете использовать реальную 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
Каким должен быть вывод, если есть только одна строка ввода?
Згарб

Вы можете предположить, что всегда будет как минимум две строки ввода. 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.