import Ġjava . lang . Integer . max Ċ Ċ fun Ġmain () Ġ{ ĊĊĠĠĠ Ġval Ġdebug Ġ= Ġfalse ĊĊĠĠĠ Ġclass ĠSn ake Num ( val Ġstr : ĠString , Ġvar Ġparent : ĠSn ake Num ?, Ġvar Ġpointer : ĠInt , Ġvar Ġlevel : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġleft Child : ĠSn ake Num ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġright Child : ĠSn ake Num ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġvalue : ĠInt Ġ= Ġ- 1 ĊĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( pointer Ġ< Ġstr . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str [ pointer ]. is Digit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstr [ pointer ]. toString (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str [ pointer ] Ġ== Ġ'[ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Child Ġ= ĠSn ake Num ( str , Ġthis , Ġpointer , Ġlevel Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ= Ġleft Child !!. pointer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str [ pointer ] Ġ== Ġ', ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Child Ġ= ĠSn ake Num ( str , Ġthis , Ġpointer , Ġlevel Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ= Ġright Child !!. pointer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str [ pointer ] Ġ== Ġ' ]') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( other : ĠSn ake Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Child Ġ= Ġthis . sh allow Copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Child Ġ= Ġother ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Le v ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġshallow Copy (): ĠSn ake Num Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= ĠSn ake Num ( str , Ġthis , Ġstr . length , Ġlevel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . left Child Ġ= Ġleft Child ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . right Child Ġ= Ġright Child ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtmp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġset Le v ( l : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= Ġl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Child ?. set Le v ( l Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Child ?. set Le v ( l Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Child ?. parent Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Child ?. parent Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Explo d able (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( level Ġ> Ġ 4 ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleft Child !!. is Explo d able () Ġ&& Ġright Child !!. is Explo d able () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġis Reduc ed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( level Ġ> Ġ 4 ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 ) Ġreturn Ġvalue Ġ< Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleft Child !!. is Reduc ed () Ġ&& Ġright Child !!. is Reduc ed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Number Pair (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġ== Ġ- 1 Ġ&& Ġleft Child !!. value Ġ!= Ġ- 1 Ġ&& Ġright Child !!. value Ġ!= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Left Up ( v : ĠInt , Ġsource : ĠSn ake Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Child Ġ!== Ġsource ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Child !!. add Right Down ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent ?. add Left Up ( v , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Right Up ( v : ĠInt , Ġsource : ĠSn ake Num ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Child Ġ!== Ġsource ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Child !!. add Left Down ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent ?. add Right Up ( v , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Right Down ( v : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ+= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Child !!. add Right Down ( v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Left Down ( v : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ+= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Child !!. add Left Down ( v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġexplode (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( level Ġ>= Ġ 4 Ġ&& Ġis Number Pair ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġprintln (" Explo ding : Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent !!. add Left Up ( left Child !!. value , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent !!. add Right Up ( right Child !!. value , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Child Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Child Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Child !!. explode ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġright Child !!. explode () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsplit (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 Ġ&& Ġvalue Ġ< Ġ 1 0 ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 Ġ&& Ġvalue Ġ>= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġprintln (" Split ting : Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew V Ġ= Ġvalue Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Child Ġ= ĠSn ake Num ( new V . toString (), Ġthis , Ġ 9 9 , Ġlevel Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Child !!. value Ġ= Ġnew V ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew V Ġ+= Ġif Ġ( value Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ 0 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Child Ġ= ĠSn ake Num ( new V . toString (), Ġthis , Ġ 9 9 , Ġlevel Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Child !!. value Ġ= Ġnew V ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Child !!. split ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġright Child !!. split () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreduce () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! is Reduc ed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġprintln (" Result : Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( explode ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġmagnitude (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 ) Ġreturn Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleft Child !!. magnitude () Ġ* Ġ 3 Ġ+ Ġright Child !!. magnitude () Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ== Ġ- 1 ) Ġ" [$ left Child ,$ right Child ]" Ġelse Ġvalue . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġas ĠSn ake Num ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer Ġ!= Ġother . pointer ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġother . value ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġpointer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġpart 1 ( input : ĠList < Snake Num >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnum Ġ= Ġinput . first () ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġinput . drop ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum . add ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum . reduce () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( num ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnum . magnitude () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun ĠgetS nail Num ( i : ĠString ): ĠSn ake Num Ġ= ĠSn ake Num ( i , Ġnull , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġfun Ġpart 2 ( input : ĠList < Snake Num >): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġmax Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( a Ġin Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( b Ġin Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ+= Ġ 1 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġ== Ġb ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Proxy Ġ= ĠgetS nail Num ( a . str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Proxy Ġ= ĠgetS nail Num ( b . str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Proxy . add ( b Proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Proxy . reduce () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġa Proxy . magnitude () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġmax ( m , max ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmax ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġpreprocessing ( input : ĠString ): ĠList < Snake Num > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . split ("\ n "). map Ġ{ ĠgetS nail Num ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ // ĠĠĠ Ġval Ġreal In p Ġ= Ġread _ test Input (" real 1 5 ") Ċ // ĠĠĠ Ġval Ġtest In p Ġ= Ġread _ test Input (" test 1 5 ") ĊĊĠĠĠ Ġval Ġtest In p Ġ= Ġ"" Ċ // ĠĠĠ Ġprintln (" Test Ġ 1 : Ġ${ part 1 ( preprocessing ( test In p )) }") Ċ Ċ // ĠĠĠ Ġprintln (" Real Ġ 1 : Ġ${ part 1 ( preprocessing ( real In p )) }") Ċ // ĠĠĠ Ġprintln (" ----------- ") ĊĠĠĠ Ġprintln (" Test Ġ 2 : Ġ${ part 2 ( preprocessing ( test In p )) }") Ċ // println (" Real Ġ 2 : Ġ${ part 2 ( preprocessing ( real In p )) }") Ċ Ċ } ĊĊĊ