Lee las tablas

11

Tarea

Leer el contenido de una tabla dado un conjunto de coordenadas.

Formato de tabla

Las tablas estarán en este formato básico:

      |[name]|[name]|
---------------------
[name]| [val]|[val] |
[name]| [val]|[val] |

Los nombres de columna son siempre únicos dentro de las columnas . Los nombres de las filas también son únicos dentro de las filas . Esto incluye nombres que son iguales, excepto espacios en blanco. Los valores, nombres de columnas y nombres de fila nunca tendrán |-dentro de ellos. Los nombres y valores nunca tendrán espacios dentro de ellos, pero pueden tener espacios iniciales o finales. El ancho de columna es ajustable según el encabezado / contenido. El ancho de columna siempre es consistente de arriba a abajo.

Entrada

Una tabla y una lista separada por espacios de [name]s.

Ejemplo

[table]
row col

Si está escribiendo una función, estas pueden ser cadenas separadas, de lo contrario row col, siempre será la última línea en la entrada. row coltiene cierta flexibilidad para el formato y puede representarse de muchas maneras. (por ejemplo (row, col), r, c...). El único requisito difícil es que sea una línea y que debe aparecer en el orden col row.

Salida

El contenido de una celda especificada por la entrada sin espacio inicial o final de la celda .

Ejemplos

In:
   |a|z |_*|
------------
atb|1|85|22|
b  |5|6 |e$|
/+*|8|we|th|
atb a

Out:
1


In:
  | x| b |
----------
ab|l |mmm|
b |le| l |
b b

Out:
l

In:
   |a|z |_*|  ab  |
-------------------
atb|1|85|22| 5    |
b  |5|6 |e$|  8   |
/+-|8|we|th| 126  |
atb ab

Out:
5
J Atkin
fuente
¿La celda solicitada en la entrada siempre existirá en la tabla?
ETHproductions
Oh, ahora lo entiendo;) Sí lo hará
J Atkin
Parece que la entrada se dará como una sola cadena aunque no la haya hecho explícita. ¿Cuánta flexibilidad hay en el formato de entrada? ¿Es aceptable pasar una matriz de valores a una función? (Supongo que no, tiene que ser una cadena) ¿Se puede dar la fila / columna como argumentos separados a la tabla? (Supongo que probablemente). Por favor aclare.
Level River St el
¿Eso ayuda?
J Atkin
¿Las columnas no van hacia arriba / abajo y las filas hacia la izquierda / derecha? Creo que las coordenadas en sus ejemplos están invertidas.
KoreanwGlasses

Respuestas:

2

Retina, 90 bytes

s`^(?=.*\n(.*) (.*))((?<a>\|)|.)*\|\s*\2\s*\|.*\n\1\s*((?<-a>\|)|[^|])*\|\s*([^\s|]*).*
$5

Mi primer grupo equilibrado regex. Todavía debe estar bien golfable. Intentaré hacerlo más tarde.

La idea principal es contar las tuberías hasta el nombre de la columna y luego usar la misma cantidad de tuberías en la fila que comienza con el nombre de la fila deseada. Después de eso capturamos el siguiente valor que es el resultado.

Pruébelo en línea aquí.

randomra
fuente
5

JavaScript (ES6), 108

t=>(S=s=>s.split(/ *\| */),t=t.split`
`,[y,x]=t.pop().split` `,S(t.find(r=>S(r)[0]==y))[S(t[0]).indexOf(x)])

PRUEBA en Firefox

f=t=>(
 S=s=>s.split(/ *\| */),
 t=t.split`\n`,
 [y,x]=t.pop().split` `,
 S(t.find(r=>S(r)[0]==y))[S(t[0]).indexOf(x)]
)

function test(){
  r=f(T.value);
  O.textContent=r
}
test()
#T { width: 50%; height: 9em}
Input<br><textarea id=T>   |a|z |_*|  ab  |
-------------------
atb|1|85|22| 5    |
b  |5|6 |e$|  8   |
/+-|8|we|th| 126  |
atb ab</textarea><br>
<button onclick="test()">Find</button>
<span id=O></span>

edc65
fuente
Nice, BTW ¿Por qué solo en Firefox? (FWIW uso Firefox)
J Atkin
La última vez que lo verifiqué, Chrome aún no había implementado la asignación de Destructuring - Confirmado, esto da un error en Chrome "Inválido en el lado izquierdo de la asignación"
edc65
@JAtkin Por cierto, ¿por qué no un voto a favor?
edc65
Leí de arriba abajo, dejé un comentario, tuve que hacer otra cosa y olvidé;)
J Atkin
4

Haskell, 117 116 111 bytes

import Data.Lists
s=splitOn"|".filter(>' ')
(t#b)a|l<-lines t=[c|r<-l,(d,c)<-zip(s$l!!0)$s r,d==a,s r!!0==b]!!0

Ejemplo de uso:

*Main> ("  | x| b |\n----------\nab|l |mmm|\nb |le| l |\nb b" # "b") "b"
"l"

Cómo funciona:

s=splitOn"|".filter(>' ')         -- helper function to remove spaces and split a
                                  -- line at bars into words
l<-lines t                        -- split table at \n into lines and bind to l
[c|r<-l,                      ]   -- take c for every line r in l, where
       (d,c)<-zip(s$l!!0)$s r     -- a pair (d,c) is made by zipping the (split)
                                  -- header of the table with the (split) line r 
        ,d==a                     -- and d (=header element) equals parameter a
        ,s r!!0==b                -- and the first word in r equals parameter b
                             !!0  -- pick the first (and only) element
nimi
fuente