为什么我的代码生成的解决方案与官方解决方案不同?

时间:2020-12-22 18:45:50

标签: c#

我正在尝试解决“代码出现”的难题,这需要找出密码列表及其策略中有多少密码是有效的。

但我的代码总是返回 627 而不是 474,这是我输入拼图的官方解决方案。

有人能解释一下哪里出了问题吗?

谜题: AdventOfCode_2020_Day2

我的拼图输入: GoogleDrive_PuzzleInput

    public static void Day2()
    {
        int i = 0;
        int result = 0;
        string[] text = ReadAllLines(@"C:\Users\Kcir\Documents\Programming\myapp\day2.txt");
        string[] policy = new string[text.Length];
        string[] corrupted = new string[text.Length];
        int[] min = new int[text.Length];
        int[] max = new int[text.Length];

        foreach (string x in text)
        {

            policy[i] = x.Substring(x.IndexOf(":") - 1, 1);
            min[i] = Int32.Parse(x.Substring(0, x.IndexOf("-")));
            max[i] = Int32.Parse(x.Substring(x.IndexOf("-") + 1, 2));
            corrupted[i] = x.Substring(x.IndexOf(":") + 2);
            i++;
        }

        for (i = 0; i < corrupted.Length; i++)
        {
            int count = 0;
            for (int j = 0; j < max[i]; j++)
            {
                if (corrupted[i].Contains(policy[i]))
                {
                    corrupted[i] = corrupted[i].Substring(corrupted[i].IndexOf(policy[i]) + 1);
                    count++;
                }
            }

            if (count >= min[i] && count <= max[i])
            {
                result++;
            }
        }
        WriteLine("Number of valid passwords: " + result);
    }

2 个答案:

答案 0 :(得分:1)

你的嵌套循环条件不好 - 你的算法永远不会超过策略的最大值

答案 1 :(得分:1)

您的代码不会检查损坏数组中的所有字母。第一次出现错误计数的是第 6 种情况,即 5-14 t: ttttnttttttdttttttt。有 17 个字母需要检查,但您只检查前 14 个。我建议你学习如何调试。看我的截图,损坏的 [i] 仍然有 3 个字母,但你的代码退出了循环。

enter image description here

我已经简化了您的代码(不需要大量数组)并修复了错误(检查所有字母):

void Main()
{
    var valid = 0;
    var data = File.ReadAllLines(@"D:\day2.txt");
    foreach (var line in data)
    {
        var letter = line[line.IndexOf(":") - 1];                           // letter in policy
        var min =  Int32.Parse(line.Substring(0, line.IndexOf("-")));       // minimum count in policy
        var max = Int32.Parse(line.Substring(line.IndexOf("-") + 1, 2));    // maximum count in policy
        var password = line.Substring(line.IndexOf(":") + 2);               // password need to be verified
        var count = 0;                                                      // count of letter in password
        foreach (var l in password)                                         // loop all letters in password
        {
            if (l == letter) count++;                                       // increment number of letters found in password
        }
        if (count >= min && count <= max) valid++;                          // increment number of valid passwords
    }
    Console.WriteLine(valid);
}

LinqPad 中的结果:

enter image description here