package Ġnet . v old rich . a oc 2 1 Ċ Ċ import Ġkotlin . math . max Ċ Ċ // Ġhttps :// ad vent of code . com / 2 0 2 1 / day / 1 8 Ċ fun Ġmain () Ġ{ ĊĠĠĠ ĠDay 1 8 (). run () Ċ } Ċ Ċ class ĠDay 1 8 Ġ: ĠBase Day () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġtask 1 () Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfinal S nail Number Ġ= Ġinput . lines (). map (:: S nail Number ). reduce Ġ{ Ġa , Ġb Ġ-> Ġa . add ( b ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfinal S nail Number . calculate Value () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtask 2 () Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnumber List Ġ= Ġinput . lines (). map (:: S nail Number ). toList () ĊĊĠĠĠĠĠĠĠ Ġvar ĠmaxValue Ġ= ĠInt . MIN _ VALUE ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġnumber List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġnumber List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxValue Ġ= Ġmax ( i . add ( j ). calculate Value (), ĠmaxValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxValue Ġ= Ġmax ( j . add ( i ). calculate Value (), ĠmaxValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠmaxValue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse S nail Number ( num Str Ġ: ĠString ) Ġ: ĠS nail Number Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠS nail Number ( num Str ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠS nail Number Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Pair Ġ: ĠNum Pair ĊĊĠĠĠĠĠĠĠ Ġconstructor ( num Str Ġ: ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Pair Ġ= Ġread S nail Number ( num Str . iterator ()) Ġas ĠNum Pair ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( root Pair . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconstructor ( root Pair Ġ: ĠNum Pair ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . root Pair Ġ= Ġroot Pair ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġread S nail Number ( iterator : ĠChar Iterator ): ĠNum Base Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Ġ= Ġiterator . next Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġ'[ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= ĠNum Pair () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . left Ġ= Ġread S nail Number ( iterator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( iterator . next Char () Ġ== Ġ', ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . right Ġ= Ġread S nail Number ( iterator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( iterator . next Char () Ġ== Ġ' ]') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpair ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( char . is Digit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNum Value ( char . digit ToInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġthrow ĠException (" Unexpected Ġcharacter Ġ$ char ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( other : ĠS nail Number ) Ġ: ĠS nail Number Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= ĠNum Pair () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair . left Ġ= Ġthis . root Pair . clone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair . right Ġ= Ġother . root Pair . clone () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsn ail Number Ġ= ĠS nail Number ( pair ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ail Number . reduce () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ this Ġ+ Ġ$ other Ġ= Ġ$ sn ail Number ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsn ail Number ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreduce () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" reduce Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pairs To Explo de . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexplode Candidate Ġ= Ġpairs To Explo de . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġex Pair Ġ= Ġexplode Candidate . pair ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexplode Candidate . closest Left ?. add ( ex Pair . left Ġas ĠNum Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexplode Candidate . closest Right ?. add ( ex Pair . right Ġas ĠNum Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex Pair . parent . replace ( ex Pair , ĠNum Value ( 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" explode Ġ$ explode Candidate Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values To Split . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Value Ġ= Ġvalues To Split . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= ĠNum Pair () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Floor Ġ= Ġsplit Value . value Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . left Ġ= ĠNum Value ( half Floor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . right Ġ= ĠNum Value ( split Value . value Ġ- Ġhalf Floor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit Value . parent . replace ( split Value , Ġpair ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" split Ġ$ split Value Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( pairs To Explo de . isNotEmpty () Ġ|| Ġvalues To Split . isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpairs To Explo de Ġ= ĠArrayList < Explo de Candidate >() ĊĠĠĠĠĠĠĠ Ġval Ġvalues To Split Ġ= ĠArrayList < Num Value >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġanalyze () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpairs To Explo de . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues To Split . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze ( root Pair , Ġ 1 , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġanalyze ( pair : ĠNum Pair , Ġdepth : ĠInt , Ġclosest Left : ĠNum Value ?, Ġclosest Right : ĠNum Value ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġpair . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġpair . right ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġis ĠNum Value Ġ&& Ġleft . value Ġ> Ġ 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues To Split . add ( left ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġis ĠNum Pair ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze ( left , Ġdepth Ġ+ Ġ 1 , Ġclosest Left , Ġfind Closes Right ( pair )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġis ĠNum Value Ġ&& Ġright Ġis ĠNum Value Ġ&& Ġdepth Ġ> Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpairs To Explo de . add ( Explo de Candidate ( pair , Ġclosest Left , Ġclosest Right )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Ġis ĠNum Pair ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze ( right , Ġdepth Ġ+ Ġ 1 , Ġfind Closes Left ( pair ), Ġclosest Right ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Ġis ĠNum Value Ġ&& Ġright . value Ġ> Ġ 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues To Split . add ( right ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠExplo de Candidate ( val Ġpair : ĠNum Pair , Ġval Ġclosest Left : ĠNum Value ?, Ġval Ġclosest Right : ĠNum Value ?) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfind Closes Right ( pair : ĠNum Pair ): ĠNum Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair . right Ġis ĠNum Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpair . right Ġas ĠNum Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġleft Most Ġ= Ġpair . right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( left Most Ġis ĠNum Pair ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Most Ġ= Ġleft Most . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Most Ġis ĠNum Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleft Most ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Right Ġvalue Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfind Closes Left ( pair : ĠNum Pair ): ĠNum Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair . left Ġis ĠNum Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpair . left Ġas ĠNum Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġright Most Ġ= Ġpair . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( right Most Ġis ĠNum Pair ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Most Ġ= Ġright Most . right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Most Ġis ĠNum Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġright Most ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Left Ġvalue Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcalculate Value () Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroot Pair . calculate Value () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroot Pair . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠNum Pair Ġ: ĠNum Base () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġleft : ĠNum Base Ġ= ĠNum Value ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . parent Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġright : ĠNum Base Ġ= ĠNum Value ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . parent Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString ( builder : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('[ ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft . toString ( builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (',') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright . toString ( builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (' ]') ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreplace ( old Pair : ĠNum Base , Ġnew Pair : ĠNum Base ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġ== Ġold Pair ) Ġleft Ġ= Ġnew Pair ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Ġ== Ġold Pair ) Ġright Ġ= Ġnew Pair ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pair . parent Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcalculate Value (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 3 Ġ* Ġleft . calculate Value () Ġ+ Ġ 2 Ġ* Ġright . calculate Value () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclone (): ĠNum Base Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclone Ġ= ĠNum Pair () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclone . left Ġ= Ġleft . clone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclone . right Ġ= Ġright . clone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclone ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠNum Value ( var Ġvalue : ĠInt Ġ= Ġ 0 ) Ġ: ĠNum Base () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString ( builder : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcalculate Value (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclone (): ĠNum Base Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNum Value ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( other : ĠNum Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ+= Ġother . value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠNum Base Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġparent : ĠNum Pair ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun ĠtoString ( builder : ĠStringBuilder ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtoString ( sb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġcalculate Value (): ĠInt ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġclone (): ĠNum Base ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ