package Ġdays Ċ Ċ import Ġkotlin . math . min Ċ Ċ class ĠDay 2 1 Ġ: ĠDay ( 2 1 ) Ġ{ ĊĊĠĠĠ Ġvar Ġpos 1 Ġ= Ġ 4 ĊĠĠĠ Ġvar Ġpos 2 Ġ= Ġ 8 ĊĊĠĠĠ Ġoverride Ġfun Ġpart One (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdice Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġp 1 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġp 2 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġturn P 1 Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwhile Ġ( p 1 Ġ< Ġ 1 0 0 0 Ġ&& Ġp 2 Ġ< Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdice Ġ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( turn P 1 ) Ġpos 1 Ġ+= Ġdice % 1 0 0 Ġelse Ġpos 2 Ġ+= Ġdice % 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dice % 1 0 0 Ġ== Ġ 0 ) Ġif Ġ( turn P 1 ) Ġpos 1 Ġ+= Ġ 1 0 0 Ġelse Ġpos 2 Ġ+= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdice Ġ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( turn P 1 ) Ġpos 1 Ġ+= Ġdice % 1 0 0 Ġelse Ġpos 2 Ġ+= Ġdice % 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dice % 1 0 0 Ġ== Ġ 0 ) Ġif Ġ( turn P 1 ) Ġpos 1 Ġ+= Ġ 1 0 0 Ġelse Ġpos 2 Ġ+= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdice Ġ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( turn P 1 ) Ġpos 1 Ġ+= Ġdice % 1 0 0 Ġelse Ġpos 2 Ġ+= Ġdice % 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dice % 1 0 0 Ġ== Ġ 0 ) Ġif Ġ( turn P 1 ) Ġpos 1 Ġ+= Ġ 1 0 0 Ġelse Ġpos 2 Ġ+= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( turn P 1 ) Ġp 1 Ġ+= Ġpos 1 % 1 0 Ġelse Ġp 2 Ġ+= Ġpos 2 % 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( turn P 1 Ġ&& Ġpos 1 % 1 0 Ġ== Ġ 0 ) Ġp 1 Ġ+= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! turn P 1 Ġ&& Ġpos 2 % 1 0 Ġ== Ġ 0 ) Ġp 2 Ġ+= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġturn P 1 Ġ= Ġ! turn P 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( min ( p 1 , p 2 )* dice ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠGameState ( val Ġp 1 : ĠInt , Ġval Ġp 2 : ĠInt , Ġval Ġpos 1 : ĠInt , Ġval Ġpos 2 : ĠInt , Ġval Ġturn : ĠInt ) ĊĠĠĠ Ġ// turn Ġ 0 , 1 , 2 Ġ-> ĠP 1 Ġ 3 , 4 , 5 -> P 6 ĊĊĠĠĠ Ġprivate Ġval Ġcache Ġ= Ġmutable Map Of < Pair < GameState , Int >, Pair < Long , Long >>() ĊĊĠĠĠ Ġfun Ġplay Ġ( gs : ĠGameState , Ġdice : ĠInt ) Ġ: ĠPair < Long , Long > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnext Pos 1 Ġ= Ġgs . pos 1 ĊĠĠĠĠĠĠĠ Ġvar Ġnext P 1 Ġ= Ġgs . p 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( gs . turn Ġin Ġ 0 .. 2 ) Ġnext Pos 1 Ġ= Ġ( gs . pos 1 Ġ+ Ġdice ) Ġ% Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( next Pos 1 Ġ== Ġ 0 ) Ġnext Pos 1 Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( gs . turn Ġ== Ġ 2 ) Ġnext P 1 Ġ+= Ġnext Pos 1 ĊĠĠĠĠĠĠĠ Ġvar Ġnext Pos 2 Ġ= Ġgs . pos 2 ĊĠĠĠĠĠĠĠ Ġvar Ġnext P 2 Ġ= Ġgs . p 2 ĊĠĠĠĠĠĠĠ Ġif Ġ( gs . turn Ġin Ġ 3 .. 5 ) Ġnext Pos 2 Ġ= Ġ( gs . pos 2 Ġ+ Ġdice ) Ġ% Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( next Pos 2 Ġ== Ġ 0 ) Ġnext Pos 2 Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( gs . turn Ġ== Ġ 5 ) Ġnext P 2 Ġ+= Ġnext Pos 2 ĊĠĠĠĠĠĠĠ Ġval Ġnext Turn Ġ= Ġ( gs . turn + 1 ) Ġ% Ġ 6 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( next P 1 Ġ> Ġ 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( 1 , 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( next P 2 Ġ> Ġ 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( 0 , 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnext Gs Ġ= ĠGameState ( next P 1 , next P 2 , next Pos 1 , next Pos 2 , next Turn ) ĊĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= Ġcache [ Pair ( next Gs , 1 )] Ġ?: Ġplay ( next Gs , 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġt 2 Ġ= Ġcache [ Pair ( next Gs , 2 )] Ġ?: Ġplay ( next Gs , 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġt 3 Ġ= Ġcache [ Pair ( next Gs , 3 )] Ġ?: Ġplay ( next Gs , 3 ) ĊĠĠĠĠĠĠĠ Ġcache [ Pair ( next Gs , 1 )] Ġ= Ġt 1 ĊĠĠĠĠĠĠĠ Ġcache [ Pair ( next Gs , 2 )] Ġ= Ġt 2 ĊĠĠĠĠĠĠĠ Ġcache [ Pair ( next Gs , 3 )] Ġ= Ġt 3 ĊĠĠĠĠĠĠĠ Ġreturn Ġ( Pair ( t 1 . first + t 2 . first + t 3 . first , t 1 . second + t 2 . second + t 3 . second )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart Two (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= Ġplay ( GameState ( 0 , 0 , 4 , 2 , 0 ), 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġt 2 Ġ= Ġplay ( GameState ( 0 , 0 , 4 , 2 , 0 ), 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġt 3 Ġ= Ġplay ( GameState ( 0 , 0 , 4 , 2 , 0 ), 3 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( Pair ( t 1 . first + t 2 . first + t 3 . first , t 1 . second + t 2 . second + t 3 . second )) ĊĠĠĠ Ġ} Ċ } Ċ