import std.stdio; import std.file; import std.array; import std.uni : isWhite; import std.conv; import std.regex; void main() { string contents = readText("input"); auto lines = contents.split("\n\n"); int good = 0; foreach(i, line; lines) { auto parts = line.split!(isWhite); string[] items = [ "byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid" ]; int[string] totals; foreach(y, item; items) totals[item] = 0; foreach(x, part; parts) { auto fields = part.split(":"); if(fields.length < 2) continue; if(!(fields[0] in totals)) continue; if(part.matchAll(ctRegex!(r"^(pid:\d{9}|byr:(19[2-9]\d|200[0-2])|iyr:20(1\d|20)|eyr:20(2\d|30)|hgt:((59|6\d|7[0-6])in|(1[5-8]\d|19[0-3])cm)|hcl:#[0-9a-f]{6}|ecl:(amb|blu|brn|gry|grn|hzl|oth)|pid:\d{9}|cid:.*)$"))) totals[fields[0]]++; } int sum = 0; foreach(z, total; totals) sum += total; if(sum == items.length) good++; } writefln("There are %d valid passports.", good); }