Lesen Sie die Tabellen

11

Aufgabe

Lesen Sie den Inhalt einer Tabelle mit einem Satz von Koordinaten.

Tabellenformatierung

Die Tabellen haben dieses Grundformat:

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

Spaltennamen sind innerhalb von Spalten immer eindeutig . Zeilennamen sind auch innerhalb von Zeilen eindeutig . Dies schließt Namen ein, die bis auf Leerzeichen identisch sind. Werte, Spaltennamen und Zeilennamen werden niemals enthalten sein |-. Namen und Werte enthalten niemals Leerzeichen, sondern möglicherweise führende oder nachfolgende Leerzeichen. Die Spaltenbreite kann je nach Kopfzeile / Inhalt angepasst werden. Die Spaltenbreite ist von oben nach unten immer gleich.

Eingang

Eine Tabelle und eine durch Leerzeichen getrennte Liste von [name]s.

Beispiel

[table]
row col

Wenn Sie eine Funktion schreiben, können dies separate Zeichenfolgen sein, andernfalls row colist dies immer die allerletzte Zeile in der Eingabe. row colhat eine gewisse Flexibilität für das Format und kann auf viele Arten dargestellt werden. (zB (row, col), r, c, ...). Die einzige schwierige Anforderung ist, dass es sich um eine Zeile handelt und dass sie in der Reihenfolge erscheinen muss col row.

Ausgabe

Der Inhalt einer durch die Eingabe angegebenen Zelle ohne führenden oder nachfolgenden Leerzeichen von der Zelle .

Beispiele

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
quelle
Wird die in der Eingabe angeforderte Zelle immer in der Tabelle vorhanden sein?
ETHproductions
Oh, jetzt verstehe ich es;) Ja, das wird es
J Atkin
Es scheint, dass die Eingabe als einzelne Zeichenfolge angegeben wird, obwohl Sie sie nicht explizit angegeben haben. Wie flexibel ist das Eingabeformat? Ist es akzeptabel, ein Array von Werten an eine Funktion zu übergeben? (Ich vermute nein, es muss eine Zeichenfolge sein.) Kann die Zeile / Spalte als separate Argumente für die Tabelle angegeben werden? (Ich vermute wahrscheinlich.) Bitte klären Sie.
Level River St
Hilft das?
J Atkin
Gehen Spalten nicht nach oben / unten und Zeilen nach links / rechts? Ich glaube, die Koordinaten in Ihren Beispielen sind umgekehrt.
KoreanwGlasses

Antworten:

2

Netzhaut, 90 Bytes

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

Meine erste Ausgleichsgruppe Regex. Es sollte immer noch gut golfbar sein. Ich werde es später versuchen.

Die Hauptidee besteht darin, die Pipes bis zum Spaltennamen zu zählen und dann die gleiche Anzahl von Pipes in der Zeile zu verwenden, beginnend mit dem Namen der gewünschten Zeile. Danach erfassen wir den nächsten Wert, der das Ergebnis ist.

Probieren Sie es hier online aus.

randomra
quelle
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 in 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
quelle
Schön, übrigens, warum nur in Firefox? (FWIW Ich benutze Firefox)
J Atkin
Als ich das letzte Mal nachgesehen habe, hatte Chrome die Destrukturierungszuweisung noch nicht implementiert. - Bestätigt, dies gibt einen Fehler in Chrome "Ungültige linke Seite in Zuweisung"
edc65
@JAtkin Übrigens, warum nicht eine Gegenstimme?
edc65
Ich las von oben nach unten, hinterließ einen Kommentar, musste etwas anderes tun und vergaß;)
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

Anwendungsbeispiel:

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

Wie es funktioniert:

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
quelle