我遇到了一个相当愚蠢的练习问题,被列为容易,所以我认为我可以做到。前提是医生必须听到患者说aah才能进行诊断,但是患者的AAH必须与医生要求的AAH相匹配。如果医生要求AAAAAH,并且患者说啊,则无法给予诊断。Haskell计划应该在医生中阅读,并按照该顺序阅读AAH,并返回BOOL值,以便如果可以进行诊断。起初,我认为它们需要相同,所以这是我的代码:
seeDoctor :: String -> String -> Bool
seeDoctor a b = if a == b then True
else False
但是,我意识到我没有遵循问题的所有规则,也不是那么简单。病人可以说的时间比医生更长,然后返回真实,所以" aah" aaaah"返回," aaah"one_answers" aaah"one_answers" h" aah",但" aaah" ah"返回false。但是,即使医生在其AAH中不包含" H",患者也必须,因此" A" A"也会返回false,但我的代码将返回true。因此,如果患者说了什么,则必须是" A"的必要数量,其次是单个" H",而没有其他字符。您会看到,一旦我开始尝试建议的测试用例,我就意识到自己了解得很少。我可以在每个字符串中保留" A"的数量吗?如何检查额外的字符?抱歉,这花了一段时间才阅读。感谢您这么远。
这是确切的问题:
"当我们去看医生时,医生总是要求我们说" aaah"。 有时,医生需要我们说" aaaaaah",但我们只能 说" aaah"。在这种情况下,医生无法诊断我们 疾病,因为我们的" aaah"中的a比他或她少 要求。现在,写一个名为Seedoctor的Haskell功能以判断 如果医生可以用我们的" AAH"诊断我们。输入的输入 功能由两个字符串组成。第一个字符串是" aaaah" 医生的需求和第二个字符串是我们可以说的" AAH"。 如果我们的" aah"满足医生的要求,则输出" true",并且 否则输出" false"。该测试只有在 使用小写'A和'H,每个字符串包含一定 'a的数量,其次是单个" H"。
,既然您要学习Haskell,我不会给您解决方案,但是我会尝试给您足够的提示,以使您能够自己放置一个功能。
字符串是列表,因此您可以使用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'
也许您还想检查流氓字符的输入,如果两个字符串包含a
和h
...
False
。 Prelude Data.List> all (c -> c == 'a' || c == 'h') "aaah"
True
Prelude Data.List> all (c -> c == 'a' || c == 'h') "aaah!"
False
但是,您会如何处理像"aha"
这样的字符串?我将其作为练习:)