如果给我一个像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
(请原谅我非常糟糕的 Haskell-ing :) 仍然是菜鸟)
所以我的问题是,我该怎么做?如果有多种方法,非常感谢它们之间的比较。谢谢!
最佳答案
这里有一个带base转换的版本(这样你可以随意加减):
encode x base = encode' x [] where
encode' x' z | x' == 0 = z
| otherwise = encode' (div x' base) ((mod x' base):z)
decode num base =
fst $ foldr (\a (b,i) -> (b + a * base^i,i + 1)) (0,0) num
输出:
*Main> map (\x -> toEnum (x + 97)::Char)
$ encode (decode (map (\x -> fromEnum x - 97) "skhfbvqa") 26 + 1) 26
"skhfbvqb"
关于string - 在 Haskell 中生成下一个字典字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34227379/