package Ġio . github . cle ch asse ur . ad vent of code 2 0 2 1 Ċ Ċ import Ġkotlin . math . max Ċ Ċ object ĠDay 2 1 Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval Ġplayer 1 Starting Pos Ġ= Ġ 8 ĊĠĠĠ Ġprivate Ġconst Ġval Ġplayer 2 Starting Pos Ġ= Ġ 3 ĊĊĠĠĠ Ġfun Ġpart 1 (): ĠInt Ġ= Ġplay Game ( Determin istic Dice ()) ĊĊĠĠĠ Ġfun Ġpart 2 (): ĠLong Ġ= Ġplay Quantum Game () ĊĊĠĠĠ Ġprivate Ġinterface ĠDie Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġroll (): ĠInt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠPlayer ( var Ġpos : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġscore : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġmove ( die : ĠDie ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove By Ġ= Ġdie . roll () Ġ+ Ġdie . roll () Ġ+ Ġdie . roll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ= Ġ( pos Ġ+ Ġmove By Ġ- Ġ 1 ) Ġ% Ġ 1 0 Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ+= Ġpos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Game ( die : ĠDie ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayer 1 Ġ= ĠPlayer ( player 1 Starting Pos ) ĊĠĠĠĠĠĠĠ Ġval Ġplayer 2 Ġ= ĠPlayer ( player 2 Starting Pos ) ĊĠĠĠĠĠĠĠ Ġvar Ġroll s Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroll s Ġ+= Ġplayer 1 . move ( die ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player 1 . score Ġ>= Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroll s Ġ* Ġplayer 2 . score ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroll s Ġ+= Ġplayer 2 . move ( die ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player 2 . score Ġ>= Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroll s Ġ* Ġplayer 1 . score ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDetermin istic Dice Ġ: ĠDie Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnext : ĠInt Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġroll (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrolled Ġ= Ġnext ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ> Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrolled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdir ac Dice Results Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠ 1 Ġ+ Ġ 1 Ġ+ Ġ 1 , Ġ 1 Ġ+ Ġ 1 Ġ+ Ġ 2 , Ġ 1 Ġ+ Ġ 1 Ġ+ Ġ 3 , Ġ 1 Ġ+ Ġ 2 Ġ+ Ġ 1 , Ġ 1 Ġ+ Ġ 2 Ġ+ Ġ 2 , Ġ 1 Ġ+ Ġ 2 Ġ+ Ġ 3 , Ġ 1 Ġ+ Ġ 3 Ġ+ Ġ 1 , Ġ 1 Ġ+ Ġ 3 Ġ+ Ġ 2 , Ġ 1 Ġ+ Ġ 3 Ġ+ Ġ 3 , ĊĠĠĠĠĠĠĠĠ 2 Ġ+ Ġ 1 Ġ+ Ġ 1 , Ġ 2 Ġ+ Ġ 1 Ġ+ Ġ 2 , Ġ 2 Ġ+ Ġ 1 Ġ+ Ġ 3 , Ġ 2 Ġ+ Ġ 2 Ġ+ Ġ 1 , Ġ 2 Ġ+ Ġ 2 Ġ+ Ġ 2 , Ġ 2 Ġ+ Ġ 2 Ġ+ Ġ 3 , Ġ 2 Ġ+ Ġ 3 Ġ+ Ġ 1 , Ġ 2 Ġ+ Ġ 3 Ġ+ Ġ 2 , Ġ 2 Ġ+ Ġ 3 Ġ+ Ġ 3 , ĊĠĠĠĠĠĠĠĠ 3 Ġ+ Ġ 1 Ġ+ Ġ 1 , Ġ 3 Ġ+ Ġ 1 Ġ+ Ġ 2 , Ġ 3 Ġ+ Ġ 1 Ġ+ Ġ 3 , Ġ 3 Ġ+ Ġ 2 Ġ+ Ġ 1 , Ġ 3 Ġ+ Ġ 2 Ġ+ Ġ 2 , Ġ 3 Ġ+ Ġ 2 Ġ+ Ġ 3 , Ġ 3 Ġ+ Ġ 3 Ġ+ Ġ 1 , Ġ 3 Ġ+ Ġ 3 Ġ+ Ġ 2 , Ġ 3 Ġ+ Ġ 3 Ġ+ Ġ 3 , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠQuant um Player ( val Ġpos : ĠInt , Ġval Ġscore : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġmove ( by : ĠInt ): ĠQuant um Player Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pos Ġ= Ġ( pos Ġ+ Ġby Ġ- Ġ 1 ) Ġ% Ġ 1 0 Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠQuant um Player ( new Pos , Ġscore Ġ+ Ġnew Pos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠQuant um GameState ( val Ġplayer 1 : ĠQuant um Player , Ġval Ġplayer 2 : ĠQuant um Player ) ĊĊĠĠĠ Ġprivate Ġfun Ġplay Quantum Game (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstates : ĠMap < Quantum GameState , ĠLong > Ġ= Ġmap Of ( Quantum GameState ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġ= ĠQuant um Player ( player 1 Starting Pos , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 2 Ġ= ĠQuant um Player ( player 2 Starting Pos , Ġ 0 ), ĊĠĠĠĠĠĠĠ Ġ) Ġto Ġ 1 L ) ĊĠĠĠĠĠĠĠ Ġvar Ġwins 1 Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġwins 2 Ġ= Ġ 0 L ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( states . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew States Ġ= Ġmutable Map Of < Quantum GameState , ĠLong >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates . forEach Ġ{ Ġ( state , Ġun iver ses ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir ac Dice Results . forEach Ġ{ Ġroll s Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Player 1 Ġ= Ġstate . player 1 . move ( roll s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Player 1 . score Ġ>= Ġ 2 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwins 1 Ġ+= Ġun iver ses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= ĠQuant um GameState ( new Player 1 , Ġstate . player 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew States [ newState ] Ġ= Ġnew States . get OrDefault ( newState , Ġ 0 L ) Ġ+ Ġun iver ses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates Ġ= Ġnew States . toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew States . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates . forEach Ġ{ Ġ( state , Ġun iver ses ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir ac Dice Results . forEach Ġ{ Ġroll s Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Player 2 Ġ= Ġstate . player 2 . move ( roll s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Player 2 . score Ġ>= Ġ 2 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwins 2 Ġ+= Ġun iver ses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= ĠQuant um GameState ( state . player 1 , Ġnew Player 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew States [ newState ] Ġ= Ġnew States . get OrDefault ( newState , Ġ 0 L ) Ġ+ Ġun iver ses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates Ġ= Ġnew States ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmax ( wins 1 , Ġwins 2 ) ĊĠĠĠ Ġ} Ċ } Ċ