50 lines
1.2 KiB
JavaScript
50 lines
1.2 KiB
JavaScript
|
import fs from "fs";
|
||
|
|
||
|
const REQUIRED_FIELDS = [
|
||
|
"byr", // (Birth Year)
|
||
|
"iyr", // (Issue Year)
|
||
|
"eyr", // (Expiration Year)
|
||
|
"hgt", // (Height)
|
||
|
"hcl", // (Hair Color)
|
||
|
"ecl", // (Eye Color)
|
||
|
"pid", // (Passport ID)
|
||
|
// "cid", // (Country ID) // Optional
|
||
|
];
|
||
|
|
||
|
/**
|
||
|
* Main function for Puzzle A
|
||
|
*
|
||
|
* @param {string} data - Puzzle input as a single string.
|
||
|
*/
|
||
|
async function main(data) {
|
||
|
const entries = data.split(/(?:\r?\n){2}/).map((raw) => raw.split(/\s+/g));
|
||
|
/** @type {{[string]: number|string}[]} */
|
||
|
let passports = [];
|
||
|
|
||
|
for (const raw of entries) {
|
||
|
let passport = {};
|
||
|
raw
|
||
|
.map((rawKV) => rawKV.split(":"))
|
||
|
.forEach(([key, value]) => (passport[key] = value));
|
||
|
passports.push(passport);
|
||
|
}
|
||
|
|
||
|
/** @type {{[string]: number|string}[]} */
|
||
|
const valid_passports = [];
|
||
|
for (const passport of passports) {
|
||
|
if (
|
||
|
REQUIRED_FIELDS.map((required) =>
|
||
|
Object.keys(passport).includes(required)
|
||
|
).reduce((prev, cur) => prev && cur, true)
|
||
|
) {
|
||
|
valid_passports.push(passport);
|
||
|
}
|
||
|
}
|
||
|
return valid_passports.length;
|
||
|
}
|
||
|
|
||
|
fs.readFile("input", (err, data) => {
|
||
|
if (err) throw err;
|
||
|
main(data.toString()).then(console.log).catch(console.error);
|
||
|
});
|