public void Generate(string[] words)
        {
            var stats = words.SelectMany(w => w).GroupBy(c => c)
                        .Select(gr => new { c = gr.Key, count = gr.Count() })
                        .OrderByDescending(a => a.count)
                        .ToArray();

            var wordsHashSet = words.ToHashSet();

            const string code = "eits.";

            var bestGeneratedWordsSeed = 0u;
            var bestGeneratedWordsSet  = new HashSet <string>();

            for (var seed = 1u; seed < uint.MaxValue; seed++)
            {
                if (seed % 10000000 == 0)
                {
                    Console.WriteLine($"{code} {bestGeneratedWordsSeed} #{bestGeneratedWordsSet.Count}: {(string.Join(",", bestGeneratedWordsSet))}");
                }

                var random = new MyRandom(seed);

                var generatedWords = new HashSet <string>();
                var chars          = new char[20];
                var charsLen       = 0;

                while (true)
                {
                    var letter = code[random.Next(code.Length)];
                    if (charsLen == 7)
                    {
                        letter = '.';
                    }
                    if (letter != '.')
                    {
                        chars[charsLen] = letter;
                        charsLen++;
                    }
                    else if (charsLen > 0)
                    {
                        var str = new string(chars, 0, charsLen);
                        if (!wordsHashSet.Contains(str))
                        {
                            break;
                        }
                        generatedWords.Add(str);
                        charsLen = 0;
                    }
                }

                if (generatedWords.Count > bestGeneratedWordsSet.Count)
                {
                    bestGeneratedWordsSeed = seed;
                    bestGeneratedWordsSet  = generatedWords;
                }
            }

            Console.WriteLine($"{code} {bestGeneratedWordsSeed} #{bestGeneratedWordsSet.Count}: {(string.Join(",", bestGeneratedWordsSet))}");
        }
Exemple #2
0
            public int RandomIndex(MyRandom random)
            {
                var p = random.Next(Sum);

                return(RandomIndex(Distribution, p));
            }