package Ġcom . github . dav io . a oc . y 2 0 2 0 Ċ Ċ import Ġcom . github . dav io . a oc . general . call Ċ import Ġcom . github . dav io . a oc . general . getInput As Sequence Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ ĠDay 4 . getResult () Ċ } Ċ Ċ object ĠDay 4 Ġ{ ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* Ġ--- ĠDay Ġ 4 : ĠPass port ĠProcessing Ġ--- ĊĊĠĠĠ ĠYou Ġar rive Ġat Ġthe Ġair port Ġonly Ġto Ġrealize Ġthat Ġyou Ġgrab bed Ġyour ĠNorth ĠP ole ĠCredentials Ġinstead Ġof Ġyour Ġpassport . ĊĠĠĠ ĠWhile Ġthese Ġdocuments Ġare Ġextremely Ġsimilar , ĠNorth ĠP ole ĠCredentials Ġaren 't Ġissued Ġby Ġa Ġcountry ĊĠĠĠ Ġand Ġtherefore Ġaren 't Ġactually Ġvalid Ġdocumentation Ġfor Ġtravel Ġin Ġmost Ġof Ġthe Ġworld . ĊĊĠĠĠ ĠIt Ġseems Ġlike Ġyou 're Ġnot Ġthe Ġonly Ġone Ġhaving Ġproblems , Ġthough ; Ġa Ġvery Ġlong Ġline Ġhas Ġformed Ġfor Ġthe Ġautomatic Ġpassport Ġsc anners , ĊĠĠĠ Ġand Ġthe Ġdelay Ġcould Ġup set Ġyour Ġtravel Ġit iner ary . ĊĊĠĠĠ ĠDue Ġto Ġsome Ġquestion able Ġnetwork Ġsecurity , Ġyou Ġrealize Ġyou Ġmight Ġbe Ġable Ġto Ġsolve Ġboth Ġof Ġthese Ġproblems Ġat Ġthe Ġsame Ġtime . ĊĊĠĠĠ ĠThe Ġautomatic Ġpassport Ġsc anners Ġare Ġslow Ġbecause Ġthey 're Ġhaving Ġtrouble Ġdetect ing Ġwhich Ġpass ports Ġhave Ġall Ġrequired Ġfields . ĊĠĠĠ ĠThe Ġexpected Ġfields Ġare Ġas Ġfollows : ĊĊĠĠĠ Ġby r Ġ( Birth ĠYear ) ĊĠĠĠ Ġi yr Ġ( Issue ĠYear ) ĊĠĠĠ Ġe yr Ġ( Expiration ĠYear ) ĊĠĠĠ Ġh gt Ġ( Height ) ĊĠĠĠ Ġh cl Ġ( H air ĠColor ) ĊĠĠĠ Ġe cl Ġ( Eye ĠColor ) ĊĠĠĠ Ġpid Ġ( Passport ĠID ) ĊĠĠĠ Ġcid Ġ( Country ĠID ) ĊĊĠĠĠ ĠPass port Ġdata Ġis Ġvalidated Ġin Ġbatch Ġfiles Ġ( your Ġpuzzle Ġinput ). ĊĠĠĠ ĠEach Ġpassport Ġis Ġrepresented Ġas Ġa Ġsequence Ġof Ġkey : value Ġpairs Ġseparated Ġby Ġspaces Ġor Ġnew lines . ĠPass ports Ġare Ġseparated Ġby Ġblank Ġlines . ĊĊĠĠĠ ĠHere Ġis Ġan Ġexample Ġbatch Ġfile Ġcontaining Ġfour Ġpass ports : ĊĊĠĠĠ Ġe cl : gry Ġpid : 8 6 0 0 3 3 3 2 7 Ġe yr : 2 0 2 0 Ġh cl :# ffff fd ĊĠĠĠ Ġby r : 1 9 3 7 Ġi yr : 2 0 1 7 Ġcid : 1 4 7 Ġh gt : 1 8 3 cm ĊĊĠĠĠ Ġi yr : 2 0 1 3 Ġe cl : amb Ġcid : 3 5 0 Ġe yr : 2 0 2 3 Ġpid : 0 2 8 0 4 8 8 8 4 ĊĠĠĠ Ġh cl :# cfa 0 7 d Ġby r : 1 9 2 9 ĊĊĠĠĠ Ġh cl :# ae 1 7 e 1 Ġi yr : 2 0 1 3 ĊĠĠĠ Ġe yr : 2 0 2 4 ĊĠĠĠ Ġe cl : br n Ġpid : 7 6 0 7 5 3 1 0 8 Ġby r : 1 9 3 1 ĊĠĠĠ Ġh gt : 1 7 9 cm ĊĊĠĠĠ Ġh cl :# cfa 0 7 d Ġe yr : 2 0 2 5 Ġpid : 1 6 6 5 5 9 6 4 8 ĊĠĠĠ Ġi yr : 2 0 1 1 Ġe cl : br n Ġh gt : 5 9 in ĊĊĠĠĠ ĠThe Ġfirst Ġpassport Ġis Ġvalid Ġ- Ġall Ġeight Ġfields Ġare Ġpresent . ĠThe Ġsecond Ġpassport Ġis Ġinvalid Ġ- Ġit Ġis Ġmissing Ġh gt Ġ( the ĠHeight Ġfield ). ĊĊĠĠĠ ĠThe Ġthird Ġpassport Ġis Ġinteresting ; Ġthe Ġonly Ġmissing Ġfield Ġis Ġcid , Ġso Ġit Ġlooks Ġlike Ġdata Ġfrom ĠNorth ĠP ole ĠCredentials , ĊĠĠĠ Ġnot Ġa Ġpassport Ġat Ġall ! ĊĠĠĠ ĠSure ly , Ġnobody Ġwould Ġmind Ġif Ġyou Ġmade Ġthe Ġsystem Ġtemporarily Ġignore Ġmissing Ġcid Ġfields . ĠT reat Ġthis Ġ" passport " Ġas Ġvalid . ĊĊĠĠĠ ĠThe Ġfourth Ġpassport Ġis Ġmissing Ġtwo Ġfields , Ġcid Ġand Ġby r . ĠMissing Ġcid Ġis Ġfine , Ġbut Ġmissing Ġany Ġother Ġfield Ġis Ġnot , ĊĠĠĠ Ġso Ġthis Ġpassport Ġis Ġinvalid . ĊĊĠĠĠ ĠAccording Ġto Ġthe Ġabove Ġrules , Ġyour Ġimproved Ġsystem Ġwould Ġreport Ġ 2 Ġvalid Ġpass ports . ĊĊĠĠĠ ĠCount Ġthe Ġnumber Ġof Ġvalid Ġpass ports Ġ- Ġthose Ġthat Ġhave Ġall Ġrequired Ġfields . ĠT reat Ġcid Ġas Ġoptional . ĠIn Ġyour Ġbatch Ġfile , ĊĠĠĠ Ġhow Ġmany Ġpass ports Ġare Ġvalid ? ĊĠĠĠ Ġ* ĊĠĠĠ Ġ* Ġ--- ĠPart ĠTwo Ġ--- ĊĊĠĠĠ ĠThe Ġline Ġis Ġmoving Ġmore Ġquickly Ġnow , Ġbut Ġyou Ġover he ar Ġair port Ġsecurity Ġtalking Ġabout Ġhow Ġpass ports Ġwith Ġinvalid Ġdata Ġare Ġgetting Ġthrough . ĊĠĠĠ ĠBetter Ġadd Ġsome Ġdata Ġvalidation , Ġquick ! ĊĊĠĠĠ ĠYou Ġcan Ġcontinue Ġto Ġignore Ġthe Ġcid Ġfield , Ġbut Ġeach Ġother Ġfield Ġhas Ġstrict Ġrules Ġabout Ġwhat Ġvalues Ġare Ġvalid Ġfor Ġautomatic Ġvalidation : ĊĊĠĠĠ Ġby r Ġ( Birth ĠYear ) Ġ- Ġfour Ġdigits ; Ġat Ġleast Ġ 1 9 2 0 Ġand Ġat Ġmost Ġ 2 0 0 2 . ĊĠĠĠ Ġi yr Ġ( Issue ĠYear ) Ġ- Ġfour Ġdigits ; Ġat Ġleast Ġ 2 0 1 0 Ġand Ġat Ġmost Ġ 2 0 2 0 . ĊĠĠĠ Ġe yr Ġ( Expiration ĠYear ) Ġ- Ġfour Ġdigits ; Ġat Ġleast Ġ 2 0 2 0 Ġand Ġat Ġmost Ġ 2 0 3 0 . ĊĠĠĠ Ġh gt Ġ( Height ) Ġ- Ġa Ġnumber Ġfollowed Ġby Ġeither Ġcm Ġor Ġin : ĊĠĠĠ ĠIf Ġcm , Ġthe Ġnumber Ġmust Ġbe Ġat Ġleast Ġ 1 5 0 Ġand Ġat Ġmost Ġ 1 9 3 . ĊĠĠĠ ĠIf Ġin , Ġthe Ġnumber Ġmust Ġbe Ġat Ġleast Ġ 5 9 Ġand Ġat Ġmost Ġ 7 6 . ĊĠĠĠ Ġh cl Ġ( H air ĠColor ) Ġ- Ġa Ġ# Ġfollowed Ġby Ġexactly Ġsix Ġcharacters Ġ 0 - 9 Ġor Ġa - f . ĊĠĠĠ Ġe cl Ġ( Eye ĠColor ) Ġ- Ġexactly Ġone Ġof : Ġamb Ġbl u Ġbr n Ġg ry Ġgr n Ġh zl Ġo th . ĊĠĠĠ Ġpid Ġ( Passport ĠID ) Ġ- Ġa Ġn ine - digit Ġnumber , Ġincluding Ġleading Ġzero es . ĊĠĠĠ Ġcid Ġ( Country ĠID ) Ġ- Ġignored , Ġmissing Ġor Ġnot . ĊĊĠĠĠ ĠYour Ġjob Ġis Ġto Ġcount Ġthe Ġpass ports Ġwhere Ġall Ġrequired Ġfields Ġare Ġboth Ġpresent Ġand Ġvalid Ġaccording Ġto Ġthe Ġabove Ġrules . ĊĠĠĠ ĠHere Ġare Ġsome Ġexample Ġvalues : ĊĊĠĠĠ Ġby r Ġvalid : ĠĠĠ 2 0 0 2 ĊĠĠĠ Ġby r Ġinvalid : Ġ 2 0 0 3 ĊĊĠĠĠ Ġh gt Ġvalid : ĠĠĠ 6 0 in ĊĠĠĠ Ġh gt Ġvalid : ĠĠĠ 1 9 0 cm ĊĠĠĠ Ġh gt Ġinvalid : Ġ 1 9 0 in ĊĠĠĠ Ġh gt Ġinvalid : Ġ 1 9 0 ĊĊĠĠĠ Ġh cl Ġvalid : ĠĠ Ġ# 1 2 3 abc ĊĠĠĠ Ġh cl Ġinvalid : Ġ# 1 2 3 ab z ĊĠĠĠ Ġh cl Ġinvalid : Ġ 1 2 3 abc ĊĊĠĠĠ Ġe cl Ġvalid : ĠĠ Ġbr n ĊĠĠĠ Ġe cl Ġinvalid : Ġw at ĊĊĠĠĠ Ġpid Ġvalid : ĠĠĠ 0 0 0 0 0 0 0 0 1 ĊĠĠĠ Ġpid Ġinvalid : Ġ 0 1 2 3 4 5 6 7 8 9 ĊĊĠĠĠ ĠHere Ġare Ġsome Ġinvalid Ġpass ports : ĊĊĠĠĠ Ġe yr : 1 9 7 2 Ġcid : 1 0 0 ĊĠĠĠ Ġh cl :# 1 8 1 7 1 d Ġe cl : amb Ġh gt : 1 7 0 Ġpid : 1 8 6 cm Ġi yr : 2 0 1 8 Ġby r : 1 9 2 6 ĊĊĠĠĠ Ġi yr : 2 0 1 9 ĊĠĠĠ Ġh cl :# 6 0 2 9 2 7 Ġe yr : 1 9 6 7 Ġh gt : 1 7 0 cm ĊĠĠĠ Ġe cl : gr n Ġpid : 0 1 2 5 3 3 0 4 0 Ġby r : 1 9 4 6 ĊĊĠĠĠ Ġh cl : dab 2 2 7 Ġi yr : 2 0 1 2 ĊĠĠĠ Ġe cl : br n Ġh gt : 1 8 2 cm Ġpid : 0 2 1 5 7 2 4 1 0 Ġe yr : 2 0 2 0 Ġby r : 1 9 9 2 Ġcid : 2 7 7 ĊĊĠĠĠ Ġh gt : 5 9 cm Ġe cl : zz z ĊĠĠĠ Ġe yr : 2 0 3 8 Ġh cl : 7 4 4 5 4 a Ġi yr : 2 0 2 3 ĊĠĠĠ Ġpid : 3 5 5 6 4 1 2 3 7 8 Ġby r : 2 0 0 7 ĊĊĠĠĠ ĠHere Ġare Ġsome Ġvalid Ġpass ports : ĊĊĠĠĠ Ġpid : 0 8 7 4 9 9 7 0 4 Ġh gt : 7 4 in Ġe cl : gr n Ġi yr : 2 0 1 2 Ġe yr : 2 0 3 0 Ġby r : 1 9 8 0 ĊĠĠĠ Ġh cl :# 6 2 3 a 2 f ĊĊĠĠĠ Ġe yr : 2 0 2 9 Ġe cl : bl u Ġcid : 1 2 9 Ġby r : 1 9 8 9 ĊĠĠĠ Ġi yr : 2 0 1 4 Ġpid : 8 9 6 0 5 6 5 3 9 Ġh cl :# a 9 7 8 4 2 Ġh gt : 1 6 5 cm ĊĊĠĠĠ Ġh cl :# 8 8 8 7 8 5 ĊĠĠĠ Ġh gt : 1 6 4 cm Ġby r : 2 0 0 1 Ġi yr : 2 0 1 5 Ġcid : 8 8 ĊĠĠĠ Ġpid : 5 4 5 7 6 6 2 3 8 Ġe cl : hz l ĊĠĠĠ Ġe yr : 2 0 2 2 ĊĊĠĠĠ Ġi yr : 2 0 1 0 Ġh gt : 1 5 8 cm Ġh cl :# b 6 6 5 2 a Ġe cl : bl u Ġby r : 1 9 4 4 Ġe yr : 2 0 2 1 Ġpid : 0 9 3 1 5 4 7 1 9 ĊĊĠĠĠ ĠCount Ġthe Ġnumber Ġof Ġvalid Ġpass ports Ġ- Ġthose Ġthat Ġhave Ġall Ġrequired Ġfields Ġand Ġvalid Ġvalues . ĠContinue Ġto Ġtreat Ġcid Ġas Ġoptional . ĊĠĠĠ ĠIn Ġyour Ġbatch Ġfile , Ġhow Ġmany Ġpass ports Ġare Ġvalid ? ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġfun Ġget Result () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġactive Passport Ġ= ĠPass port () ĊĠĠĠĠĠĠĠ Ġ( getInput As Sequence (). sum Of Ġ{ Ġline : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreturn Val Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Passport . isValid ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Val Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Passport Ġ= ĠPass port () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Passport Line ( line , Ġactive Passport ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Val ĊĠĠĠĠĠĠĠ Ġ} Ġ+ Ġ( if Ġ( active Passport . isValid ()) Ġ 1 Ġelse Ġ 0 )). call Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Passport Line ( line : ĠString , Ġpassport : ĠPass port ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Parts Ġ= Ġline . split (" Ġ") ĊĠĠĠĠĠĠĠ Ġline Parts . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Parts Ġ= Ġit . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassport . addField ( field Parts [ 0 ], Ġfield Parts [ 1 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPass port Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrequired Fields Ġ= Ġmap Of < String , Ġ( String ) Ġ-> ĠBoolean >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" by r ", Ġ{ Ġrange Matches (( 1 9 2 0 .. 2 0 0 2 ), Ġit ) Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" i yr ", Ġ{ Ġrange Matches (( 2 0 1 0 .. 2 0 2 0 ), Ġit ) Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" ey r ", Ġ{ Ġrange Matches (( 2 0 2 0 .. 2 0 3 0 ), Ġit ) Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" h gt ", Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . endsWith (" cm ") Ġ-> Ġrange Matches Part (( 1 5 0 .. 1 9 3 ), Ġ" cm ", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . endsWith (" in ") Ġ-> Ġrange Matches Part (( 5 9 .. 7 6 ), Ġ" in ", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" h cl ", Ġ{ Ġit . matches ( Regex ("# [ 0 - 9 a - f ]{ 6 } ")) Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" e cl ", Ġ{ Ġset Of (" amb ", Ġ" bl u ", Ġ" br n ", Ġ" gry ", Ġ" gr n ", Ġ" hz l ", Ġ" oth "). contains ( it ) Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" pid ", Ġ{ Ġit . matches ( Regex ("\\ d { 9 } ")) Ġ}), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfields : ĠMutable Map < String , ĠString > Ġ= Ġhash Map Of () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrange Matches ( range : ĠInt Range , Ġit : ĠString ) Ġ= Ġrange . contains ( it . toInt OrNull ()) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrange Matches Part ( range : ĠInt Range , Ġsuffix : ĠString , Ġit : ĠString ) Ġ= Ġrange . contains ( it . substring Before ( suffix ). toInt OrNull ()) ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Field ( key : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠisValid () Ġ= Ġrequired Fields . all Ġ{ Ġfields [ it . key ]?. let Ġ{ Ġvalue Ġ-> Ġit . value . invoke ( value ) Ġ} Ġ?: Ġfalse Ġ} ĊĠĠĠ Ġ} Ċ }