Als je bij de luchthaven aankomt, stel je vast dat je je lidkaart van de Noordpool Rodelshop heb meegegrist in plaats van je paspoort. Hoewel deze documenten heel hard op elkaar lijken, worden lidkaarten van de Noordpool Rodelshop niet uitgereikt door een land en zijn het daarom geen geldige reisdocumenten in het grootste deel van de wereld.

Visualisatie van een paspoort door Lewis Lane (@lewster321).

Maar het lijkt er op dat je niet de enige bent die problemen heeft. Er heeft zich een lange rij gevormd voor de automatische paspoortscanners, en de vertraging kan je reis danig in de war sturen.

Dankzij een bedenkelijke netwerkbeveiliging, realiseer je je dat je beide problemen tegelijkertijd kunt oplossen.

De automatische paspoortscanners zijn traag omdat ze moeite hebben om te controleren welke paspoorten alle vereiste velden hebben. Dit zijn de verwachte velden:

De paspoortgegevens worden gecontroleerd in batchbestanden. Daarin wordt elk paspoort voorgesteld als een reeks sleutel:waarde-paren die van elkaar worden gescheiden door spaties of newlines. Paspoorten worden van elkaar gescheiden door lege regels.

Dit is een voorbeeld van een batchbestand dat vier paspoorten bevat:

ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
byr:1937 iyr:2017 cid:147 hgt:183cm

iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
hcl:#cfa07d byr:1929

hcl:#ae17e1 iyr:2013
eyr:2024
ecl:brn pid:760753108 byr:1931
hgt:179cm

hcl:#cfa07d eyr:2025 pid:166559648
iyr:2011 ecl:brn hgt:59in

Het eerste paspoort is geldig — alle acht velden zijn aanwezig. Het tweede paspoort is ongeldig — het veld hgt ontbreekt (het veld met de grootte).

Het derde paspoort is interessant. Het enige veld dat ontbreekt is cid, en dus lijkt het de lidkaarten van de Noordpool Rodelshop, maar het is helemaal geen paspoort! Niemand zal het erg vinden als je het systeem tijdelijk de ontbrekende cid-velden laat negeren. Beschouw dit “paspoort” als geldig.

Op het vierde paspoort ontbreken twee velden: cid en byr. Het ontbreken van cid is prima, maar het ontbreken van een ander veld is dat niet, en dus is dit paspoort ongeldig.

Volgens bovenstaande regels geeft je verbeterde systeem dus aan dat er 2 geldige paspoorten zijn.

Opgave

Tel het aantal geldige paspoorten — diegene waarop alle vereiste velden voorkomen. Beschouw het cid-veld als optioneel. Hoeveel geldige paspoorten zitten er in een batchbestand? Hiervoor ga je als volgt te werk:

Voorbeeld

In deze interactieve sessie gaan we ervan uit dat het tekstbestand passports.txt2 zich in de huidige directory bevindt.

> is_valid_passport("ecl:gry pid:860033327 eyr:2020 hcl:#fffffd byr:1937 iyr:2017 cid:147 hgt:183cm")
true
> is_valid_passport("iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884 hcl:#cfa07d byr:1929")
false
> is_valid_passport("hcl:#ae17e1 iyr:2013 eyr:2024 ecl:brn pid:760753108 byr:1931 hgt:179cm")
true
> is_valid_passport("hcl:#cfa07d eyr:2025 pid:166559648 iyr:2011 ecl:brn hgt:59in")
false

> count_valid_passports("passports.txt")
2

Epiloog

Visualisatie van paspoorten door Lewis Lane (@lewster323).