Lisez les tableaux

11

Tâche

Lisez le contenu d'une table en fonction d'un ensemble de coordonnées.

Formatage du tableau

Les tableaux seront dans ce format de base:

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

Les noms de colonne sont toujours uniques dans les colonnes . Les noms de ligne sont également uniques dans les lignes . Cela inclut les noms qui sont les mêmes sauf les espaces. Les valeurs, les noms de col et les noms de ligne n'auront jamais à l' |-intérieur d'eux. Les noms et les valeurs n'auront jamais d'espace à l'intérieur, mais peuvent avoir un espace de début ou de fin. La largeur du col est réglable en fonction de l'en-tête / du contenu. La largeur de colonne est toujours cohérente de haut en bas.

Contribution

Une table et une liste de [name]s.

Exemple

[table]
row col

Si vous écrivez une fonction, il peut s'agir de chaînes distinctes, sinon la row colsera toujours la toute dernière ligne de l'entrée. row cola une certaine flexibilité pour le format et peut être représenté de plusieurs façons. (par exemple (row, col), r, c...). La seule exigence stricte est qu'il s'agisse d'une seule ligne et qu'elle apparaisse dans la commande col row.

Production

Le contenu d'une cellule spécifiée par l'entrée sans espace de début ou de fin de la cellule .

Exemples

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
la source
La cellule demandée dans l'entrée existera-t-elle toujours dans le tableau?
ETHproductions
Oh, maintenant je comprends;) Oui, ce sera le cas
J Atkin
Il semble que l'entrée sera donnée sous la forme d'une chaîne unique bien que vous ne l'ayez pas rendue explicite. Quelle est la flexibilité du format d'entrée? Le passage d'un tableau de valeurs à une fonction est-il acceptable? (Je suppose que non, il doit s'agir d'une chaîne) La ligne / col peut-elle être donnée comme arguments séparés dans la table? (Je suppose que probablement.) Veuillez clarifier.
Level River St
Est ce que ça aide?
J Atkin
Les colonnes ne montent / descendent pas et les lignes vont-elles à gauche / à droite? Je pense que les coordonnées dans vos exemples sont inversées.
KoreanwGlasses

Réponses:

2

Rétine, 90 octets

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

Mon premier regex de groupe d'équilibrage . Il devrait être encore bien golfable. J'essaierai de le faire plus tard.

L'idée principale est de compter les tuyaux jusqu'au nom de la colonne, puis d'utiliser la même quantité de tuyaux dans la ligne en commençant par le nom de la ligne souhaitée. Après cela, nous capturons la valeur suivante qui est le résultat.

Essayez-le en ligne ici.

randomra
la source
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)])

TEST dans 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
la source
Nice, BTW Pourquoi juste dans Firefox? (FWIW J'utilise Firefox)
J Atkin
La dernière fois que j'ai vérifié, Chrome n'avait pas encore implémenté la tâche de déstructuration - Confirmé, cela donne une erreur dans Chrome "Côté gauche non valide dans la tâche"
edc65
@JAtkin BTW pourquoi pas un vote positif?
edc65
J'ai lu de haut en bas, laissé un commentaire, j'ai dû faire autre chose et j'ai oublié;)
J Atkin
4

Haskell, 117 116 111 octets

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

Exemple d'utilisation:

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

Comment ça fonctionne:

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
la source