0

我有一个包含整个字母表的字符串,然后我想要一个不同的字符串,方法是选择一个关键字并将其添加到一个确切的位置,然后对字母表的其余字符进行排序。

例如,使用关键字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" 

我不知道为什么。有什么建议么?

发现问题,只需要在列表差异内交换 key 和 abc 即可。现在我得到了想要的输出。

4

1 回答 1

1

Your question is a little unclear on what the expected behaviour of derange is supposed to be. This seems to match your description

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

sample output,

λ. derange 'g' "ploting"
"jkmqrsuvwxyzplotingabcdef"
于 2014-04-06T23:49:20.923 回答