package Ġio . github . aar jav p . a oc . day 1 4 Ċ Ċ import Ġio . github . aar jav p . a oc . read From Classpath Ċ Ċ class ĠDay 1 4 Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠRule ( val Ġmatch Id : ĠString , Ġval Ġadd Char : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( match Id . length Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġleft Pair Ġ= Ġ"${ match Id [ 0 ]} $ add Char " ĊĠĠĠĠĠĠĠ Ġval Ġright Pair Ġ= Ġ"$ add Char ${ match Id [ 1 ]}" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠState ( starting Pol ymer : ĠString , Ġval Ġrules : ĠList < Rule >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcharacter Counts Ġ= Ġmutable Map Of < Char , ĠLong >() ĊĠĠĠĠĠĠĠ Ġval Ġpair Counts Ġ= Ġmutable Map Of < String , ĠLong >() ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġstarting Pol ymer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacter Counts . merge ( c , Ġ 1 , ĠLong :: plus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pair Ġin Ġstarting Pol ymer . zip With Next Ġ{ Ġa , Ġb Ġ-> Ġ"$ a $ b " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair Counts . merge ( pair , Ġ 1 , ĠLong :: plus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġapply Rules () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pairs Ġ= Ġmutable Map Of < String , ĠLong >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Remove Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( rule Ġin Ġrules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġpair Counts [ rule . match Id ] Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Remove Ġ+= Ġrule . match Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacter Counts . merge ( rule . add Char , Ġcount , ĠLong :: plus ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pairs . merge ( rule . left Pair , Ġcount , ĠLong :: plus ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pairs . merge ( rule . right Pair , Ġcount , ĠLong :: plus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pair Ġin Ġto Remove ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair Counts . remove ( pair ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( new Pair Ġin Ġnew Pairs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair Counts . merge ( new Pair . key , Ġnew Pair . value , ĠLong :: plus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse State ( input : ĠSequence < String >): ĠState Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġinput . iterator () ĊĠĠĠĠĠĠĠ Ġval Ġstarting Pol ymer Ġ= Ġiterator . next () ĊĊĠĠĠĠĠĠĠ Ġcheck ( iterator . next (). isBlank ()) ĊĠĠĠĠĠĠĠ Ġval Ġrules Ġ= Ġmutable ListOf < Rule >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Rule Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( match Id , Ġadd Char Str ) Ġ= Ġraw Rule . split (" Ġ-> Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrules Ġ+= ĠRule ( match Id , Ġadd Char Str [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠState ( starting Pol ymer , Ġrules ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 1 ( input : ĠSequence < String >): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġparse State ( input ) ĊĠĠĠĠĠĠĠ Ġrepeat ( 1 0 ) Ġ{ Ġstate . apply Rules () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġstate . character Counts . entries ĊĠĠĠĠĠĠĠ Ġreturn Ġentries . max Of Ġ{ Ġit . value Ġ} Ġ- Ġentries . min Of Ġ{ Ġit . value Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 2 ( input : ĠSequence < String >): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġparse State ( input ) ĊĠĠĠĠĠĠĠ Ġrepeat ( 4 0 ) Ġ{ Ġstate . apply Rules () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġstate . character Counts . entries ĊĠĠĠĠĠĠĠ Ġreturn Ġentries . max Of Ġ{ Ġit . value Ġ} Ġ- Ġentries . min Of Ġ{ Ġit . value Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġsolution Ġ= ĠDay 1 4 () ĊĊĠĠĠ Ġval Ġpart 1 : ĠLong Ġ= Ġread From Classpath (" Day 1 4 . txt "). use Lines Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġsolution . part 1 ( input ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln ( part 1 ) ĊĊĠĠĠ Ġval Ġpart 2 : ĠLong Ġ= Ġread From Classpath (" Day 1 4 . txt "). use Lines Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġsolution . part 2 ( input ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln ( part 2 ) Ċ Ċ } Ċ