package Ġio . github . fb iv ille . solver Ċ Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . Test Ċ Ċ class ĠSolver Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` sol ves Ġproblems Ġwith Ġmaximum Ġ 1 Ġmove `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplus 2 Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġ( n . toInt () Ġ+ Ġ 2 ) Ġ}. to Named Function (" plus 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġtimes 2 Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġ( n . toInt () Ġ* Ġ 2 ) Ġ}. to Named Function (" times 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġproblem Ġ= ĠSolver ( initial Value Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Moves Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperations Ġ= ĠlistOf ( plus 2 , Ġtimes 2 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= Ġproblem . solve () Ġas ĠValid ated Solution ĊĊĠĠĠĠĠĠĠ ĠassertThat ( solution . moves ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccessful Move ( Success ( 2 , Ġplus 2 ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` sol ves Ġproblems Ġwith Ġmaximum Ġ 2 Ġmoves `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplus 2 Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġ( n . toInt () Ġ+ Ġ 2 ) Ġ}. to Named Function (" plus 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġtimes 3 Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġ( n . toInt () Ġ* Ġ 3 ) Ġ}. to Named Function (" times 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġsum Digits Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġn . toString (). chars (). map ({ Ġit Ġ- Ġ' 0 '. toInt () Ġ}). sum () Ġ}. to Named Function (" sum Digits ") ĊĠĠĠĠĠĠĠ Ġval Ġproblem Ġ= ĠSolver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Value Ġ= Ġ 7 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Moves Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperations Ġ= ĠlistOf ( plus 2 , Ġtimes 3 , Ġsum Digits )) ĊĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= Ġproblem . solve () Ġas ĠValid ated Solution ĊĊĠĠĠĠĠĠĠ ĠassertThat ( solution . moves ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccessful Move ( Success ( 2 1 , Ġtimes 3 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccessful Move ( Success ( 3 , Ġsum Digits ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` sol ves Ġproblems Ġwith Ġmaximum Ġn Ġmoves `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplus 2 Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġ( n . toInt () Ġ+ Ġ 2 ) Ġ}. to Named Function (" plus 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġtimes 3 Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġ( n . toInt () Ġ* Ġ 3 ) Ġ}. to Named Function (" times 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġsum Digits Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġn . toString (). chars (). map ({ Ġit Ġ- Ġ' 0 '. toInt () Ġ}). sum () Ġ}. to Named Function (" sum Digits ") ĊĠĠĠĠĠĠĠ Ġval Ġproblem Ġ= ĠSolver ( initial Value Ġ= Ġ 2 8 1 7 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Moves Ġ= Ġ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġ 1 6 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperations Ġ= ĠlistOf ( plus 2 , Ġtimes 3 , Ġsum Digits )) ĊĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= Ġproblem . solve () Ġas ĠValid ated Solution ĊĊĠĠĠĠĠĠĠ ĠassertThat ( solution . moves ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccessful Move ( Success ( 1 8 , Ġsum Digits )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccessful Move ( Success ( 5 4 , Ġtimes 3 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccessful Move ( Success ( 5 6 , Ġplus 2 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccessful Move ( Success ( 1 6 8 , Ġtimes 3 ))) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` select s Ġthe Ġshortest Ġsolution `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimes 3 Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġ( n . toInt () Ġ* Ġ 3 ) Ġ}. to Named Function (" times 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġtimes 9 Ġ= Ġ{ Ġn : ĠNumber Ġ-> Ġ( n . toInt () Ġ* Ġ 9 ) Ġ}. to Named Function (" times 9 ") ĊĠĠĠĠĠĠĠ Ġval Ġproblem Ġ= ĠSolver ( initial Value Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Moves Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġ 2 7 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperations Ġ= ĠlistOf ( times 3 , Ġtimes 9 )) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= Ġproblem . solve () Ġas ĠValid ated Solution ĊĊĠĠĠĠĠĠĠ ĠassertThat ( solution . moves ). contains Exactly ( Successful Move ( Success ( 2 7 , Ġtimes 9 ))) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠFunction 1 < Number , ĠNumber >. to Named Function ( name : ĠString ): ĠNamed Function Ġ= ĠNamed Function ( name , Ġthis ) Ċ