繁体   English   中英

在Haskell中按修改/变形的字母排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM