阅读表


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 2016年

哦,现在我明白了;)是的,它将
J Atkin

尽管您尚未明确输入,但似乎输入将作为单个字符串给出。输入格式有多少灵活性?将值数组传递给函数是否可以接受?(我猜不是,它必须是一个字符串)行/列可以作为表的单独参数提供吗?(我想可能是。)请澄清。
级圣河

有帮助吗?
J Atkin

列不上/下,行不左/右吗?我相信您示例中的坐标是相反的。
KoreanwGlasses

Answers:


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>


好的,顺便说一句,为什么只是在Firefox中?(FWIW我使用firefox)
J Atkin

上次我检查时,Chrome浏览器尚未实施解构分配-确认,这在Chrome浏览器中显示错误“分配中的左侧无效”
edc65 2016年

@JAtkin BTW为什么不支持?
edc65 '16

我从上至下阅读,发表评论,不得不做其他事情,而忘了;)
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.