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

Glenn Smith
fuente
¿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

CJam, 67 58 bytes

' qN/';f/ff+z_.{[z,):TS*'|+f.e|T'-*'++:T\(T@~T]}z{s_W=\N}/

Pruébelo en línea en el intérprete de CJam .

Dennis
fuente
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>

rink.attendant.6
fuente