想象一下,我有无数个作业问题(!),每个问题都有一个整数。
数学问题符号是一种使用问题说明符描述问题子集的符号。
MPN表达式可以包含以下几项:
- 单个值。这表示一个包含数字的集合:
99 -> {99}
。 - 一个简单的范围。这表示包含从范围的开始到结束的所有数字的集合
10~13 -> {10, 11, 12, 13}
。如果左侧或右侧丢失,那么他们被认为是负无穷大或无穷大分别为:~10 -> {x|x ≤ 10}
;~ -> ℤ
。 - 一个MPN表达式,后跟“跳过”和另一个MPN表达式。这代表了两组的区别:
10~20 skip 12~14 -> {10, 11, 15, 16, 17, 18, 19, 20}
。 - 两个MPN表达式,以逗号分隔。这表示两个集合的并集:
1,8~9,15~17 -> {1,8,9,15,16,17}
。
“跳过”运算符的绑定比逗号运算符更紧密,因此16,110~112 skip 16 -> {16,110,111,112}
(16个不包括在集合中{110,111,112}
中不包括16,因此排除16无关紧要。)
您也可以将表达式放在括号中以消除歧义:
1~9 skip (2~8 skip (3~7 skip (4~6 skip 5))) -> {1,3,5,7,9}
这是语法:
<expr> ::= "(" <expr> ")"
|| <number>
|| [<number>] "~" [<number>]
|| <expr> "skip" <expr>
|| <expr> "," <expr>
您的任务是编写一个接受两个输入的程序:
- MPN表达式
- 一个号码
并根据该问题是否在MPN表达式描述的集合中,输出一些真实或错误值。
技术指标
- 您可以假定第一个输入是格式正确的MPN表达式(即,它与上述语法匹配)
- MPN表达式中的数字始终是整数。它们可以是负数或零,但永远不会有小数部分。
- 这是代码高尔夫球,因此最短的有效提交(以字节为单位)获胜。
- 如果需要,可以为
~
和使用不同的字符,
。
测试用例
10~20 14 -> True
10~20 20 -> True
10~20 skip 14~18 17 -> False
~ skip 6 8 -> True
16,17 skip 16 16 -> True
(16,17) skip 16 16 -> False
~10,5~ 8 -> True
~10,5~ 4 -> True
6 skip 6,~ 6 -> True
~
和,
,但不支持skip
。
6 skip 6,~
,相信我已经正确解释了。到目前为止,其他两个答案都不满意(再次假设我的解释正确)。如果我误解了,请更正并弄清楚,但据我所知,它应该匹配任何内容(这是不匹配的集合的并集与匹配所有内容的集合的并集)。这些是我之前谈到的案例,我认为这些案例在测试我们的解决方案时会有所帮助。