[英]ordering in modified/deranged alphabet in haskell
我有一个包含整个字母的字符串,然后我想要一个与之不同的字符串,方法是选择一个关键字并将其添加到准确的位置,然后对字母的其余字符进行排序。
例如,使用关键字gamer
并以'l'
给出起始位置,结果应为-> "abcdefghijklmnopqrstuvwxyz" "opqstuvwxyzgamerbcdfhijkln"
我已经看到了在修改后的凯撒密码中使用的密码,但是我还没有找到算法这部分的解决方案。
================================================== ==============================现在我能够写的是:
import List
derange key char = (fst(divided char)\\key) ++ key ++ (snd(divided char)\\key)
abc = ['a'..'z']
divided char = break (char==) abc
给定示例的输出是->
Main>排列“绘图”“ g”
"abcdefplotinghjkmqrsuvwxyz"
因此,从“ g”的位置开始,我写了关键字“ ploting”,其余字母没有重复的字符被添加。
但是仍然存在一个小问题,因为字母表的其余部分应该从关键字之后的第一个可能的字符继续。 因此,正确的输出应该是“ uvwxyzplotingabcdefhjkmqrs”。
因此,我编写了代码,以获得所需的结果。 最初,我尝试使用keyword
和字符的具体给定值进行尝试。 我得出的是以下内容:
`concat[drop (length['a'..'z'] - index('a','z') 'l') "gamerbcdfhijklnopqstuvwxyz",take (length['a'..'z'] - index('a','z') 'l') "gamerbcdfhijklnopqstuvwxyz"]`
结果是
"opqstuvwxyzgamerbcdfhijkln"
,正是我想要的。
但是后来我尝试对代码进行概括,所以我写了这个。
import List
derange key char = concat [drop (length abc - index('a','z') char) def,
take (length abc - index('a','z') char) def]
where abc = ['a'..'z']
def = key ++ (key\\abc)
但是现在的输出是
Main> derange "gamer" 'l'
"gamer"
我不知道为什么。 有什么建议么?
发现了问题,只需要交换列表内的密钥和abc的区别。 现在我得到所需的输出。
你的问题是什么的预期行为有点不清楚derange
应该是。 这似乎符合您的描述
import Data.List ((\\))
-- returns the 0-based index of c in ['a' .. 'z']
index :: Char -> Int
index c = fromEnum c - 97
derange :: Char -> String -> String
derange key str =
drop (i - length str) (tail bs ++ str ++ as)
where (as, bs) = splitAt i $ ['a' .. 'z'] \\ str
i = index key
样本输出
λ. derange 'g' "ploting"
"jkmqrsuvwxyzplotingabcdef"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.