public static bool IsValid(Dictionary <string, string> passport) { return(passport.ContainsKey("byr") && passport.ContainsKey("iyr") && passport.ContainsKey("eyr") && passport.ContainsKey("hgt") && passport.ContainsKey("hcl") && passport.ContainsKey("ecl") && passport.ContainsKey("pid") && passport.All(kv => PassportValidators.FieldIsValid(kv))); }
private static bool FieldIsValid(KeyValuePair <string, string> field) { return(field.Key switch { "byr" => int.TryParse(field.Value, out var birthYear) && birthYear >= 1920 && birthYear <= 2002, "iyr" => int.TryParse(field.Value, out var issueYear) && issueYear >= 2010 && issueYear <= 2020, "eyr" => int.TryParse(field.Value, out var expireYear) && expireYear >= 2020 && expireYear <= 2030, "hgt" => PassportValidators.HeightIsValid(field), "hcl" => Regex.IsMatch(field.Value, @"^#[0-9|a-f]{6}$"), "ecl" => Regex.IsMatch(field.Value, @"^(amb|blu|brn|gry|grn|hzl|oth)$"), "pid" => Regex.IsMatch(field.Value, @"^[0-9]{9}$"), "cid" => true, _ => false });
public async Task <string> SolveAsync() { var passports = new List <Dictionary <string, string> >(); var builder = new StringBuilder(); var regex = new Regex(@"(\w*):(\S*)\b+", RegexOptions.Compiled); using (var reader = new StreamReader(this._inputFile)) { string line = null; var tempInnerList = new List <KeyValuePair <string, string> >(); while ((line = await reader.ReadLineAsync().ConfigureAwait(false)) != null) { if (string.IsNullOrWhiteSpace(line)) { passports.Add(tempInnerList.ToDictionary(k => k.Key, v => v.Value)); tempInnerList = new List <KeyValuePair <string, string> >(); continue; } tempInnerList.AddRange( regex.Matches(line) .Select(m => new KeyValuePair <string, string>( m.Groups[1].ToString(), m.Groups[2].ToString()))); } if (tempInnerList.Any()) { passports.Add(tempInnerList.ToDictionary(k => k.Key, v => v.Value)); } } var numberOfValidPassports = passports.Count(p => PassportValidators.IsValid(p)); builder.Append($"Answer: {numberOfValidPassports}"); return(builder.ToString()); }