Как сказано в заголовке, я написал это, чтобы помочь своей девушке обмануть Wordle.
Прокомментирован ли код? Черт возьми, нет!
Есть ли проверка ошибок? Едва ли!
Я неправильно полагаюсь на то, что словарь сохранит порядок ключей при их добавлении? Да!
И давайте не будем забывать об использовании оператора goto и слишком большого количества глобальных файлов!
Приложение, которое она использует, — это приложение Wordle от android Lion Studios, и я не знаю, какой список слов они используют. Ближайший, который я нашел, — это список слов NASPA NSWL2020, но в этом списке все еще есть некоторые слова, которые приложение не распознает. (Кстати, газета New York Times использует список слов Collins).
Допустим, ваше первое слово — «читает», и оно показывает, что у вас есть «р» и «а», причем «а» находится в правильном месте.
Параметры будут введены следующим образом:
wordlesolver ra ed 11a11 r1
Первый параметр: Указывает буквы в слове.
Второй параметр: Указывает буквы, отсутствующие в слове.
Третий параметр: Показывает, где находятся буквы в слове.
Четвертый и выше: Показывает, какие буквы не находятся в указанных позициях.
Вы можете пропустить первый и второй параметры, введя ‘0’, например, wordlesolver 0 0 11a11 r1.
Вы можете полностью пропустить третий параметр, а для указания нескольких букв, которые не находятся в указанных позициях, вы можете продолжить добавлять информацию из 2 символов, например,
wordlesolver ra ed r1 t2 g4
wordlesolver ril eadspotf 11111 r1 i2 l2 l3 i3 r4 даст результат «lyric».
По мере набора слов я буду использовать стрелку вверх, чтобы получить последнюю команду и добавить дополнительную информацию.
Да, параметры можно было бы разобрать гораздо лучше, возможно, просто перечислив слова с цифрой a для обозначения букв, которые есть в слове и находятся в правильном месте, но это примерно столько усилий, сколько я готов приложить.
Предлагаемые слова создаются следующим способом…
Первый # — это количество букв в слове, которые не были использованы и находятся в списке возможных решений. Остальные числа — это частота букв, которую я генерирую для данного слова. Слова перечисляются в порядке убывания баллов. Теоретически мне нужно перечислить только одно слово, но поскольку приложение иногда не распознает слово, в список попадает несколько.
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
class Program
{
static Dictionary<string, int> word_dict = File.ReadAllLines(@"c:awords.txt").Distinct().OrderBy(x => x).ToDictionary(x => x, x => 0);
static Dictionary<char, int> letter_dict = new() { { 'a', 0 }, { 'b', 0 }, { 'c', 0 }, { 'd', 0 }, { 'e', 0 }, { 'f', 0 }, { 'g', 0 }, { 'h', 0 }, { 'i', 0 }, { 'j', 0 }, { 'k', 0 }, { 'l', 0 }, { 'm', 0 }, { 'n', 0 }, { 'o', 0 }, { 'p', 0 }, { 'q', 0 }, { 'r', 0 }, { 's', 0 }, { 't', 0 }, { 'u', 0 }, { 'v', 0 }, { 'w', 0 }, { 'x', 0 }, { 'y', 0 }, { 'z', 0 } };
static List<string> include = new();
static void ParseArgs(string[] args)
{
int len = args.Length;
foreach (string word in word_dict.Keys)
{
if (len > 2 && args[2].Length == 5)
for (int j = 0; j < 5; j++)
if (char.IsLetter(args[2][j]))
if (word[j] != args[2][j])
goto end;
if (len > 0 && args[0] != "0")
for (int j = 0; j < args[0].Length; j++)
if (!word.Contains(args[0][j]))
goto end;
if (len > 1 && args[1] != "0")
for (int j = 0; j < args[1].Length; j++)
if (word.Contains(args[1][j]))
goto end;
if (len > 3)
for (int j = 0; j < len - 3; j++)
if (word[args[j + 3][1] - '0' - 1] == args[j + 3][0])
goto end;
include.Add(word);
end:;
}
}
static void GetSolutions(string first)
{
foreach (string word in include)
for (int i = 0; i < 5; i++)
if (!first.Contains(word[i]))
letter_dict[word[i]]++;
letter_dict = letter_dict.Where(x => x.Value > 0).OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
if (include.Count <= 20)
{
Console.WriteLine("All possible solutions: ");
foreach (string item in include)
Console.Write($"{item} ");
}
else
Console.Write($"There are {include.Count} possible solutions. ");
Console.WriteLine("n");
}
static void GetSuggestedWords()
{
foreach (string word in word_dict.Keys)
foreach (char item in letter_dict.Keys.Distinct())
if (word.Contains(item))
word_dict[word] += letter_dict[item] + 100000;
word_dict = word_dict.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
if (word_dict[word_dict.Keys.First()] >= 200000)
{
Console.WriteLine("Suggested word / Word score:");
int count = 0;
foreach (string item in word_dict.Keys)
if (word_dict[item]! >= 200000)
{
Console.Write("{0} {1} ", item, word_dict[item]);
count++;
if (count == 9)
break;
}
}
Console.WriteLine("n");
}
static void Main(string[] args)
{
Console.Clear();
if (args.Length == 0)
{
args = new string[1];
args[0] = "0";
}
ParseArgs(args);
GetSolutions(args[0]);
GetSuggestedWords();
}