Beispiel #1
0
 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)));
 }
Beispiel #2
0
 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
     });
Beispiel #3
0
        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());
        }