import Ġio . kot est . core . spec . style . Fun Spec Ċ import Ġio . kot est . data . for All Ċ import Ġio . kot est . data . headers Ċ import Ġio . kot est . data . row Ċ import Ġio . kot est . data . table Ċ import Ġio . kot est . matchers . shouldBe Ċ Ċ /* Ċ Ċ --- ĠDay Ġ 1 5 : ĠR amb unct ious ĠRec itation Ġ--- Ċ Ċ See Ġhttps :// ad vent of code . com / 2 0 2 0 / day / 1 5 ĊĊĊ Ġ*/ Ċ Ċ fun Ġplay Mem Game ( start : ĠList < Int >): ĠSequence < Int > Ġ{ ĊĠĠĠ Ġval Ġnr Pos Ġ= Ġmutable Map Of < Int , Int >() ĊĠĠĠ Ġreturn Ġsequence Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġrecent Nr : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġstart . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġstart [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recent Nr Ġ!= Ġnull ) Ġnr Pos [ recent Nr ] Ġ= Ġindex - 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecent Nr Ġ= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( n ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġstart . size Ġuntil ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Pos Ġ= Ġnr Pos [ recent Nr ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġif Ġ( found Pos Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ- Ġfound Pos Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnr Pos [ recent Nr !! ] Ġ= Ġindex - 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecent Nr Ġ= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( n ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠDay 1 5 _ Part 1 Ġ: ĠFun Spec ({ ĊĠĠĠ Ġcontext (" play Ġexample Ġgame ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġplay Mem Game ( listOf ( 0 , Ġ 3 , Ġ 6 )) ĊĠĠĠĠĠĠĠ Ġval Ġfirst 2 0 2 0 Ġ= Ġresult . take ( 2 0 2 0 ). toList () ĊĠĠĠĠĠĠĠ Ġtest (" should Ġgenerate Ġthe Ġright Ġvalues ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst 2 0 2 0 . take ( 1 0 ). toList () ĠshouldBe ĠlistOf ( 0 , Ġ 3 , Ġ 6 , Ġ 0 , Ġ 3 , Ġ 3 , Ġ 1 , Ġ 0 , Ġ 4 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtest (" should Ġgenerate Ġthe Ġright Ġvalue Ġat Ġ 2 0 2 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst 2 0 2 0 . last () ĠshouldBe Ġ 4 3 6 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcontext (" more Ġexamples ") Ġ{ ĊĠĠĠĠĠĠĠ Ġtable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders (" starting Ġnumbers ", Ġ" expected "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 1 , 3 , 2 ), ĠĠĠĠ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 2 , 1 , 3 ), ĠĠĠ 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 1 , 2 , 3 ), ĠĠĠ 2 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 2 , 3 , 1 ), ĠĠĠ 7 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 3 , 2 , 1 ), ĠĠ 4 3 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 3 , 1 , 2 ), Ġ 1 8 3 6 ), ĊĠĠĠĠĠĠĠ Ġ). for All Ġ{ Ġstart , Ġexpected Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġplay Mem Game ( start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . drop ( 2 0 1 9 ). first () ĠshouldBe Ġexpected ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ Ċ class ĠDay 1 5 _ Part 1 _ Exercise : ĠFun Spec ({ ĊĠĠĠ Ġval Ġsolution Ġ= Ġplay Mem Game ( listOf ( 2 , 0 , 1 , 9 , 5 , 1 9 )). drop ( 2 0 1 9 ). first () ĊĠĠĠ Ġtest (" should Ġhave Ġfound Ġsolution ") Ġ{ ĊĠĠĠĠĠĠĠ Ġsolution ĠshouldBe Ġ 1 0 0 9 ĊĠĠĠ Ġ} Ċ }) Ċ Ċ class ĠDay 1 5 _ Part 2 Ġ: ĠFun Spec ({ ĊĠĠĠ Ġx context (" long er Ġexamples ") Ġ{ Ġ// ĠThis Ġwill Ġtake Ġ 9 0 s ĊĠĠĠĠĠĠĠ Ġtable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders (" starting Ġnumbers ", Ġ" expected "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 0 , 3 , 6 ), Ġ 1 7 5 5 9 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 1 , 3 , 2 ), Ġ 2 5 7 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 2 , 1 , 3 ), Ġ 3 5 4 4 1 4 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 1 , 2 , 3 ), Ġ 2 6 1 2 1 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 2 , 3 , 1 ), Ġ 6 8 9 5 2 5 9 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 3 , 2 , 1 ), Ġ 1 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( listOf ( 3 , 1 , 2 ), Ġ 3 6 2 ), ĊĠĠĠĠĠĠĠ Ġ). for All Ġ{ Ġstart , Ġexpected Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġplay Mem Game ( start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . drop ( 3 0 _ 0 0 0 _ 0 0 0 Ġ- Ġ 1 ). first () ĠshouldBe Ġexpected ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ Ċ class ĠDay 1 5 _ Part 2 _ Exercise : ĠFun Spec ({ ĊĠĠĠ Ġx context (" part Ġ 2 ") Ġ{// Ġwill Ġtake Ġ 2 2 s ĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= Ġplay Mem Game ( listOf ( 2 , 0 , 1 , 9 , 5 , 1 9 )). drop ( 3 0 _ 0 0 0 _ 0 0 0 Ġ- Ġ 1 ). first () ĊĠĠĠĠĠĠĠ Ġtest (" should Ġhave Ġfound Ġsolution ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsolution ĠshouldBe Ġ 6 2 7 1 4 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ