我正在编写一个代码,它接受保龄球得分(以10帧为单位),并对其进行评估。例如,得分为248的XXXXX6/XX7/XX5或得分为27的62--43---2----X--就是字符串。
我的第一个想法是尝试拆分字符串,以便将每个帧分组在一起,并以此方式单独删除;62--43---2----X-- --> ((6 2) (--) (4 3) (--) (2 -)... (X) (--))
从那里,评估分数会更容易。但是我找不到使用partition或partition-by的方法。有人能帮上忙吗?
发布于 2018-03-08 02:40:31
您可能正在寻找的是re-seq,它会将一个字符串拆分成与正则表达式匹配的字符串序列。在您的情况下,尝试使用(re-seq #"X|\d\d|\d/|--|-\d|\d-" frames-str),它将匹配以下内容之一:
对于您的示例:
"XXXXX6/XX7/XX5" -> ("X" "X" "X" "X" "X" "6/" "X" "X" "7/" "X" "X")
"62--43---2----X--" -> ("62" "--" "43" "--" "-2" "--" "--" "X" "--")发布于 2018-03-09 23:38:20
用instaparse编写保龄球得分语法/解析器的借口如何?
(def bowl-score-parser
(insta/parser
"S = F F F F F F F F F 10TH
F = OPEN | CLOSED
OPEN = ROLL ROLL
CLOSED = STRIKE | SPARE
10TH = OPEN |
SPARE (STRIKE | ROLL) |
STRIKE (SPARE | ROLL ROLL) |
STRIKE STRIKE (STRIKE | ROLL)
STRIKE = 'X'
SPARE = ROLL '/'
ROLL = PINS | MISS
PINS = #'[1-9]'
MISS = '-'"))这将解析保龄球得分的10帧,并对第10帧使用特殊规则。
前九帧中的每一帧都是OPEN (针脚保持不动)或CLOSED (所有针脚都是两个ROLL,这两个针脚要么是多个针脚,要么是未命中。CLOSED要么是STRIKE,要么是SPARE.
10TH描述了第十帧的可能状态,这令人惊讶地感到困惑!我可能弄错了。以下是测试用例的解析器输出:
(bowling-score-parser "XXXXX6/XX7/XX5")
=>
[:S
[:F [:CLOSED [:STRIKE "X"]]]
[:F [:CLOSED [:STRIKE "X"]]]
[:F [:CLOSED [:STRIKE "X"]]]
[:F [:CLOSED [:STRIKE "X"]]]
[:F [:CLOSED [:STRIKE "X"]]]
[:F [:CLOSED [:SPARE [:ROLL [:PINS "6"]] "/"]]]
[:F [:CLOSED [:STRIKE "X"]]]
[:F [:CLOSED [:STRIKE "X"]]]
[:F [:CLOSED [:SPARE [:ROLL [:PINS "7"]] "/"]]]
[:10TH [:STRIKE "X"] [:STRIKE "X"] [:ROLL [:PINS "5"]]]]注意:这个解析器允许一个帧中的总管脚数无效,但您可以制定更具体的语法/解析器或在解析后处理这种情况。
https://stackoverflow.com/questions/49156769
复制相似问题