expeditaet
Version:
Advent of Code Solutions
40 lines (32 loc) • 1.06 kB
text/typescript
import { task } from '@alexaegis/advent-of-code-lib';
import packageJson from '../package.json';
export enum RelevantField {
byr = 'byr',
iyr = 'iyr',
eyr = 'eyr',
hgt = 'hgt',
hcl = 'hcl',
ecl = 'ecl',
pid = 'pid',
}
export type Passport = Record<RelevantField, string>;
export const parsePassport = (passport: string): Partial<Passport> =>
passport.split(' ').reduce<Partial<Passport>>((acc, e) => {
const [key, val] = e.split(':');
if (!val) {
throw new Error('bad passport');
}
acc[key as RelevantField] = val;
return acc;
}, {});
export const parsePassports = (input: string): Partial<Passport>[] =>
input
.split(/\r?\n\r?\n/)
.map((raw) => raw.replaceAll(/\r?\n/g, ' '))
.map(parsePassport);
export const isPassport = (passport: Partial<Passport>): passport is Passport =>
Object.values(RelevantField).every((pf) =>
(Object.keys(passport) as RelevantField[]).find((k) => k === pf),
);
export const p1 = (input: string): number => parsePassports(input).count(isPassport);
await task(p1, packageJson.aoc); // 264 ~5.6ms