package Ġday 1 4 Ċ Ċ import Ġread Input Ċ Ċ fun ĠList < String >. to Pair Insert ions () Ġ: ĠMap < String , ĠString > Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠ Ġfilter Ġ{ Ġit . contains (" -> ") Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġmap [ it . substring Before (" -> "). trim ()] Ġ= Ġit . substring After (" -> "). trim () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmap Ċ } Ċ Ċ fun Ġapply Step ( start : ĠString , Ġpairs : ĠMap < String , ĠString >) Ġ: ĠString Ġ{ ĊĠĠĠ Ġval Ġnew Str Ġ= ĠStringBuilder () ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġstart . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Str . append ( start [ i ]) ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ+ Ġ 1 Ġ< Ġstart . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġ"${ start [ i ]} ${ start [ i Ġ+ Ġ 1 ]}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pairs . contains ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Str . append ( pairs [ key ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnew Str . toString () Ċ } Ċ Ċ fun Ġpart 1 ( lines : ĠList < String >) Ġ: ĠInt Ġ{ ĊĠĠĠ Ġvar Ġpol ymer Template Ġ= Ġlines . first () ĊĠĠĠ Ġval Ġpair Insert ions Ġ= Ġlines . to Pair Insert ions () ĊĠĠĠ Ġval ĠnumberOf Steps Ġ= Ġ 1 0 ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠnumberOf Steps ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpol ymer Template Ġ= Ġapply Step ( polymer Template , Ġpair Insert ions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġletters To Occ urrences Ġ= Ġpol ymer Template . toList (). grouping By Ġ{ Ġit Ġ}. each Count () ĊĠĠĠ Ġval Ġmax Letter Ġ= Ġletters To Occ urrences . max Of OrNull Ġ{ Ġit . value Ġ} Ġ?: Ġreturn Ġ- 1 ĊĠĠĠ Ġval Ġmin Letter Ġ= Ġletters To Occ urrences . min Of OrNull Ġ{ Ġit . value Ġ} Ġ?: Ġreturn Ġ- 1 ĊĠĠĠ Ġreturn Ġmax Letter Ġ- Ġmin Letter Ċ } Ċ Ċ fun Ġpart 2 ( lines : ĠList < String >) Ġ: ĠLong Ġ{ ĊĠĠĠ Ġval Ġpol ymer Template Ġ= Ġlines . first () ĊĠĠĠ Ġval Ġpair Insert ions Ġ= Ġlines . to Pair Insert ions () ĊĠĠĠ Ġval ĠnumberOf Steps Ġ= Ġ 4 0 ĊĠĠĠ Ġval Ġpairs Ġ= Ġmutable Map Of < String , ĠLong >() ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġpol ymer Template . indices ) Ġ{ Ġ// ĠNN CB Ġ=> Ġ{ NN = 1 , ĠNC = 1 , ĠCB = 1 } ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ+ Ġ 1 Ġ< Ġpol ymer Template . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġ"${ polymer Template [ i ]} ${ polymer Template [ i Ġ+ Ġ 1 ]}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpairs [ key ] Ġ= Ġpairs . get OrDefault ( key , Ġ 0 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠApply ing Ġthe Ġsteps Ġby Ġpairs Ġ=> Ġ[ NN ] Ġbecomes Ġ[ NC ] Ġ& Ġ[ CN ] ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠnumberOf Steps ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġmutable Map Of < String , ĠLong >() ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġpairs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair Insert ions [ key ]?. let Ġ{ Ġreplacement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Key Ġ= Ġ"" + key . first () Ġ+ Ġreplacement . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Key Ġ= Ġ"" + replacement . first () Ġ+ Ġkey . last () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp [ first Key ] Ġ= Ġtmp . get OrDefault ( first Key , Ġ 0 ) Ġ+ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp [ second Key ] Ġ= Ġtmp . get OrDefault ( second Key , Ġ 0 ) Ġ+ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpairs . clear () ĊĠĠĠĠĠĠĠ Ġpairs . put All ( tmp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCalculate Ġthe Ġtotals ĊĠĠĠ Ġval Ġtotals Ġ= Ġmutable Map Of < Char , ĠLong >() ĊĠĠĠ Ġtotals [ polymer Template . first ()] Ġ= Ġ 1 ĊĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġpairs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtotals [ k . last ()] Ġ= Ġtotals . get OrDefault ( k . last (), Ġ 0 ) Ġ+ Ġv ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsorted Ġ= Ġtotals . toList (). map Ġ{ Ġit . second Ġ}. sorted Descending () ĊĠĠĠ Ġreturn Ġsorted . first () Ġ- Ġsorted . last () Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġtest Input Ġ= Ġread Input (" day 1 4 / test ") ĊĠĠĠ Ġprintln (" part 1 ( test Input ) Ġ=> Ġ" Ġ+ Ġpart 1 ( test Input )) ĊĠĠĠ Ġprintln (" part 2 ( test Input ) Ġ=> Ġ" Ġ+ Ġpart 2 ( test Input )) ĊĊĠĠĠ Ġval Ġinput Ġ= Ġread Input (" day 1 4 / input ") ĊĠĠĠ Ġprintln (" part 1 ( input ) Ġ=> Ġ" Ġ+ Ġpart 1 ( input )) ĊĠĠĠ Ġprintln (" part 2 ( input ) Ġ=> Ġ" Ġ+ Ġpart 2 ( input )) Ċ } Ċ