Encryption F中的频率密码#

Encryption F中的频率密码#,encryption,f#,frequency,substitution,Encryption,F#,Frequency,Substitution,我目前正在研究F#中的频率替换密码。这意味着我计算了文本中每个字母的所有出现次数,完成后,我想根据英文字母表中的字母频率替换这些字母 到目前为止,我已经创建了一个(char*float*char)列表,其中包含(字母、频率百分比、推荐字母)。假设字母P是我加密文本中出现最多的字母(13.5%的字母是P),而E是英语文本中使用最多的字母,我们的列表元素如下所示('P',13.5',E')。本程序将对文本中的所有字母执行,因此我们将最终列出所有字母及其建议替换的列表 我的问题是,我真的不知道如何用推

我目前正在研究F#中的频率替换密码。这意味着我计算了文本中每个字母的所有出现次数,完成后,我想根据英文字母表中的字母频率替换这些字母

到目前为止,我已经创建了一个(char*float*char)列表,其中包含(字母、频率百分比、推荐字母)。假设字母P是我加密文本中出现最多的字母(13.5%的字母是P),而E是英语文本中使用最多的字母,我们的列表元素如下所示('P',13.5',E')。本程序将对文本中的所有字母执行,因此我们将最终列出所有字母及其建议替换的列表

我的问题是,我真的不知道如何用推荐的替换字母替换密文中的字母

Letter frequency in the english alphabet.
[(' ', 20.0); ('E', 12.02); ('T', 9.1); ('A', 8.12); ('O', 7.68); ('I', 7.31);
 ('N', 6.95); ('S', 6.28); ('R', 6.02); ('H', 5.92); ('D', 4.32); ('L', 3.98);
 ('U', 2.88); ('C', 2.71); ('M', 2.61); ('F', 2.3); ('Y', 2.11); ('W', 2.09);
 ('G', 2.03); ('P', 1.82); ('B', 1.49); ('V', 1.11); ('K', 0.69); ('X', 0.17);
 ('Q', 0.11); ('J', 0.1); ('Z', 0.07)]


Letter frequency in cipher.
[('W', 21.18); ('Z', 8.31); ('I', 7.7); ('P', 6.96); ('Y', 5.5); ('H', 5.48);
 ('G', 5.35); ('K', 5.3); ('N', 4.31); ('O', 4.31); ('M', 3.66); (' ', 2.83);
 ('A', 2.58); ('T', 2.38); ('Q', 2.22); ('B', 2.11); ('F', 2.11); ('.', 2.04);
 ('R', 1.62); ('S', 1.37); ('E', 1.06); ('X', 0.97); ('U', 0.25); ('L', 0.16);
 ('V', 0.11); ('J', 0.07); ('C', 0.02); ('D', 0.02)]


Recommended letter changes.
[('W', 21.18, ' '); ('Z', 8.31, 'E'); ('I', 7.7, 'T'); ('P', 6.96, 'A');
 ('Y', 5.5, 'O'); ('H', 5.48, 'I'); ('G', 5.35, 'N'); ('K', 5.3, 'S');
 ('N', 4.31, 'R'); ('O', 4.31, 'H'); ('M', 3.66, 'D'); (' ', 2.83, ' ');
 ('A', 2.58, 'L'); ('T', 2.38, 'U'); ('Q', 2.22, 'C'); ('B', 2.11, 'M');
 ('F', 2.11, 'F'); ('.', 2.04, 'Y'); ('R', 1.62, 'W'); ('S', 1.37, 'G');
 ('E', 1.06, 'P'); ('X', 0.97, 'B'); ('U', 0.25, 'V'); ('L', 0.16, 'K');
 ('V', 0.11, 'X'); ('J', 0.07, 'Q'); ('C', 0.02, 'J'); ('D', 0.02, 'Z')] 
如果有人对如何解决这个问题有什么好的想法,我会非常感激,因为我已经在这个问题上纠缠了一段时间。

很可能你想要一个映射操作。类似于
myString |>String.map mappingFunction
的内容。请注意,映射函数也可以是函子或当前的高阶函数

函子方法将允许您将频率放入对象状态

curried函数允许您将频率作为参数传递


这取决于您选择哪种方法在您的应用程序中更有意义和/或看起来更自然。

我相信您缺少英文字母表中的
频率(应介于
D
L
之间。当您将缺少的值添加到
alphaFreq
列表时,两个列表的长度相同,您可以通过压缩两个有序列表来生成推荐的更改映射:

let changes =
    alphaFreq // list with letter frequency in the English alphabet
    |> List.zip cipherFreq // zipping with cipher frequency list
    |> List.map (fun ((cipherLetter,_), (alphaLetter,_)) -> (alphaLetter, cipherLetter))
    |> Map.ofList
编码测试:

"HELLO WORLD" |> String.map (fun ch -> changes.[ch]) |> printfn "%s"
// OZAAYWRYNAM

要获得解码器映射,只需交换字母顺序
->(密码、字母)

示例数据有问题。两个列表的长度不相等。建议的字母更改
('W',21.18',)
('',2.83',)中有两次空格
谢谢!非常好用,你介意简单解释一下。[]在变化中的作用吗。[ch]?从未在F#中看到过这种语法(虽然我对这种语言不熟悉)。@O.Sherlock当然,
变化
是一种变化,
[ch]
得到了。