我有一个包含整个字母表的字符串,然后我想要一个不同的字符串,方法是选择一个关键字并将其添加到一个确切的位置然后排序字母表中的其余字符。
例如,关键字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
并且示例的给定输出是 - >
主>陌生"策划" '克'
"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。现在我得到了所需的输出。
答案 0 :(得分:1)
你的问题有点不清楚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"