Как потратить день на написание плохого кода, чтобы помочь своей девушке обмануть Wordle…

Как сказано в заголовке, я написал это, чтобы помочь своей девушке обмануть 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();
    }

Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
Procodings.ru
Добавить комментарий