Example #1
0
        public static async Task Run()
        {
            string[] lines = await Loading.Load(nameof(Day4));

            int validCount = 0;

            for (int l = 0; l < lines.Length; l++)
            {
                var  keys  = new HashSet <string>();
                bool valid = true;
                while (l < lines.Length && !string.IsNullOrWhiteSpace(lines[l]))
                {
                    foreach (var pair in lines[l].Split())
                    {
                        var parts = pair.Split(':');
                        if (parts.Length != 2)
                        {
                            Console.WriteLine($"Passport key:value pair with an unexpected number of ':' characters: {pair}");
                            valid = false;
                        }
                        else if (!ValidKeys.Contains(parts[0]))
                        {
                            Console.WriteLine($"Invalid key: {parts[0]}");
                            valid = false;
                        }
                        else if (!keys.Add(parts[0]))
                        {
                            Console.WriteLine($"Duplicate key: {parts[0]}");
                            valid = false;
                        }
                    }

                    l++;
                }

                if (valid)
                {
                    var missing = RequiredKeys.Where(k => !keys.Contains(k)).ToList();
                    if (missing.Count != 0)
                    {
                        Console.WriteLine($"Missing keys: {missing.JoinWithLast(", ", ", and ")}");
                    }
                    else
                    {
                        validCount++;
                    }
                }
            }

            Console.WriteLine($"Valid passports: {validCount}");
        }
Example #2
0
        public static async Task Run()
        {
            string[] lines = await Loading.Load(nameof(Day4));

            int validCount = 0;

            for (int l = 0; l < lines.Length; l++)
            {
                var  keys  = new HashSet <string>();
                bool valid = true;
                while (l < lines.Length && !string.IsNullOrWhiteSpace(lines[l]))
                {
                    foreach (var pair in lines[l].Split())
                    {
                        var parts = pair.Split(':');
                        if (parts.Length != 2)
                        {
                            Console.WriteLine($"Passport key:value pair with an unexpected number of ':' characters: {pair}");
                            valid = false;
                        }
                        else if (!keys.Add(parts[0]))
                        {
                            Console.WriteLine($"Duplicate key: {parts[0]}");
                            valid = false;
                        }
                        else
                        {
                            switch (parts[0])
                            {
                            case BirthYear:
                                valid = ValidateYear(parts[1], "birth", 1920, 2002) && valid;
                                break;

                            case IssueYear:
                                valid = ValidateYear(parts[1], "issue", 2010, 2020) && valid;
                                break;

                            case ExpYear:
                                valid = ValidateYear(parts[1], "expiration", 2020, 2030) && valid;
                                break;

                            case Height:
                                valid = ValidateHeight(parts[1]) && valid;
                                break;

                            case HairColour:
                                valid = ValidateHairColour(parts[1]) && valid;
                                break;

                            case EyeColour:
                                if (parts[1] is not("amb" or "blu" or "brn" or "grn" or "gry" or "hzl" or "oth"))
                                {
                                    valid = false;
                                    Console.WriteLine($"Invalid eye colour: {parts[1]}");
                                }
                                break;

                            case PassID:
                                valid = ValidatePassID(parts[1]) && valid;
                                break;

                            case CountryID:
                                // Ignore
                                break;

                            default:
                                Console.WriteLine($"Invalid key: {parts[0]}");
                                valid = false;
                                break;
                            }
                        }
                    }

                    l++;
                }

                var missing = RequiredKeys.Where(k => !keys.Contains(k)).ToList();
                if (missing.Count != 0)
                {
                    Console.WriteLine($"Missing keys: {missing.JoinWithLast(", ", ", and ")}");
                }
                else if (valid)
                {
                    validCount++;
                }
            }

            Console.WriteLine($"Valid passports: {validCount}");
        }