Initial commit — Wordle/letter word solver and scorer

This commit is contained in:
2026-05-10 03:01:15 +00:00
commit 900ace491f
41 changed files with 391999 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Core
{
public class LetterPositionFrequency : IComparer<string>
{
private readonly Dictionary<char, int>[] _letterFrequencies;
private LetterPositionFrequency(Dictionary<char, int>[] letterFrequencies)
{
_letterFrequencies = letterFrequencies;
}
public LetterPositionFrequency(DictionarySearcher dictionarySearcher, int wordLen)
: this(GetLetterPositionFreq(dictionarySearcher.GetWords(), wordLen))
{
}
public LetterPositionFrequency(WordleUtil wordleUtil, int wordLen)
: this(GetLetterPositionFreq(wordleUtil.Words, wordLen))
{
}
public LetterPositionFrequency(IList<string> words, int wordLen)
: this(GetLetterPositionFreq(words, wordLen))
{
}
public static Dictionary<char, int>[] GetLetterPositionFreq(IList<string> words, int wordLen)
{
var ws = words.Where(w => w.Length == wordLen).ToList();
var freqList = new Dictionary<char, int>[wordLen];
for (var i = 0; i < wordLen; i++)
{
var letters = Enumerable.Range(0, 26).Select(r => Convert.ToChar('A' + r));
freqList[i] =
letters.ToDictionary(c => c,
c => ws.Count(w => w[i] == c)
);
}
return freqList;
}
public IEnumerable<Tuple<string, int>> ScoreWords(IEnumerable<string> words, WordleUtil wordleUtil = null)
{
return
from word in words
let score =
word.Select((c, i) => _letterFrequencies[i][c]).Sum()
select
wordleUtil != null
? Tuple.Create(word, Convert.ToInt32(wordleUtil.FactorRepeatedLetters(word, score)))
: Tuple.Create(word, score)
;
}
public List<string> SortWords(IEnumerable<string> words, WordleUtil wordleUtil = null)
{
return ScoreWords(words, wordleUtil)
.OrderByDescending(w => w.Item2)
.Select(w => w.Item1)
.ToList();
}
private int ScoreWord(string word)
{
return word.Select((c, i) => _letterFrequencies[i][c]).Sum();
}
public int Compare(string x, string y)
{
return ScoreWord(y).CompareTo(ScoreWord(x));
}
}
}