package Ġcom . ko env . ad vent of code Ċ Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlin . comp arisons . compare Values Ċ Ċ object ĠDay 4 Ġ{ ĊĠĠĠ Ġval ĠRO OM _ NAME _ PATTERN : ĠPattern Ġ= ĠPattern . compile (" ([ a - z \\ - ]*) -( \\ d +) \\ [ ([ a - z ]{ 5 }) \\ ]") ĊĊĠĠĠ Ġfun Ġget Room Name ( input : ĠString ): ĠRoom Name Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠRO OM _ NAME _ PATTERN . matcher ( input ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Invalid Ġroom Ġname : Ġ$ input ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRoom Name ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . group ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . group ( 2 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . group ( 3 ). toCharArray (). toList () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Most Common Letters ( encrypted Name : ĠString ) Ġ= Ġencrypted Name . toCharArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġ'-' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. values ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( Comparator Ġ{ Ġlhs , Ġrhs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lhs . size Ġ== Ġrhs . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Comparator Ġcompare Values ( lhs [ 0 ], Ġrhs [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompare Values ( rhs . size , Ġlhs . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit [ 0 ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 5 ) ĊĊĠĠĠ Ġfun Ġis Checksum Valid ( room : ĠRoom Name ) Ġ= Ġroom . most Common Letters Ġ== Ġget Most Common Letters ( room . encrypted Name ) ĊĊĠĠĠ Ġfun Ġget Sector Id Sum ( input : ĠString ) Ġ= Ġinput . lines () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ( String :: isNotBlank ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġget Room Name ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġis Checksum Valid ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum By Ġ{ Ġit . sector Id Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt Name ( room : ĠRoom Name ) Ġ= ĠString ( room . encrypted Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toCharArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġshift Letter ( it , Ġroom . sector Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toCharArray ()) ĊĊĠĠĠ Ġfun Ġshift Letter ( letter : ĠChar , Ġn : ĠInt ): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( letter Ġ== Ġ'-') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ' Ġ' ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġnew Ġ= Ġletter ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. n ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ġ= Ġshift Letter ( new ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshift Letter ( letter : ĠChar ): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( letter Ġ== Ġ' z ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ' a ' ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġletter Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget North P ole Object Storage Sector Id ( input : ĠString ) Ġ= Ġinput . lines () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ( String :: isNotBlank ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġget Room Name ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġis Checksum Valid ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdecrypt Name ( it ) Ġto Ġit . sector Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . first Ġ== Ġ" north pole Ġobject Ġstorage " Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. second ĊĊĠĠĠ Ġdata Ġclass ĠRoom Name ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsector Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmost Common Letters : ĠList < Char > ĊĠĠĠ Ġ) Ċ }