我遇到了一个相当愚蠢的练习问题,被列为简单,所以我想我能做到。前提是医生必须听到患者说aah才能做出诊断,但患者的aah必须符合医生要求的aah。如果医生要求aaaaah并且病人说啊,那么就不能给出诊断。 Haskell程序应按照该顺序读取医生和患者aah,如果可以给出诊断,则返回Bool值。起初我认为他们需要完全相同所以这是我的代码:
seeDoctor :: String -> String -> Bool
seeDoctor a b = if a == b then True
else False
然而,我意识到我并没有遵循问题的所有规则而且并非如此简单。患者可能会说aah比医生更长并且返回True,因此“aah”“aaaah”返回True,“aaah”和“h”“aah”返回True,但“aaah”“ah”返回False。但即使医生在他们的aah中没有包含'h',患者也必须,所以“a”“a”返回False,但我的代码将返回True。因此,如果患者说了什么,那么它必须是'a后面跟一个'h'而不是其他字符的必要数字。你看,一旦我开始尝试建议的测试用例,我意识到我的理解有多少。我可以在每个字符串中保留'a'的计数吗?如何检查额外字符?对不起,这需要一段时间才能阅读。感谢你做到这一点。
这是确切的问题:
“当我们去看医生时,医生总是要求我们说”aaah“。 有时,医生需要我们说“aaaaaah”,但我们只能做到 说“aaah”。在那种情况下,医生无法诊断我们的 疾病,因为'a'在我们的“aaah”比他或她少 要求。现在,编写一个名为seeDoctor的Haskell函数来判断 如果医生可以用我们的“aah”来诊断我们。的输入 函数由两个字符串组成。第一个字符串是“aaaah” 医生需要和第二个字符串是我们能够说的“啊”。 如果我们的“aah”符合医生的要求,则输出“True” 否则输出“False”。只有当测试时,测试才能通过“True” 使用小写'a'和'h',每个字符串包含一个 'a'后跟一个'h'的数量。“
答案 0 :(得分:6)
既然您正在尝试学习Haskell,我不会给您一个解决方案,但我会尝试给您足够的提示,让您自己将功能放在一起。< / p>
字符串是列表,因此您可以使用Data.List
中的常规列表函数。例如,isSubsequenceOf
几乎可以满足您的需求:
Prelude Data.List> isSubsequenceOf "aah" "aaah"
True
Prelude Data.List> isSubsequenceOf "aaaah" "aah"
False
如果我正确解释问题描述,您可能还应检查输入字符串中是否只有a
和h
,而h
是最后一个字符。
为了检查h
是否为最后一个字符,您可以使用last
函数:
Prelude Data.List> last "aaaah"
'h'
Prelude Data.List> last "ah"
'h'
Prelude Data.List> last "foo"
'o'
也许您还想检查流氓字符的输入,如果两个字符串包含除False
和a
之外的任何其他字符,则返回h
... < / p>
Prelude Data.List> all (\c -> c == 'a' || c == 'h') "aaah"
True
Prelude Data.List> all (\c -> c == 'a' || c == 'h') "aaah!"
False
你会对"aha"
这样的字符串做些什么呢?我将此作为练习留下:))