package Ġday 2 Ċ Ċ class ĠProblem 2 b Ġ{ ĊĊĠĠĠ Ġfun Ġsolve Problem ( values : ĠList < InputData >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalues . filter Ġ{ Ġvalid ( it ) Ġ}. size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalid ( input Data : ĠInput Data ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpasses Policy ( input Data . policy , Ġinput Data . password ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpasses Policy ( policy : ĠSimple Policy , Ġpassword : ĠString ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Char Matches Ġ= Ġchar Matches ( policy . lower Bound , Ġpolicy . char , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġval Ġsecond Char Matches Ġ= Ġchar Matches ( policy . upper Bound , Ġpolicy . char , Ġpassword ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfirst Char Matches . xor ( second Char Matches ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchar Matches ( index : ĠInt , Ġchar : ĠChar , Ġpassword : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Index Ġ= Ġindex Ġ- Ġ 1 ; ĊĊĠĠĠĠĠĠĠ Ġif Ġ( password . length Ġ< Ġindex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpassword . get ( actual Index ) Ġ== Ġchar ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠreadFile ( fileName : ĠString ): ĠList < InputData > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠgetResource As Text ( fileName ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile . lines (). map Ġ{ Ġparse Line ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Line ( input Line : ĠString ): ĠInput Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġinput Line . split (": ") ĊĊĠĠĠĠĠĠĠ Ġval Ġchar Split Ġ= Ġsplit [ 0 ]. trim (). split (" Ġ") ĊĠĠĠĠĠĠĠ Ġval Ġbound Split Ġ= Ġchar Split [ 0 ]. split ("- ") ĊĠĠĠĠĠĠĠ Ġval Ġpolicy Ġ= ĠSimple Policy ( char Split [ 1 ]. get ( 0 ), Ġbound Split [ 0 ]. toInt (), Ġbound Split [ 1 ]. toInt ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠInput Data ( policy , Ġsplit [ 1 ]. trim ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetResource As Text ( path : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . java Class . getResource ( path ). read Text () ĊĠĠĠ Ġ} Ċ }