[英]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.