package Ġio . github . fb iv ille . solver Ċ Ċ import Ġio . github . fb iv ille . solver . Solution Branch . Companion . initial Move Ċ Ċ class ĠSolver ( initial Value : ĠNumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Moves : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Value : ĠNumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperations : ĠList < Named Function >) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġvalues Ġ= ĠTree ( operations . size , Ġmax Moves , Ġinitial Move ( initial Value )) ĊĊĠĠĠ Ġfun Ġsolve (): ĠSolution Ġ{ ĊĠĠĠĠĠĠĠ Ġfill Tree () ĊĠĠĠĠĠĠĠ Ġreturn Ġresolve () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill Tree () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġvalues . non Leaf Indices ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! target Reached ( index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . set Children Of ( index , Ġ* compute Moves ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Ops Ġ= Ġoperations . map Ġ{ ĠSolution Branch . no Op ( target Value ) Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . set Children Of ( index , Ġ* no Ops ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve (): ĠSolution Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpossible Solutions Ġ= Ġvalues . match Branches By Leaf ({ Ġit . result Ġis ĠSuccess Ġ&& Ġit . result . number Ġ== Ġtarget Value Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġbest Solution Ġ= Ġpossible Solutions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . drop ( 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Descending Ġ{ Ġno Op Count After Target Reached ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( best Solution ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠNo Solution ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠValid ated Solution ( best Solution . map Ġ{ ĠSuccessful Move ( it . result Ġas ĠSuccess ) Ġ}. filter Not Ġ{ Ġit . result . fn Ġ== ĠNamed Functions . no Op () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġno Op Count After Target Reached ( it : ĠList < Move >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . count Ġ{ Ġ( it . result Ġas ĠSuccess ). fn Ġ== ĠNamed Functions . no Op () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtarget Reached ( index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomputation Ġ= Ġvalues [ index ]. result ĊĠĠĠĠĠĠĠ Ġreturn Ġcomputation Ġis ĠSuccess Ġ&& Ġcomputation . number Ġ== Ġtarget Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Moves ( index : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperations . map Ġ{ ĠSolution Branch . apply ( operation Ġ= Ġit , Ġvalue Ġ= Ġvalues [ index ]. result ) Ġ}. to Typed Array () Ċ Ċ } ĊĊ