object ĠP uzzle 4 Ġ{ ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠP uzzle 4 :: class . java . getResource (" pu zzle 4 . txt "). read Text () ĊĠĠĠĠĠĠĠ Ġval Ġpass ports Ġ= ĠPass ports ( input ) ĊĠĠĠĠĠĠĠ Ġprintln ( pass ports . valid Count ()) ĊĊĠĠĠĠĠĠĠ Ġprintln ( pass ports . valid And Filled Count ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPass ports Ġ{ ĊĠĠĠ Ġfun Ġcount ( function : Ġ( Passport ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġitems . count Ġ{ Ġfunction ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalid Count () Ġ= Ġcount Ġ{ Ġit . has All Required Fields () Ġ} ĊĠĠĠ Ġfun Ġvalid And Filled Count () Ġ= Ġcount Ġ{ Ġit . has All Required Fields Filled () Ġ} ĊĊĠĠĠ Ġvar Ġitems : ĠArrayList < Passport > ĊĊĠĠĠ Ġconstructor ( input : ĠString ){ ĊĠĠĠĠĠĠĠ Ġitems Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġpassport Data Ġ= Ġinput . split ("\ n \ n ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( data Ġin Ġpassport Data ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpassport Ġ= ĠPass port () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Va ules Ġ= Ġdata . split ("\ n | Ġ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Value Ġin Ġkey Va ules ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġkey Value . split (": ")[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġkey Value . split (": ")[ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassport . set KeyValue ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . add ( passport ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPass port Ġ{ ĊĠĠĠ Ġval Ġrequired Keys Ġ= Ġarray ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" by r ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" i yr ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey r ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" h gt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" h cl ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" e cl ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" pid " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġabstract Ġclass ĠPass port Data ( data : ĠString ) ĊĊĊĠĠĠ Ġclass ĠBy r ( data : ĠString ): ĠPass port Data ( data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠInt Ġ= Ġdata . toInt () ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value Ġin Ġ 1 9 2 0 .. 2 0 0 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠI yr ( data : ĠString ): ĠPass port Data ( data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠInt Ġ= Ġdata . toInt () ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value Ġin Ġ 2 0 1 0 .. 2 0 2 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠE yr ( data : ĠString ): ĠPass port Data ( data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠInt Ġ= Ġdata . toInt () ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value Ġin Ġ 2 0 2 0 .. 2 0 3 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠH gt : ĠPass port Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġunit : ĠString ĊĊĊĠĠĠĠĠĠĠ Ġconstructor Ġ( data : ĠString ) Ġ: Ġsuper ( data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( data . length Ġ== Ġ 5 Ġ|| Ġdata . length Ġ== Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue String Ġ= Ġif Ġ( data . length Ġ== Ġ 5 ) Ġdata . substring ( 0 , 3 ) Ġelse Ġdata . substring ( 0 , 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Ġ= Ġif Ġ( data . length Ġ== Ġ 5 ) Ġdata . substring ( 3 , 5 ) Ġelse Ġdata . substring ( 2 , 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( unit Ġ== Ġ" cm " Ġ|| Ġunit Ġ== Ġ" in ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue String . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( unit Ġ== Ġ" cm ") Ġrequire ( value Ġin Ġ 1 5 0 .. 1 9 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( unit Ġ== Ġ" in ") Ġrequire ( value Ġin Ġ 5 9 .. 7 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠH cl ( data : ĠString ): ĠPass port Data ( data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ("^ #[ a - f 0 - 9 ]{ 6 }$ ". to Regex (). matches ( value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠE cl ( data : ĠString ): ĠPass port Data ( data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ("^ amb | bl u | br n | gry | gr n | hz l | oth $ ". to Regex (). matches ( value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠP id ( data : ĠString ): ĠPass port Data ( data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ("^ [ 0 - 9 ]{ 9 }$ ". to Regex (). matches ( value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġclass ĠC id ( data : ĠString ): ĠPass port Data ( data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString Ġ= Ġdata ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġkey values Ġ= ĠHashMap < String , String >() ĊĠĠĠ Ġval Ġpassport Data Ġ= ĠHashMap < String , ĠPass port Data >() ĊĊĠĠĠ Ġfun Ġset KeyValue ( key : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġkey values [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassport Data [ key ] Ġ= Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" by r " Ġ-> ĠBy r ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" i yr " Ġ-> ĠI yr ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey r " Ġ-> ĠE yr ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" h gt " Ġ-> ĠH gt ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" h cl " Ġ-> ĠH cl ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" e cl " Ġ-> ĠE cl ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" pid " Ġ-> ĠP id ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cid " Ġ-> ĠC id ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠIllegalArgumentException ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// not Ġvalid ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas All Required Fields (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequired Keys . all Ġ{ Ġkey values . containsKey ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas All Required Fields Filled (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequired Keys . all Ġ{ Ġpassport Data . containsKey ( it ) Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ