package Ġday 2 1 Ċ Ċ import Ġread Input Ċ Ċ data Ġclass ĠPlayer ( val Ġname : ĠString , Ġvar Ġpos : ĠInt , Ġvar Ġscore : ĠInt ) Ċ fun ĠString . to Player (): ĠPlayer Ġ{ ĊĠĠĠ Ġreturn ĠPlayer ( this . substring Before (" Ġstarting "), Ġthis . split (" Ġ"). last (). toInt (), Ġ 0 ) Ċ } Ċ fun Ġget Rol ls ( roll s Nb : ĠList < Int >): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġroll s Nb . map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnb Ġ= Ġit Ġ% Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( nb Ġ== Ġ 0 ) Ġ 1 0 0 Ġelse Ġnb ĊĠĠĠ Ġ}. sum () Ċ } Ċ Ċ // ĠJust Ġexecute Ġthe Ġgame Ġmanually Ċ fun Ġpart 1 ( lines : ĠList < String >): ĠInt Ġ{ ĊĠĠĠ Ġval Ġplayers Ġ= ĠlistOf ( lines . first (). to Player (), Ġlines . last (). to Player ()) ĊĠĠĠ Ġvar Ġcurrent Player Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġroll s Nb Ġ= Ġ 1 ĊĊĠĠĠ Ġwhile Ġ(! players . any Ġ{ Ġit . score Ġ>= Ġ 1 0 0 0 Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġplayers [ current Player ] ĊĠĠĠĠĠĠĠ Ġval Ġrolled Ġ= Ġget Rol ls ( listOf ( roll s Nb , Ġroll s Nb Ġ+ Ġ 1 , Ġroll s Nb Ġ+ Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġroll s Nb Ġ+= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġp . pos Ġ= Ġ( p . pos Ġ+ Ġrolled ) Ġ% Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( p . pos Ġ== Ġ 0 ) Ġp . pos Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġp . score Ġ+= Ġp . pos ĊĊĠĠĠĠĠĠĠ Ġcurrent Player Ġ= Ġ( current Player Ġ+ Ġ 1 ) Ġ% Ġplayers . size ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġplayers . first Ġ{ Ġit . score Ġ< Ġ 1 0 0 0 Ġ}. score Ġ* Ġ( roll s Nb Ġ- Ġ 1 ) Ċ } Ċ Ċ val Ġways Memo Ġ= Ġmutable Map Of < String , ĠLong >() Ċ fun Ġfind W ays ( throws : ĠInt , Ġsum : ĠInt , Ġfaces : ĠInt Ġ= Ġ 3 ) Ġ: ĠLong Ġ{ ĊĠĠĠ Ġif Ġ( sum Ġ== Ġ 0 Ġ&& Ġthrows Ġ== Ġ 0 ) Ġreturn Ġ 1 ĊĠĠĠ Ġif Ġ( sum Ġ< Ġ 0 Ġ|| Ġthrows Ġ== Ġ 0 ) Ġreturn Ġ 0 ĊĊĠĠĠ Ġval Ġkey Ġ= Ġ"$ sum -$ throws " ĊĠĠĠ Ġif Ġ(! ways Memo . containsKey ( key )) Ġ{ ĊĠĠĠĠĠĠĠ Ġways Memo [ key ] Ġ= Ġ( 1 .. faces ). toList (). sum Of Ġ{ Ġfind W ays ( throws Ġ- Ġ 1 , Ġsum Ġ- Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġways Memo [ key ] !! Ċ } Ċ Ċ fun ĠPair < Long , ĠLong >. multiply ( multiplier : ĠLong ) Ġ= ĠPair ( first Ġ* Ġmultiplier , Ġsecond Ġ* Ġmultiplier ) Ċ fun ĠPair < Long , ĠLong >. add ( other : ĠPair < Long , ĠLong >) Ġ= ĠPair ( first Ġ+ Ġother . first , Ġsecond Ġ+ Ġother . second ) Ċ Ċ val Ġmemo Ġ= Ġmutable Map Of < String , ĠPair < Long , ĠLong >>() Ċ fun ĠnumberOf W ays To Win ( pos 1 : ĠInt , Ġscore 1 : ĠInt , Ġpos 2 : ĠInt , Ġscore 2 : ĠInt , Ġrolled : ĠInt , Ġplayer 1 turn : ĠBoolean ) Ġ: ĠPair < Long , ĠLong > Ġ{ ĊĠĠĠ Ġval Ġkey Ġ= Ġ"$ pos 1 -$ score 1 -$ pos 2 -$ score 2 -$ rolled -$ player 1 turn " ĊĠĠĠ Ġif Ġ(! memo . containsKey ( key )) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( player 1 turn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpos After Throw Ġ= Ġ( pos 1 Ġ+ Ġrolled ) Ġ% Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos After Throw Ġ== Ġ 0 ) Ġpos After Throw Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscore After Throw Ġ= Ġscore 1 Ġ+ Ġpos After Throw ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( score After Throw Ġ>= Ġ 2 1 ) Ġreturn ĠPair ( 1 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 7 Ġtotal Ġpossib ilities Ġto Ġobtain Ġa Ġtotal Ġbetween Ġ 3 Ġand Ġ 9 Ġrolling Ġ 3 Ġtimes Ġa Ġ 3 Ġf aced Ġdice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal W ays Ġ= ĠPair ( 0 L , Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( possible Total Ġin Ġ 3 .. 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal W ays Ġ= Ġtotal W ays . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf W ays To Win ( pos After Throw , Ġscore After Throw , Ġpos 2 , Ġscore 2 , Ġrolled Ġ= Ġpossible Total , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( find W ays ( throws Ġ= Ġ 3 , Ġpossible Total )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemo [ key ] Ġ= Ġtotal W ays ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpos After Throw Ġ= Ġ( pos 2 Ġ+ Ġrolled ) Ġ% Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos After Throw Ġ== Ġ 0 ) Ġpos After Throw Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscore After Throw Ġ= Ġscore 2 Ġ+ Ġpos After Throw ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( score After Throw Ġ>= Ġ 2 1 ) Ġreturn ĠPair ( 0 , Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 7 Ġtotal Ġpossib ilities Ġto Ġobtain Ġa Ġtotal Ġbetween Ġ 3 Ġand Ġ 9 Ġrolling Ġ 3 Ġtimes Ġa Ġ 3 Ġf aced Ġdice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal W ays Ġ= ĠPair ( 0 L , Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( possible Total Ġin Ġ 3 .. 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal W ays Ġ= Ġtotal W ays . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf W ays To Win ( pos 1 , Ġscore 1 , Ġpos After Throw , Ġscore After Throw , Ġrolled Ġ= Ġpossible Total , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( find W ays ( throws Ġ= Ġ 3 , Ġpossible Total )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemo [ key ] Ġ= Ġtotal W ays ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmemo [ key ] !! Ċ } Ċ Ċ fun Ġpart 2 ( lines : ĠList < String >): ĠLong Ġ{ ĊĠĠĠ Ġval Ġplayers Ġ= ĠlistOf ( lines . first (). to Player (), Ġlines . last (). to Player ()) ĊĠĠĠ Ġval Ġpos 1 Ġ= Ġplayers . first (). pos ĊĠĠĠ Ġval Ġpos 2 Ġ= Ġplayers . last (). pos ĊĊĠĠĠ Ġvar Ġtotal Ġ= ĠPair ( 0 L , Ġ 0 L ) ĊĠĠĠ Ġfor Ġ( possible Total Ġin Ġ 3 .. 9 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtotal Ġ= Ġtotal . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf W ays To Win ( pos 1 , Ġ 0 , Ġpos 2 , Ġ 0 , Ġrolled Ġ= Ġpossible Total , Ġtrue ) Ġ// ĠPlayer 1 Ġstarts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( find W ays ( throws Ġ= Ġ 3 , Ġpossible Total )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmax Of ( total . first , Ġtotal . second ) Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġtest Input Ġ= Ġread Input (" day 2 1 / test ") ĊĠĠĠ Ġprintln (" part 1 ( test Input ) Ġ=> Ġ" Ġ+ Ġpart 1 ( test Input )) ĊĠĠĠ Ġprintln (" part 2 ( test Input ) Ġ=> Ġ" Ġ+ Ġpart 2 ( test Input )) ĊĊĠĠĠ Ġval Ġinput Ġ= Ġread Input (" day 2 1 / input ") ĊĠĠĠ Ġprintln (" part 1 ( input ) Ġ=> Ġ" Ġ+ Ġpart 1 ( input )) ĊĠĠĠ Ġprintln (" part 2 ( input ) Ġ=> Ġ" Ġ+ Ġpart 2 ( input )) Ċ } Ċ