簡體   English   中英

嘗試用類似頻率的字母替換字符串中的字母

[英]Trying to replace letters in a string with the corresponding letter in the alphabet with a similar frequency

如標題所示,我正在嘗試將頻率最高的特定字符串中的字母替換為字母中的相應字母。

例如,如果字符串中包含的D最多,那么我會用E替換所有D ,因為這是字母表中最常見的字母,然后我會繼續降低字母頻率來繼續此過程...

所以我拍了張照片,但我的輸出完全錯誤。

我對progroqamming完全陌生,因此,如果您感到不滿意,對不起,但id仍然喜歡按照我已經遵循的格式進行操作。

我已經按如下方式鏈接了我的代碼,我用幾種單獨的方法來完成它,我想知道是否有人可以發現我遇到的問題。

我相信它將取代錯誤的字母,但我真的不知道,我之前只做過簡單的盲孔密碼,所以這不是很大的一步,但我真的無法解決問題。

哦,請忽略變量名,以此類推,它們只是占位符:

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;
    }
}

這是我認為存在問題的地方,但是我無法回避為什么,我再次知道它是混亂的,但是任何幫助都深表感謝。

只是像這樣更改您的代碼,可能就可以了

string decoding = File.ReadAllText(@"thing.txt", Encoding.Default);          
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
decoding = decoding.ToUpper();

看起來本節正在做一些奇怪的事情:

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”,並且您的letterAmounts結果將為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'數組中找到字母。 這些不一定彼此對應。 大概您想要的實際上是替換頻率最高的字母,那么在第一個循環中用E替換B? 如果是這種情況,您將需要創建一個List>,以使您能夠說明字母和出現次數。 元組也將允許您有重復的條目(與字典不同),這很可能按照本示例中字母B的示例出現。

然后返回元組列表中的字母,並使用它進入替換的abc []部分。 但是,您仍然需要弄清楚如何繼續替換已經被替換的字母。 例如,應該發生這種情況嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM