Прочитайте таблиці


11

Завдання

Прочитайте вміст таблиці із заданим набором координат.

Форматування таблиці

Таблиці будуть у такому базовому форматі:

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

Назви стовпців завжди унікальні в межах стовпців . Назви рядків також унікальні в рядках . Сюди входять імена, однакові, крім пробілів. Значення, назви стовпців та назви рядків ніколи не матимуть |-всередині них. Імена та значення ніколи не матимуть пробілів всередині них, але можуть мати провідний або кінцевий простір. Ширина стовпа регулюється на основі заголовка / вмісту. Ширина стовпця завжди узгоджується зверху вниз.

Вхідні дані

Таблиця та розділений пробілом список [name]s.

Приклад

[table]
row col

Якщо ви пишете функцію, це можуть бути окремі рядки, інакше row colзавжди буде останній рядок у введенні. row colмає певну гнучкість до формату і може бути представлений багатьма способами. (Наприклад (row, col), r, c...). Єдиною суворою вимогою є те, що це один рядок, і він повинен з’являтися в порядку col row.

Вихідні дані

Вміст комірки, вказаний на вході, не має провідного або відсталого простору від комірки .

Приклади

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

Чи завжди в таблиці буде існувати запитувана на вхід клітинка?
ETHproductions

О, зараз я зрозумію;) Так, це буде
J Atkin

Здається, що введення буде надано як один рядок, хоча ви не зробили це явним. Скільки гнучкості у форматі введення? Чи прийнятне передавання масиву значень функції? (Я здогадуюсь, що ні, це повинен бути рядок) Чи можна давати рядок / кола як окремі аргументи до таблиці? (Мабуть, гадаю.) Будь ласка, уточнюйте.
Річка Рівень Св.

Чи допомагає це?
J Atkin

Чи не стовпці йдуть вгору / вниз, а рядки йдуть вліво / вправо? Я вважаю, що координати у ваших прикладах зворотні.
KoreanwGlasses

Відповіді:


2

Сітківка, 90 байт

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

Мій перший регекс для балансуючої групи . Це має бути все ще добре пограбовано. Спробую зробити це пізніше.

Основна ідея - підрахунок труб до назви стовпця, а потім використання однакової кількості труб у рядку, починаючи з потрібної назви рядка. Після цього ми фіксуємо наступне значення, яке є результатом.

Спробуйте його онлайн тут.


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

ТЕСТ у 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>


Добре, BTW Чому саме у firefox? (FWIW я використовую firefox)
J Atkin

Востаннє перевіряючи, Chrome ще не здійснив завдання деструктуризації - підтверджено, це призводить до помилки в Chrome "Недійсний лівий бік у призначенні"
edc65

@JAtkin BTW чому б не внести пропозицію?
edc65

Я читав зверху вниз, залишав коментар, мав щось робити і забув;)
J Atkin

4

Haskell, 117 116 111 байт

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

Приклад використання:

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

Як це працює:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.