Dibujar una tabla de salida SQL


12

Estoy seguro de que la mayoría de nosotros hemos visto resultados de SQL en un terminal, todos perfectamente formateados en filas y columnas. Si no lo has hecho, aquí hay un ejemplo:

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

Su objetivo para este desafío es, dadas las columnas y los datos de fila de una tabla, dibujar la tabla en este estilo. Debe haber una línea horizontal en la parte superior e inferior de la tabla, y una justo debajo de la fila del encabezado. Debe haber líneas verticales entre cada columna y una a ambos lados de la tabla. Debe usar tuberías para líneas verticales, guiones para líneas horizontales y más para donde se cruzan.

Detalles específicos:

  • Los datos se pueden ingresar a través de stdin, o como argumento para una función, pero deben estar en alguna forma de cadena
  • Los datos deben dividirse por el delimitador de cadena ;
  • Los datos constarán solo de caracteres ASCII, no se citan y no contendrán el delimitador.
  • La primera fila de los datos se utilizará para los encabezados de columna.
  • Los datos siempre tendrán el mismo número de columnas.
  • La entrada siempre contendrá al menos dos filas (un encabezado, un dato). No tiene que manejar conjuntos vacíos.
  • Se permite una nueva línea al final o anterior
  • Cada columna debe ser tan ancha como el elemento más ancho, rellenando los elementos más cortos a la derecha (bonificación -5% si rellena los números a la izquierda)
  • Debe haber 1 espacio de relleno antes y después de los encabezados y datos, excepto cuando la columna es más ancha
  • No tiene permiso para usar el mysqlprograma real para generar la tabla
  • Se aplican lagunas estándar

Entrada de muestra:

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

Salida

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

Puntuación:

El menor número de bytes gana, por supuesto. -5% de bonificación para los números de relleno a la izquierda (ver detalles).


¿Hay algún límite de tiempo en el tiempo de ejecución del programa?
— Downgoat

No; Tómate el tiempo que quieras, siempre y cuando realmente termine.
— Glenn Smith

1
¿Cuál debería ser la salida si solo hay una fila de entrada?
— Zgarb

Puede suponer que siempre habrá al menos dos filas de entrada. MySQL ni siquiera muestra una tabla para un conjunto vacío; usted tampoco tiene que hacerlo.
— Glenn Smith

Respuestas:



2

JavaScript (ES6), 262 bytes

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

Manifestación

Dado que es ES6, esta demostración funciona en Firefox y Edge en este momento. Por alguna razón, no funciona en Chrome / Opera, incluso con las funciones experimentales de JavaScript habilitadas.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.