Leia as tabelas

11

Tarefa

Leia o conteúdo de uma tabela com um conjunto de coordenadas.

Formatação de tabela

As tabelas estarão neste formato básico:

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

Os nomes das colunas são sempre exclusivos nas colunas . Os nomes das linhas também são exclusivos nas linhas . Isso inclui nomes iguais, exceto espaços em branco. Valores, nomes de colunas e nomes de linhas nunca terão |-dentro deles. Nomes e valores nunca terão espaços dentro deles, mas podem ter espaço à esquerda ou à direita. A largura da coluna é ajustável com base no cabeçalho / conteúdo. A largura da coluna é sempre consistente de cima para baixo.

Entrada

Uma tabela e uma lista separada por espaço de [name]s.

Exemplo

[table]
row col

Se você estiver escrevendo uma função, essas podem ser cadeias separadas, caso contrário row col, sempre será a última linha da entrada. row colpossui alguma flexibilidade para o formato e pode ser representado de várias maneiras. (por exemplo (row, col), r, c...). O único requisito difícil é que seja uma linha e que apareça na ordem col row.

Resultado

O conteúdo de uma célula especificada pela entrada sem espaço à esquerda ou à direita da célula .

Exemplos

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
fonte
A célula solicitada na entrada sempre existirá na tabela?
ETHproductions
Ah, agora eu entendi;) Sim, será
J Atkin
Parece que a entrada será dada como uma única sequência, embora você não a tenha explicitado. Quanta flexibilidade existe no formato de entrada? Passar uma matriz de valores para uma função é aceitável? (Acho que não, deve ser uma string) A linha / coluna pode ser fornecida como argumentos separados para a tabela? (Acho que sim.) Por favor, esclareça.
Level River St
Isso ajuda?
J Atkin
As colunas não vão para cima / baixo e as linhas vão para a esquerda / direita? Acredito que as coordenadas em seus exemplos são invertidas.
precisa saber é o seguinte

Respostas:

2

Retina, 90 bytes

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

Meu primeiro grupo de equilíbrio regex. Ainda deve ser bem jogável. Tentará fazer isso mais tarde.

A idéia principal é contar os tubos até o nome da coluna e, em seguida, usar a mesma quantidade de tubos na linha, começando com o nome da linha desejada. Depois disso, capturamos o próximo valor, que é o resultado.

Experimente online aqui.

randomra
fonte
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)])

TESTE no 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
fonte
Nice, BTW Por que apenas no Firefox? (FWIW eu uso firefox)
J Atkin
A última vez que verifiquei, o Chrome ainda não havia implementado a atribuição de Reestruturação - Confirmado, isso gera um erro no Chrome "Lado esquerdo inválido na atribuição"
edc65 17/01/16
@JAtkin BTW por que não um voto positivo?
Edc65
Eu lido de cima para baixo, da esquerda um comentário, teve que fazer outra coisa, e se esqueceu;)
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

Exemplo de uso:

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

Como 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
fonte