println (" Start ") Ċ val Ġrequired Fields Ġ= ĠlistOf (" by r ", Ġ" i yr ", Ġ" ey r ", Ġ" h gt ", Ġ" h cl ", Ġ" e cl ", Ġ" pid ") Ċ Ċ val Ġinput Ġ= Ġread Input (" day 4 . txt "). read Text () Ċ Ċ val Ġvalid Num Ġ= Ġinput . split ("\ n \ n ") ĊĠĠĠ Ġ. as Sequence () ĊĠĠĠ Ġ. map Ġ{ Ġpassport Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġfull String Ġ= Ġpassport . replace ("\ n ", Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġreturn @ map Ġif Ġ( required Fields . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull String . contains ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull String ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġnull Ġ&& ĠPass port . fromString ( it ). isValid () Ġ} ĊĠĠĠ Ġ. toList () ĊĠĠĠ Ġ. size Ċ Ċ println ("$ valid Num Ġvalid Ġpass ports ") ĊĊ Ċ data Ġclass ĠPass port ( ĊĠĠĠ Ġval Ġby r : ĠInt , ĊĠĠĠ Ġval Ġi yr : ĠInt , ĊĠĠĠ Ġval Ġe yr : ĠInt , ĊĠĠĠ Ġval Ġh gt : ĠString , ĊĠĠĠ Ġval Ġh cl : ĠString , ĊĠĠĠ Ġval Ġe cl : ĠString , ĊĠĠĠ Ġval Ġpid : ĠString , ĊĠĠĠ Ġval Ġcid : ĠInt ? Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġeye Colors Ġ= ĠlistOf (" amb ", Ġ" bl u ", Ġ" br n ", Ġ" gry ", Ġ" gr n ", Ġ" hz l ", Ġ" oth ") ĊĊĠĠĠ Ġfun ĠisValid (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġby r Ġin Ġ 1 9 2 0 .. 2 0 0 2 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi yr Ġin Ġ 2 0 1 0 .. 2 0 2 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe yr Ġin Ġ 2 0 2 0 .. 2 0 3 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Height () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh cl . matches ( Regex ("# [ 0 - 9 a - f ]{ 6 } ")) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe cl Ġin Ġeye Colors Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpid . length Ġ== Ġ 9 ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠisValid Height (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh gt . matches ( Regex ("\\ d { 3 } cm ")) Ġ-> Ġh gt . substring ( 0 , Ġ 3 ). toInt () Ġin Ġ 1 5 0 .. 1 9 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh gt . matches ( Regex ("\\ d { 2 } in ")) Ġ-> Ġh gt . substring ( 0 , Ġ 2 ). toInt () Ġin Ġ 5 9 .. 7 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom String ( str : ĠString ): ĠPass port Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprop Map Ġ= Ġstr . trim (). split (" Ġ"). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( key , Ġvalue ) Ġ= Ġit . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġ( key Ġto Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPass port ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Map [" by r "] !!. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Map [" i yr "] !!. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Map [" ey r "] !!. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Map [" h gt "] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Map [" h cl "] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Map [" e cl "] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Map [" pid "] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Map [" cid "] ?. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ