轨道
/
Haskell
Haskell
/
练习
/
埃特巴什密码
埃特巴什密码

埃特巴什密码

中等

说明

实现 Atbash 密码,这是一种诞生于中东的古老加密系统。

Atbash 密码是一种简单的替换密码,它把字母表中所有字母的顺序颠倒过来,得到的字母表正好是倒序的。 第一个字母替换成最后一个字母,第二个替换成倒数第二个,依此类推。

针对拉丁字母表的 Atbash 密码如下:

Plain:  abcdefghijklmnopqrstuvwxyz
Cipher: zyxwvutsrqponmlkjihgfedcba

它是一种很弱的密码,因为只有一种可能的密钥,而且只是简单的单表替换密码。 不过,在它诞生的年代,这可能并不算问题。

密文按固定长度分组写出,传统上每组 5 个字母,数字保持不变,标点符号则被去掉。 这样做是为了让人更难根据单词边界来猜测内容。 所有文本都编码为小写字母。

示例

  • 编码test得到gvhg
  • 编码x123 yes得到c123b vh
  • 解码gvhg得到test
  • 解码gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt得到thequickbrownfoxjumpsoverthelazydog

提示

你需要实现decode和encode两个函数,这两个函数使用 Atbash 密码对String进行解码和编码。 如果你不确定类型,可以使用给出的签名,但不要让它限制你的创造力。

本练习处理的是文本数据。由于历史原因,Haskell 的String类型等同于[Char],也就是一个字符列表。若要更高效地处理文本数据,可以使用Text类型。

作为本练习的可选延伸,你可以

import qualified Data.Text as T
import           Data.Text (Text)
  • 使用Text类型,例如decode :: Text -> Text;并像T.pack那样引用Data.Text的组合子。
  • 查阅Data.Text的文档。
  • 把 Atbash.hs 中出现的所有String都替换成Text,即:
decode :: Text -> Text
decode cipherText = ...

encode :: Text -> Text
encode plainText = ...

这部分完全是可选的。


来源

Wikipedia链接会在新窗口或新标签页中打开
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Haskell Exercism

准备好开始 埃特巴什密码 了吗?

注册 Exercism,借助 107 个练习 和真人导师指导,学习并掌握 Haskell,全部免费。