using System; public class Day4 { static void PartA() { string path = Directory.GetCurrentDirectory() + "/input.txt"; string text; using (StreamReader sr = new StreamReader(path)) { text = sr.ReadToEnd(); } string[] passes; string[] reqs = { "byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid" }; int legitPasses = 0; passes = text.Split("\n\n"); foreach (string pass in passes) { bool valid = true; foreach (string req in reqs) { if (!pass.Contains(req)) { valid = false; break; } } if (valid) legitPasses++; } Console.WriteLine(legitPasses); } static void PartB() { string path = Directory.GetCurrentDirectory() + "/input.txt"; string text; using (StreamReader sr = new StreamReader(path)) { text = sr.ReadToEnd(); } string[] passes; string[] reqs = { "byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid" }; //debug Dictionary killed = new Dictionary(); foreach (string req in reqs) { killed.Add(req, 0); } int legitPasses = 0; passes = text.Split("\n\n"); foreach (string pass in passes) { bool valid = true; foreach (string req in reqs) { if (!pass.Contains(req)) { valid = false; break; } } if (!valid) continue; string[] fields = pass.Split('\n', ' '); foreach (string field in fields) { if (field.Contains("byr")) { string entry = field.Split("byr:", StringSplitOptions.RemoveEmptyEntries)[0]; int year; if (Int32.TryParse(entry, out year)) { if (year < 1920 || year > 2002) { valid = false; killed["byr"]++; break; } } else { valid = false; killed["byr"]++; break; } } else if (field.Contains("iyr")) { string entry = field.Split("iyr:", StringSplitOptions.RemoveEmptyEntries)[0]; int year; if (Int32.TryParse(entry, out year)) { if (year < 2010 || year > 2020) { valid = false; killed["iyr"]++; break; } } else { valid = false; killed["iyr"]++; break; } } else if (field.Contains("eyr")) { string entry = field.Split("eyr:", StringSplitOptions.RemoveEmptyEntries)[0]; int year; if (Int32.TryParse(entry, out year)) { if (year < 2020 || year > 2030) { killed["eyr"]++; valid = false; break; } } else { killed["eyr"]++; valid = false; break; } } else if (field.Contains("hgt")) { string entry = field.Split("hgt:", StringSplitOptions.RemoveEmptyEntries)[0]; if (entry.Contains("cm")) { entry = entry.Substring(0, entry.Length - 2); int num; if (Int32.TryParse(entry, out num)) { if (num < 150 || num > 193) { killed["hgt"]++; valid = false; break; } } else { killed["hgt"]++; valid = false; break; } } else if (entry.Contains("in")) { entry = entry.Substring(0, entry.Length - 2); int num; if (Int32.TryParse(entry, out num)) { if (num < 59 || num > 76) { killed["hgt"]++; valid = false; break; } } else { killed["hgt"]++; valid = false; break; } } else { killed["hgt"]++; valid = false; break; } } else if (field.Contains("hcl")) { string entry = field.Split("hcl:", StringSplitOptions.RemoveEmptyEntries)[0]; if (entry[0] == '#' && entry.Length == 7) { string wrongElements = String.Join("", entry.Split('#', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')); if (wrongElements != "") { killed["hcl"]++; valid = false; break; } } else { killed["hcl"]++; valid = false; break; } } else if (field.Contains("ecl")) { string entry = field.Split("ecl:", StringSplitOptions.RemoveEmptyEntries)[0]; if (entry != "amb" && entry != "blu" && entry != "brn" && entry != "grn" && entry != "gry" && entry != "hzl" && entry != "oth") { killed["ecl"]++; valid = false; break; } } else if (field.Contains("pid")) { string entry = field.Split("pid:", StringSplitOptions.RemoveEmptyEntries)[0]; if (entry.Length == 9) { int num; if (!Int32.TryParse(entry, out num)) { killed["pid"]++; //Console.WriteLine("kill pid:" + entry + "|" + num); valid = false; break; } } else { //Console.WriteLine("kill pid: (length)" + entry ); killed["pid"]++; valid = false; break; } } } if (valid) legitPasses++; } //foreach (KeyValuePair kill in killed) //{ // Console.WriteLine(kill.Key + ":" + kill.Value); //} Console.WriteLine(legitPasses); } }