const text = await Deno.readTextFile("input.dat");
const lines = text.split("\n");
const passports = [];
for (let i = 0; i < lines.length; i++) {
let passport = "";
while (lines[i] != "") {
passport += `${lines[i++]} `;
}
passports.push(passport);
}
const passportsFieldNames = passports.map((passport) => {
return passport.split(" ").map((field) => field.split(":")[0]);
});
const passportsFields = passports.map((passport) => {
const pass = {};
passport
.split(" ")
.forEach((field) => (pass[field.split(":")[0]] = field.split(":")[1]));
return pass;
});
function weakValidation(fieldNames) {
const requiredFields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"];
return requiredFields.every((fieldName) => fieldNames.includes(fieldName));
}
function strongValidation(fields) {
const rules = {
byr: (year) => year >= 1920 && year <= 2002,
iyr: (year) => year >= 2010 && year <= 2020,
eyr: (year) => year >= 2020 && year <= 2030,
hgt: (val) =>
(/cm$/.test(val) &&
Number(val.slice(0, -2)) >= 150 &&
Number(val.slice(0, -2)) <= 193) ||
(/in$/.test(val) &&
Number(val.slice(0, -2)) >= 59 &&
Number(val.slice(0, -2)) <= 76),
hcl: (val) => /^#[0-9a-f]{6}$/.test(val),
ecl: (val) =>
["amb", "blu", "brn", "gry", "grn", "hzl", "oth"].includes(val),
pid: (val) => /^\d{9}$/.test(val),
};
return Object.entries(rules).every(([field, rule]) => {
return rule(fields[field]);
});
}
console.log(passportsFields.filter(weakValidation).length);
console.log(passportsFields.filter(strongValidation).length);