package Ġfr . pt ur pin . cour ser a . dyn prog Ċ Ċ class ĠPrimitive Calculator ( private Ġval Ġnumber : ĠInt ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġavailable Operations Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠMult By Operation ( 2 ), ĊĠĠĠĠĠĠĠ ĠMult By Operation ( 3 ), ĊĠĠĠĠĠĠĠ ĠAdd To Operation ( 1 ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġcache Ġ= Ġmutable Map Of < Int , ĠOperation States >() ĊĊĠĠĠ Ġfun Ġget Minimum Operations To Compute (): ĠOperation States Ġ{ ĊĠĠĠĠĠĠĠ Ġcache . clear () ĊĠĠĠĠĠĠĠ Ġcache [ 1 ] Ġ= ĠNo Op States ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( current Number Ġin Ġ 1 .. number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Operation Ġ= Ġcache [ current Number ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Operations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapplied Number Ġ= Ġit . apply ( current Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . compute ( applied Number ) Ġ{ Ġ_, Ġold State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= ĠLinked Operation States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplied Number , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Operation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old State Ġ== Ġnull Ġ|| ĠnewState . size () Ġ< Ġold State . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( applied Number Ġ== Ġnumber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcache [ number ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcache [ number ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinterface ĠOperation Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( number : ĠInt ): ĠInt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠMult By Operation ( private Ġval Ġfactor : ĠInt ) Ġ: ĊĠĠĠĠĠĠĠ ĠOperation Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( number : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber Ġ* Ġfactor ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠAdd To Operation ( private Ġval Ġterm : ĠInt ) Ġ: ĊĠĠĠĠĠĠĠ ĠOperation Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( number : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber Ġ+ Ġterm ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOperation States Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsize (): ĠInt ĊĠĠĠĠĠĠĠ Ġfun Ġget States (): ĠIterable < Int > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠLinked Operation States ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcurrent State : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnext State : ĠOperation States ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ: ĠOperation States Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsize Ġ= Ġnext State . size () Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsize () Ġ= Ġsize ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget States (): ĠIterable < Int > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( currentState ) Ġ+ Ġnext State . get States () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠNo Op States ( private Ġval Ġinitial Value : ĠInt ): ĊĠĠĠĠĠĠĠ ĠOperation States Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsize () Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget States () Ġ= ĠlistOf ( initial Value ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġnumber Ġ= Ġread Line () !!. toInt () ĊĊĠĠĠ Ġval Ġprimitive Calculator Ġ= ĠPrimitive Calculator ( number ) ĊĠĠĠ Ġval Ġminimum Operations To Compute Ġ= Ġprimitive Calculator . get Minimum Operations To Compute () ĊĊĠĠĠ Ġprintln ( minimum Operations To Compute . size ()) ĊĠĠĠ Ġprint ( minimum Operations To Compute . get States (). reversed (). join ToString (" Ġ")) Ċ } Ċ