package Ġnet . o leg g . a oc . year 2 0 2 0 . day 2 2 Ċ Ċ import Ġnet . o leg g . a oc . so med ay . Some Day Ċ import Ġnet . o leg g . a oc . utils . to Pair Ċ import Ġnet . o leg g . a oc . year 2 0 2 0 . Day Of 2 0 2 0 Ċ Ċ /** Ċ Ġ* ĠSee Ġ[ Year Ġ 2 0 2 0 , ĠDay Ġ 2 2 ]( https :// ad vent of code . com / 2 0 2 0 / day / 2 2 ) Ċ Ġ*/ Ċ object ĠDay 2 2 Ġ: ĠDay Of 2 0 2 0 ( 2 2 ) Ġ{ ĊĠ Ġoverride Ġfun Ġfirst ( data : ĠString ): ĠAny ? Ġ{ ĊĠĠĠ Ġval Ġ( p 1 , Ġp 2 ) Ġ= Ġdata ĊĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠ Ġ. split ("\ n \ n ") ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . lines (). drop ( 1 ) Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ ĠArray Deque ( it . map Ġ{ Ġcard Ġ-> Ġcard . toInt () Ġ}) Ġ} ĊĠĠĠĠĠ Ġ. to Pair () ĊĊĠĠĠ Ġwhile Ġ( p 1 . isNotEmpty () Ġ&& Ġp 2 . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġp 1 . remove First () ĊĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġp 2 . remove First () ĊĊĠĠĠĠĠ Ġif Ġ( v 1 Ġ> Ġv 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġp 1 Ġ+= Ġv 1 ĊĠĠĠĠĠĠĠ Ġp 1 Ġ+= Ġv 2 ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġp 2 Ġ+= Ġv 2 ĊĠĠĠĠĠĠĠ Ġp 2 Ġ+= Ġv 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresult Ġ= Ġp 1 Ġ+ Ġp 2 ĊĊĠĠĠ Ġreturn Ġresult . map Indexed Ġ{ Ġindex , Ġvalue Ġ-> Ġ( result . size Ġ- Ġindex ) Ġ* Ġvalue Ġ}. sum () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġsecond ( data : ĠString ): ĠAny ? Ġ{ ĊĠĠĠ Ġval Ġ( p 1 , Ġp 2 ) Ġ= Ġdata ĊĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠ Ġ. split ("\ n \ n ") ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . lines (). drop ( 1 ) Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ ĠArray Deque ( it . map Ġ{ Ġcard Ġ-> Ġcard . toInt () Ġ}) Ġ} ĊĠĠĠĠĠ Ġ. to Pair () ĊĊĠĠĠ Ġwhile Ġ( p 1 . isNotEmpty () Ġ&& Ġp 2 . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġp 1 . remove First () ĊĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġp 2 . remove First () ĊĊĠĠĠĠĠ Ġval Ġp 1 win Ġ= Ġif Ġ( v 1 Ġ<= Ġp 1 . size Ġ&& Ġv 2 Ġ<= Ġp 2 . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl 1 Ġ= Ġp 1 . take ( v 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġl 2 Ġ= Ġp 2 . take ( v 2 ) ĊĠĠĠĠĠĠĠ Ġplay Recursive ( l 1 , Ġl 2 ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġv 1 Ġ> Ġv 2 ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( p 1 win ) Ġ{ ĊĠĠĠĠĠĠĠ Ġp 1 Ġ+= Ġv 1 ĊĠĠĠĠĠĠĠ Ġp 1 Ġ+= Ġv 2 ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġp 2 Ġ+= Ġv 2 ĊĠĠĠĠĠĠĠ Ġp 2 Ġ+= Ġv 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresult Ġ= Ġp 1 Ġ+ Ġp 2 ĊĊĠĠĠ Ġreturn Ġresult . map Indexed Ġ{ Ġindex , Ġvalue Ġ-> Ġ( result . size Ġ- Ġindex ) Ġ* Ġvalue Ġ}. sum () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġplay Recursive ( in 1 : ĠList < Int >, Ġin 2 : ĠList < Int >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcache Ġ= Ġmutable Set Of < Pair < List < Int >, ĠList < Int >> >() ĊĠĠĠ Ġval Ġp 1 Ġ= ĠArray Deque ( in 1 ) ĊĠĠĠ Ġval Ġp 2 Ġ= ĠArray Deque ( in 2 ) ĊĊĠĠĠ Ġwhile Ġ( p 1 . isNotEmpty () Ġ&& Ġp 2 . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġl 1 Ġ= Ġp 1 . toList () ĊĠĠĠĠĠ Ġval Ġl 2 Ġ= Ġp 2 . toList () ĊĠĠĠĠĠ Ġif Ġ( l 1 Ġto Ġl 2 Ġin Ġcache ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcache . add ( l 1 Ġto Ġl 2 ) ĊĊĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġp 1 . remove First () ĊĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġp 2 . remove First () ĊĊĠĠĠĠĠ Ġval Ġp 1 win Ġ= Ġif Ġ( v 1 Ġ<= Ġp 1 . size Ġ&& Ġv 2 Ġ<= Ġp 2 . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġq 1 Ġ= Ġp 1 . take ( v 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġq 2 Ġ= Ġp 2 . take ( v 2 ) ĊĠĠĠĠĠĠĠ Ġplay Recursive ( q 1 , Ġq 2 ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġv 1 Ġ> Ġv 2 ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( p 1 win ) Ġ{ ĊĠĠĠĠĠĠĠ Ġp 1 Ġ+= Ġv 1 ĊĠĠĠĠĠĠĠ Ġp 1 Ġ+= Ġv 2 ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġp 2 Ġ+= Ġv 2 ĊĠĠĠĠĠĠĠ Ġp 2 Ġ+= Ġv 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġp 1 . isNotEmpty () ĊĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ= ĠSome Day . main ify ( Day 2 2 ) Ċ