尝试用字母表中频率相似的对应字母替换字符串中的字母
本文关键字:字符串 替换 相似 字母表 频率 | 更新日期: 2023-09-27 18:26:40
正如标题所述,我正试图用字母表中的相应字母替换特定字符串中频率最高的字母。
例如,如果字符串中有最多的D
s,那么我会用E
替换所有的D
s,因为这是字母表中最常见的字母,然后我会继续这个过程,降低字母频率。。。
所以我有一个镜头,但我的输出是完全错误的。
我对进步完全陌生,所以如果这一切让你反感,我很抱歉,但我仍然喜欢按照我已经遵循的格式来做。
我把我的代码链接如下,我用几个单独的方法完成了,我想知道是否有人能发现我遇到的问题。
我相信这是在替换错误的字母,但我真的不知道,我以前只做过一个简单的塞萨尔密码,所以这不是一个很大的步骤,但我确实不知道出了什么问题。
哦,请忽略变量名等,它们只是占位符:
public class Decode
{
public static void doDecode()
{
string decoding = File.ReadAllText(@"thing.txt", Encoding.Default);
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int counter = 0;
int amount = 0;
int[] letterAmounts = new int[26];
decoding = decoding.Replace(Environment.NewLine, "");
decoding = decoding.Replace(" ", "");
foreach (char k in alphabet)
{
amount = Advanced.Adv(decoding, k);
letterAmounts[counter] = amount;
counter++;
}
File.WriteAllText(@"stuff.txt", Change.doChange(decoding, letterAmounts));
System.Diagnostics.Process.Start(@"stuff.txt");
}
}
因此,这只需调用其他类,并将找到的数字分配给数组
public class Advanced
{
public static int Adv(string test, char c)
{
int count = 0;
foreach (char x in test)
{
if (x == c)
{
count = count + 1;
}
}
return count;
}
}
这是以前调用的,只是计算一个字母的数量
public class Change
{
public static string doChange(string test, int[] letterAmounts)
{
string frequency = "ETAOINSHRDLCUMWFGYPBVKJXQZ";
char[] mostFrequent = frequency.ToCharArray();
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] abc = alphabet.ToCharArray();
int most = 0;
int position = 0;
for (int tester = 0; tester < 26; tester++)
{
most = letterAmounts.Max();
position = Array.IndexOf(letterAmounts, most);
test = test.Replace(abc[position], mostFrequent[tester]);
letterAmounts[position] = 0;
}
return test;
}
}
这就是我认为问题所在的地方,但我无法理解为什么,我再次知道它很混乱,但我非常感谢任何帮助。
看起来这部分正在做一些奇怪的事情:
for (int tester = 0; tester < 26; tester++)
{
most = letterAmounts.Max();
position = Array.IndexOf(letterAmounts, most);
test = test.Replace(abc[position], mostFrequent[tester]);
letterAmounts[position] = 0;
}
因此,让我们运行一个"I AM BOB"的示例字符串。这将被转换为"IAMBOB",您的letterAmount将产生1,1,1,2,1,2。您的上述for循环将执行以下操作:
most = 2;
position = 3; //IndexOf reports the zero-based index.
test = test.Replace(abc[3], mostFrequent[0]);
letterAmounts[3] = 0;
在第一个循环中,它将用"E"替换任何字母"D",其中没有。在第二个循环中,你会得到:
most = 2; //second B.
position = 5;
test = test.Replace(abc[5], mostFrequent[1]);
letterAmounts[5] = 0;
这一次你将用T来代替E。基本上,你并没有取代你认为的字母。此外,这很好地强调了你最终可能会用新的字母替换之前替换的字母(在这种情况下,你在第一个循环中用E替换了D,但在第二个循环中,这些E现在将用T替换。
第一个错误似乎是使用letterAmounts中最大值的索引,然后在"abc"数组中查找字母。这些不一定相互对应。大概你想要的实际上是用最频繁的字母替换字母,那么第一个循环中的B和E?如果是这种情况,您将需要创建一个List>,使您能够报道字母和出现的次数。元组还允许您有重复的条目(与字典不同),这很可能会出现在本例中字母B的例子中。
然后返回元组列表中的字母,并使用它进入替换的abc[]部分。但是,您仍然需要弄清楚如何替换已经被替换的字母。例如,这种情况应该发生吗?
只需像这样更改代码,它可能会在中工作
string decoding = File.ReadAllText(@"thing.txt", Encoding.Default);
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
decoding = decoding.ToUpper();