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}"); }
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}"); }