簡體   English   中英

給定一個包含字典中所有單詞的數組,根據分配給字母表中每個字符的數值為每個單詞分配一個值

[英]Given an array that is all words in the dictionary, assign a value to each word based on a numerical value assigned to each character in the alphabet

我已經在字典中列出了一個單詞列表,並將它們變成了一個龐大的數組。 反過來,我創建了一個腳本,遍歷每個單詞並分解出出現最多的字母字符。 所以我有一個分配給每個字符的值列表,其中 26 是分配給最常見字母 s 的值,而 1 是分配給最不常見字母 q 的值。

我又制作了一個腳本,遍歷所有單詞並分配了這些值,然后可以在控制台上 output 像“軟糖:72”一樣

            foreach (string word in masterList)
        {
            int wordValue = 0;
            foreach (char letter in word)
            {
                if (letter == 'a')
                {
                    wordValue += 23;
                }
                if (letter == 'b')
                {
                    wordValue += 10;
                }
                if (letter == 'c')
                {
                    wordValue += 14;
                }
                if (letter == 'd')
                {
                    wordValue += 16;
                }
                if (letter == 'e')
                {
                    wordValue += 25;
                }
                if (letter == 'f')
                {
                    wordValue += 7;
                }
                if (letter == 'g')
                {
                    wordValue += 9;
                }
                if (letter == 'h')
                {
                    wordValue += 24;
                }
                if (letter == 'i')
                {
                    wordValue += 20;
                }
                if (letter == 'j')
                {
                    wordValue += 2;
                }
                if (letter == 'k')
                {
                    wordValue += 8;
                }
                if (letter == 'l')
                {
                    wordValue += 18;
                }
                if (letter == 'm')
                {
                    wordValue += 11;
                }
                if (letter == 'n')
                {
                    wordValue += 17;
                }
                if (letter == 'o')
                {
                    wordValue += 21;
                }
                if (letter == 'p')
                {
                    wordValue += 13;
                }
                if (letter == 'q')
                {
                    wordValue += 1;
                }
                if (letter == 'r')
                {
                    wordValue += 22;
                }
                if (letter == 's')
                {
                    wordValue += 26;
                }
                if (letter == 't')
                {
                    wordValue += 19;
                }
                if (letter == 'u')
                {
                    wordValue += 15;
                }
                if (letter == 'v')
                {
                    wordValue += 5;
                }
                if (letter == 'w')
                {
                    wordValue += 6;
                }
                if (letter == 'x')
                {
                    wordValue += 4;
                }
                if (letter == 'y')
                {
                    wordValue += 12;
                }
                if (letter == 'z')
                {
                    wordValue += 3;
                }
            }
            Console.WriteLine(word + ": " + wordValue);
        }

但是,我想將“wordValue”分配給每個“word”,然后按最高值“wordValue”對數組進行排序。

你可以稍微壓縮你的得分。 每個字母在最左邊的 q 和最右邊的 s 的字符串中獲得其 position 的分數:

class WordCalc{

    private string _scores = "qjzxvwfkgbmypcudnltiorahes";

    public int WordScore(string word) => word.Sum(c => _scores.IndexOf(c)+1);

因此,您可以使用它來訂購單詞列表:

var calc = new WordCalc();
words.OrderByDescending(w => calc.WordScore(w));

如果你想加快查找速度,例如,你有很多話要做:

class WordCalc{

    private Dictionary<char, int> _scores;
    

    public WordCalc(string scoreLetters = "qjzxvwfkgbmypcudnltiorahes"){
      _scores = scoreLetters
        .Select((c,i) => new { C= c, S = i+1})
        .ToDictionary(at => at.C, at => at.S);
    }

    public int WordScore(string word) => word.Sum(c => _scores.TryGetValue(c, out var s) ? s : 0);

我們制作了一個將字符映射到分數的字典,並使用它。 當 IndexOf 沒有找到我們 +1 的字符時返回 -1,因此未知字符得分為 0。如果查找未知字符,字典會崩潰,因此我們嘗試獲取該值,如果成功,我們使用它,否則我們使用 0

還有另一個技巧依賴於 c# 能夠將字符和整數視為等效

class WordCalc
{

    private int[] _scores = new int[65535];


    public WordCalc(string scoreLetters = "qjzxvwfkgbmypcudnltiorahes")
    {
        for (int x = 0; x < scoreLetters.Length; x++)
            _scores[scoreLetters[x]] = x+1;
        
    }

    public int WordScore(string word) => word.Sum(c => _scores[c]);
}

我們聲明了一個足以容納每個字符的 int 數組; 大多數情況下它們是零,但隨后我們運行一個循環,將 char 拉到索引x並使用它來索引數組。 因為q作為 char 的值為 113, _scores中的數組索引 113 設置為x+1即 1。這樣繼續下去,我們的“大部分為零”映射數組中有一些非零值,即這些字母的分數. j為 106,因此 index scores[106]2 ,依此類推

當我們對一個單詞進行評分時,我們可以快速從中獲取一個字符 - 例如“hello”中的h ,C# 將h隱式轉換為104 ,轉到_scores[104] ,找到24 (因為h在 scoreLetters 中位於第 23 個 Z4757FE07FD492A8BE0EA6A760D683DE6 ) 這就是那封信的分數。 這種查找比字典還要快..

暫無
暫無

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

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