看看这个编程挑战。
https://gist.github.com/1083219
我们构建了一种新的通信协议,可以使用受限制的语法发送消息。 我们需要编写一个函数来确定给定的消息是否在语法上有效。
以下是规则:
- 协议中有15个有效字符:小写字符'a'到'j' 和大写字母'Z','M','K','P'和'Q'。
- 隔离的每个小写字符都是有效的消息,例如,“a”是有效消息。
- 如果σ是有效信息,则Zσ也是如此。
- 如果σ和τ是有效信息,则Mστ,Kστ,Pστ和Qστ也是如此。
- 所有其他消息均无效。
醇>以您选择的语言编写函数,以检查消息是否有效。 输入由一系列由空格分隔并包含的潜在消息组成 只有上面的15个字符。
输出包含每个潜在消息一行,如果消息有效,则后跟'VALID',如果消息无效,则后跟'INVALID'。
下面是一些示例输出。
Input Output Qa Zj Qa INVALID MZca Zj VALID Khfa MZca VALID Khfa INVALID
有很多方法可以解决它,包括正则表达式,逐字符解析。我想知道别人怎么想如何解决这个问题。
我认为一个简单的解析器可能是最好的方法。首先编写语法,然后实现解析器。
答案 0 :(得分:1)
我认为你应该可以用一个相当简单的递归字符串函数f
来做到这一点:
Z
,请返回f(the rest of the string)
M, K, P, or Q
,则返回f(f(the rest of the string))
然后将它包装在函数g
中,如果f返回空字符串则返回true,否则返回false。为每条消息执行此操作。
这是有效的,因为您描述的语法是一个简单的树结构:任何有两个子节点的节点都是M, K, P, or Q
,任何有一个子节点的节点都是Z
,任何叶子都是小写字母。 f
总是只在树上消耗一个节点并返回树的其余部分(包括兄弟节点),并在格式错误的树上返回非空字符串。