如何在Haskell中生成代码,以确定字符串中的下一个字符与前一个字符相同?

如何在Haskell中生成代码,以确定字符串中的下一个字符与前一个字符相同?,haskell,Haskell,现在我正在哈斯克尔为复杂的凯撒密码编写代码。 我成功地为普通的凯撒密码制作了密码。 但我想做的是在使用了字符串中的一个字母后,再次按键位置旋转 例如,键位置为3的AAA将是XUR 所以我的问题是在第三步之后,我如何才能使下一个字母变成第六步,下一步变成第九步?如果我理解正确,我们只需要跟踪位置。我们可以通过zipWith使用[i,i+d..]列表来实现 因此,我们可以构造一个如下所示的函数: trithemiusEncrypt :: Int -> Int -> String ->

现在我正在哈斯克尔为复杂的凯撒密码编写代码。 我成功地为普通的凯撒密码制作了密码。 但我想做的是在使用了字符串中的一个字母后,再次按键位置旋转

例如,键位置为3的AAA将是XUR


所以我的问题是在第三步之后,我如何才能使下一个字母变成第六步,下一步变成第九步?

如果我理解正确,我们只需要跟踪位置。我们可以通过
zipWith
使用
[i,i+d..]
列表来实现

因此,我们可以构造一个如下所示的函数:

trithemiusEncrypt :: Int -> Int -> String -> String
trithemiusEncrypt i d = zipWith _ [i, i+d .. ]
这给了我们预期的结果:

Prelude> trithemiusEncrypt 3 3 "AAA"
"XUR"
Prelude> trithemiusEncrypt 3 3 "ABC"
"XVT"

如果我理解正确的话,我们只需要跟踪这个位置。我们可以通过
zipWith
使用
[i,i+d..]
列表来实现

因此,我们可以构造一个如下所示的函数:

trithemiusEncrypt :: Int -> Int -> String -> String
trithemiusEncrypt i d = zipWith _ [i, i+d .. ]
这给了我们预期的结果:

Prelude> trithemiusEncrypt 3 3 "AAA"
"XUR"
Prelude> trithemiusEncrypt 3 3 "ABC"
"XVT"


我并没有真正理解这里的“同一”字母的含义。如果我理解正确,你每次在“增量”中添加
3
,那么
ABC
将编码到
XVT
,或者我遗漏了什么吗?@WillemVanOnsem我的解释是
c::Int
表示的字符将映射到
(c-(n*键))`mod`26
,而,其中
n
c
在字符串中的位置。但是这个问题仍然没有意义:在我看来,一个字母是否已经被使用与这个密码没有任何关系。如果你在
X
中添加3,它将
U
移到左边,然后再向左移动3,这就是
R
@bradm:是的,这或多或少与我想到的公式相同。或者,正如@WillemVanOnsem刚刚回答的,您可以使用
zipWith
;我应该注意到,这相当于我之前建议使用
zip
然后映射,但这是一个更干净的选择!我并没有真正理解这里的“同一”字母的含义。如果我理解正确,你每次在“增量”中添加
3
,那么
ABC
将编码到
XVT
,或者我遗漏了什么吗?@WillemVanOnsem我的解释是
c::Int
表示的字符将映射到
(c-(n*键))`mod`26
,而,其中
n
c
在字符串中的位置。但是这个问题仍然没有意义:在我看来,一个字母是否已经被使用与这个密码没有任何关系。如果你在
X
中添加3,它将
U
移到左边,然后再向左移动3,这就是
R
@bradm:是的,这或多或少与我想到的公式相同。或者,正如@WillemVanOnsem刚刚回答的,您可以使用
zipWith
;我应该注意到,这相当于我之前建议使用
zip
然后映射,但这是一个更干净的选择!输入必须是:
encrypt 3“AAA”
?@dasogom:我作为练习离开:)
encode n ss=zipWith shift[n,n*2..n*(长度(ss)][ss]
不起作用?@dasogom:为什么你希望这个定义首先起作用?试着想想你如何用
trithemiusEncrypt
来编写
encode n ss
。顺便问一下,空间呢?例如,
AAAA
必须是“YWU SQO”。如果
zipWith
count space,那么它就变成了
YWU QOM
。那么空间呢put必须是:
encrypt 3“AAA”
?@dasogom:作为练习离开:)
encode n ss=zipWith shift[n,n*2..n*(长度(ss)][ss]
不起作用?@dasogom:为什么你希望这个定义首先起作用?试着想想你如何用
trithemiusEncrypt
来编写
encode n ss
。顺便问一下,空间呢?例如,
AAAA
必须是“YWU SQO”。如果
zipWith
count space,它就变成了
YWU QOM