package Ġcom . nib ado . projects . ad vent . y 2 0 2 1 Ċ Ċ import Ġcom . nib ado . projects . ad vent .* Ċ Ċ object ĠDay 1 8 Ġ: ĠDay Ġ{ ĊĠĠĠ Ġprivate Ġval Ġinput Ġ= Ġresource Lines ( 2 0 2 1 , Ġ 1 8 ) ĊĊĠĠĠ Ġprivate Ġfun ĠString . to S nail Number () Ġ= Ġif ( length Ġ== Ġ 1 ) Ġto S nail Number Lit () Ġelse Ġto S nail Number Pair () ĊĠĠĠ Ġprivate Ġfun ĠString . to S nail Number Lit () Ġ= ĠS nail Number Lit ( toInt ()) ĊĠĠĠ Ġprivate Ġfun ĠString . to S nail Number Pair (): ĠS nail Number Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinside Ġ= Ġdrop ( 1 ). drop Last ( 1 ) ĊĠĠĠĠĠĠĠ Ġvar Ġleft Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġbrackets Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġinside ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'[ ') Ġbrackets ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ' ]') Ġbrackets -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ',' Ġ&& Ġbrackets Ġ== Ġ 0 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ+= Ġc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġinside . drop ( left . length Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġreturn ĠS nail Number Pair ( left . to S nail Number (), Ġright . to S nail Number ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġabstract Ġclass ĠS nail Number Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġmagnitude (): ĠInt ĊĠĠĠĠĠĠĠ Ġabstract Ġfun ĠaddTo Left Most ( value : ĠInt ) ĊĠĠĠĠĠĠĠ Ġabstract Ġfun ĠaddTo Right Most ( value : ĠInt ) ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġsplit (): ĠBoolean ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġexplode ( depth : ĠInt Ġ= Ġ 0 ): ĠPair < Int , ĠInt >? ĊĊĠĠĠĠĠĠĠ Ġfun Ġreduce () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexplo ded Ġ= Ġexplode () Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġif Ġ(! explo ded ) Ġsplit () Ġelse Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( explo ded Ġ|| Ġsplit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠS nail Number Lit ( var Ġvalue : ĠInt ) Ġ: ĠS nail Number () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmagnitude () Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠaddTo Left Most ( value : ĠInt ) Ġ= Ġrun Ġ{ Ġthis . value Ġ+= Ġvalue Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠaddTo Right Most ( value : ĠInt ) Ġ= Ġrun Ġ{ Ġthis . value Ġ+= Ġvalue Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsplit () Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexplode ( depth : ĠInt ): ĠPair < Int , ĠInt >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġvalue . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠS nail Number Pair ( var Ġleft : ĠS nail Number , Ġvar Ġright : ĠS nail Number ) Ġ: ĠS nail Number () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmagnitude () Ġ= Ġ 3 Ġ* Ġleft . magnitude () Ġ+ Ġ 2 Ġ* Ġright . magnitude () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠaddTo Left Most ( value : ĠInt ) Ġ= Ġleft . addTo Left Most ( value ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠaddTo Right Most ( value : ĠInt ) Ġ= Ġright . addTo Right Most ( value ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsplit (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġis ĠS nail Number Lit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( left Ġas ĠS nail Number Lit ). value . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ>= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= ĠS nail Number Pair ( S nail Number Lit ( it Ġ/ Ġ 2 ), ĠS nail Number Lit (( it Ġ+ Ġ 1 ) Ġ/ Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left . split ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Ġis ĠS nail Number Lit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( right Ġas ĠS nail Number Lit ). value . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ>= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= ĠS nail Number Pair ( S nail Number Lit ( it Ġ/ Ġ 2 ), ĠS nail Number Lit (( it Ġ+ Ġ 1 ) Ġ/ Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġright . split () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexplode ( depth : ĠInt ): ĠPair < Int , ĠInt >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( left Ġas ĠS nail Number Lit ). value Ġto Ġ( right Ġas ĠS nail Number Lit ). value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft . explode ( depth Ġ+ Ġ 1 )?. let Ġ{ Ġ( first , Ġsecond ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Ġ!= Ġ- 1 Ġ&& Ġsecond Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . left Ġ= ĠS nail Number Lit ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . right . addTo Left Most ( second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfirst Ġto Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( second Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . right . addTo Left Most ( second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 Ġto Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfirst Ġto Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright . explode ( depth Ġ+ Ġ 1 )?. let Ġ{ Ġ( first , Ġsecond ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Ġ!= Ġ- 1 Ġ&& Ġsecond Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . right Ġ= ĠS nail Number Lit ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . left . addTo Right Most ( first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 Ġto Ġsecond ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . left . addTo Right Most ( first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 Ġto Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 Ġto Ġsecond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" [$ left ,$ right ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart 1 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . reduce Ġ{ Ġacc , Ġs Ġ-> Ġ" [$ acc ,$ s ] ". to S nail Number (). apply Ġ{ Ġreduce () Ġ}. toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . to S nail Number (). magnitude () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart 2 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . max Of Ġ{ Ġfirst Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . filter Not Ġ{ Ġit Ġ== Ġfirst Ġ}. max Of Ġ{ Ġsecond Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" [$ first ,$ second ] ". to S nail Number (). apply Ġ{ Ġreduce () Ġ}. magnitude () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }