package Ġdays Ċ Ċ import Ġsplit On Blank Ċ Ċ class ĠDay 2 2 Ġ: ĠDay ( 2 2 ) Ġ{ ĊĊĠĠĠ Ġ// Ġ 3 4 5 6 6 ĊĠĠĠ Ġoverride Ġfun Ġpart One (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Game ( false ). play Until Over (). score ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ 3 1 8 5 4 ĊĠĠĠ Ġoverride Ġfun Ġpart Two (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Game ( true ). play Until Over (). score ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Game ( recursive : ĠBoolean ): ĠCom bat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( p 1 , Ġp 2 ) Ġ= Ġinput List . split On Blank (). map Ġ{ ĠArray Deque ( it . drop ( 1 ). map Ġ{ Ġit . toInt () Ġ}) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCom bat ( p 1 , Ġp 2 , Ġrecursive ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtodo Ġrecursive Ġiteration Ġtakes Ġaround Ġ 3 Ġseconds Ġ- Ġcould Ġbe Ġimpro v ded ĊĠĠĠ Ġdata Ġclass ĠCom bat ( val Ġplayer 1 : ĠArray Deque < Int >, Ġval Ġplayer 2 : ĠArray Deque < Int >, Ġval Ġrecursive : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsnapshots Ġ= Ġmutable ListOf < Combat Snapshot >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġplay Until Over (): ĠCom bat State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrounds Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( player 1 . isNotEmpty () Ġ&& Ġplayer 2 . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrounds ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchanged Ġto Ġ|| Ġto Ġ&& Ġbased Ġon Ġfollowing Ġre dd it Ġdiscussion Ġ( also Ġ&& Ġwas Ġnot Ġfinish ing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// www . reddit . com / r / ad vent of code / comments / k ic n 1 3 / 2 0 2 0 _ day _ 2 2 _ interpret ation _ of _ previous ly _ seen / ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recursive Ġ&& Ġsnapshots . any Ġ{ Ġit . player 1 Ġ== Ġplayer 1 . toList () Ġ|| Ġit . player 2 Ġ== Ġplayer 2 . toList () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 2 . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recursive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshots . add ( Combat Snapshot ( rounds , Ġplayer 1 . toList (), Ġplayer 2 . toList ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġround () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwinner Ġ= Ġif Ġ( player 1 . isEmpty ()) Ġ 2 Ġto Ġplayer 2 Ġelse Ġ 1 Ġto Ġplayer 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCom bat State ( rounds , Ġwinner . first , Ġwinner . second , Ġscore ( winner . second )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġround () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( p 1 , Ġp 2 ) Ġ= Ġplayer 1 . remove First () Ġto Ġplayer 2 . remove First () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Win Ġ= Ġif Ġ( recursive Ġ&& Ġplayer 1 . count () Ġ>= Ġp 1 Ġ&& Ġplayer 2 . count () Ġ>= Ġp 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCom bat ( Array Deque ( player 1 . toList (). take ( p 1 )), ĠArray Deque ( player 2 . toList (). take ( p 2 )), Ġtrue ). play Until Over (). winner Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġp 1 Ġ> Ġp 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 1 Win ) Ġplayer 1 . addAll ( listOf ( p 1 , Ġp 2 )) Ġelse Ġplayer 2 . addAll ( listOf ( p 2 , Ġp 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġscore ( player : ĠArray Deque < Int >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġplayer . reversed (). fold Indexed ( 0 ) Ġ{ Ġindex , Ġscore , Ġcard Ġ-> Ġscore Ġ+ Ġ( card Ġ* Ġ( index Ġ+ Ġ 1 )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCom bat State ( val Ġrounds : ĠInt , Ġval Ġwinner : ĠInt , Ġval Ġdeck : ĠArray Deque < Int >, Ġval Ġscore : ĠInt ) ĊĊĠĠĠ Ġdata Ġclass ĠCom bat Snapshot ( val Ġround : ĠInt , Ġval Ġplayer 1 : ĠList < Int >, Ġval Ġplayer 2 : ĠList < Int >) Ċ } Ċ