Pra*_*nav 10 language-agnostic algorithm
我很难找到以下谜题的算法 - 如果一个字符串连续有3个元音,或者连续5个辅音,或者两者都有,则称为丑陋.如果字符串不丑,则称其为nice.给你一个字符串s,由大写字母('A' - 'Z')和问号('?')组成.你能找到一个算法,通过用字母替换问号来判断字符串是否可以变好吗?
示例 -
"EE?FFFF" - 不能做得很好.插入辅音或元音会使它变得难看.
"H 24 LOWOR ??" - 可以做得很好.
PS - 不是家庭作业,而是互联网上编程难题的一部分.
Ric*_*lap 12
请注意,唯一可能丑陋的字符串是由于给定字母或仅包含单例问号而已经丑陋的字符串.这是证明的草图:
所以,我们留下了两个简单的案例.
Haskell中的解决方案:
import System (getArgs)
nicePart :: Int -> Int -> String -> Bool
nicePart 3 _ _ = False
nicePart _ 5 _ = False
nicePart _ _ "" = True
nicePart v c ('?':as) = nicePart (v+1) 0 as || nicePart 0 (c+1) as
nicePart v c (a:as)
| a `elem` "AEIOU" = nicePart (v+1) 0 as
| otherwise = nicePart 0 (c+1) as
nice :: String -> Bool
nice as = nicePart 0 0 as
main = getArgs >>= print . nice . unwords
Run Code Online (Sandbox Code Playgroud)
该函数保持在当前点看到的连续元音和辅音的数量.如果有太多它返回False.如果找到问号,则进行两次递归调用,一次将问号计为元音,一次作为辅音,检查这些变化是否合适.