Ros*_*nal 6 string algorithm combinations haskell
如果给我一个字符串skhfbvqa,我将如何生成下一个字符串?对于这个例子,它将是skhfbvqb,并且下一个字符串将是skhfbvqc,依此类推.给定的字符串(和答案)总是N个字符长(在这种情况下,N = 8).
我尝试了什么:
我试图生成可能组合的整个(无限)列表,并获得给定字符串的必需(下一个)字符串,但不出所料,它太慢了,我甚至得不到N = 6的答案.
我使用了列表理解:
allStrings = [ c : s | s <- "" : allStrings, c <- ['a'..'z'] ]
main = do
input <- readFile "k.in"
putStrLn . head . tail . dropWhile (not . (==) input) . map reverse $ allStrings
Run Code Online (Sandbox Code Playgroud)
(请原谅我非常糟糕的Haskell-ing :)还是一个菜鸟)
所以我的问题是,我该怎么做?如果有多种方法,我们非常感谢它们之间的比较.谢谢!
我会去创建一个辅助函数f :: Integer -> String和一个g :: String -> Integer,where f 1 = "a",... f 27 = "aa",f 28 = "ab"等等以及相反的函数g。
然后incrementString = f . succ . g
f注:为了学习,我故意省略了实现
对于不同的方法,您可以使用进位函数定义增量inc' :: Char -> (Char, Bool),然后
incString :: String -> String
incString = reverse . incString'
where incString' [] = []
incString' (x:xs) = case inc' x of (x',True) -> x': incString' xs
(x',False) -> x':xs
Run Code Online (Sandbox Code Playgroud)
注意:这个函数不是尾递归!
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |