package Ġcom . sc avi . brains queeze . ad vent of code Ċ Ċ import Ġjava . util .* Ċ Ċ class ĠDay 2 2 Cr ab Combat Ġ{ ĊĠĠĠ Ġprivate Ġenum Ġclass ĠPlayer Ġ{ ĠUnknown , ĠPlayer 1 , ĠPlayer 2 Ġ} ĊĊĠĠĠ Ġfun Ġsolve A ( input : ĠList < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayers Cards Ġ= Ġget Cards ( input ) ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġplay ( players Cards . first , Ġplayers Cards . second , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġres . second . with Index (). map Ġ{ Ġres . second [ it . index ] Ġ* Ġ( res . second . size - it . index )}. sum () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve B ( input : ĠList < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayers Cards Ġ= Ġget Cards ( input ) ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġplay ( players Cards . first , Ġplayers Cards . second , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn Ġres . second . with Index (). map Ġ{ Ġres . second [ it . index ] Ġ* Ġ( res . second . size - it . index )}. sum () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers Cards 1 : ĠLinkedList < Int >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers Cards 2 : ĠLinkedList < Int >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecursion : ĠBoolean ): ĠPair < Boolean , ĠLinkedList < Int >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseen Ġ= Ġmutable Set Of < Int >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( players Cards 1 . isNotEmpty () Ġand Ġplayers Cards 2 . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( players Cards 1 . hashCode () Ġin Ġseen Ġ|| Ġplayers Cards 2 . hashCode () Ġin Ġseen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( true , Ġplayers Cards 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMajor Ġimprovement Ġfrom Ġ 1 , 6 Ġseconds Ġto Ġ 1 5 5 Ġms Ġafter Ġdiscus sing Ġ/ Ġlooking Ġat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / sh ae ber ling / euler / blob / master / kotlin / src / com / s 1 3 g / a oc / a oc 2 0 2 0 / Day 2 2 . kt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseen . add ( players Cards 1 . hashCode ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseen . add ( players Cards 2 . hashCode ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcard 1 Ġ= Ġplayers Cards 1 . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcard 2 Ġ= Ġplayers Cards 2 . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġplayer 1 W on Ġ= Ġcard 1 Ġ> Ġcard 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recursion Ġ&& Ġplayers Cards 1 . size Ġ>= Ġcard 1 Ġ&& Ġplayers Cards 2 . size Ġ>= Ġcard 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 W on Ġ= Ġplay ( LinkedList ( players Cards 1 . sub List ( 0 , Ġcard 1 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinkedList ( players Cards 2 . sub List ( 0 , Ġcard 2 )), Ġrecursion ). first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player 1 W on ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers Cards 1 . add ( card 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers Cards 1 . add ( card 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers Cards 2 . add ( card 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers Cards 2 . add ( card 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( players Cards 1 . isNotEmpty (), Ġif Ġ( players Cards 1 . isEmpty ()) Ġplayers Cards 2 Ġelse Ġplayers Cards 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cards ( input : ĠList < String >): ĠPair < LinkedList < Int >, ĠLinkedList < Int >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcards Player 1 Ġ= ĠLinkedList < Int >() ĊĠĠĠĠĠĠĠ Ġval Ġcards Player 2 Ġ= ĠLinkedList < Int >() ĊĠĠĠĠĠĠĠ Ġvar Ġplayer Ġ= ĠPlayer . Unknown ĊĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Player Ġ 1 " Ġin Ġline Ġ-> Ġplayer Ġ= ĠPlayer . Player 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Player Ġ 2 " Ġin Ġline Ġ-> Ġplayer Ġ= ĠPlayer . Player 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( player ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer . Player 1 Ġ-> Ġcards Player 1 . add ( line . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer . Player 2 Ġ-> Ġcards Player 2 . add ( line . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" woo ops !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( cards Player 1 , Ġcards Player 2 ) ĊĠĠĠ Ġ} Ċ } Ċ