package Ġic fp 2 0 1 9 . str ategies Ċ Ċ import Ġic fp 2 0 1 9 . analy zers . Board Cells Graph Analyzer Ċ import Ġic fp 2 0 1 9 . analy zers . Short est Path Using Di jk stra Ċ import Ġic fp 2 0 1 9 . core . Strategy Ċ import Ġic fp 2 0 1 9 . model .* Ċ import Ġorg . j gr ap ht . graph . Default Edge Ċ import Ġorg . j gr ap ht . traverse . B read th First Iterator Ċ import Ġorg . j gr ap ht . traverse . Graph Iterator Ċ Ċ fun Ġ< T > ĠSequence < T >. sample ( count : ĠInt ): ĠSequence < T > Ġ= Ġto Mutable List () ĊĠĠĠ Ġ. sh uffled () ĊĠĠĠ Ġ. take ( count ) ĊĠĠĠ Ġ. as Sequence () Ċ Ċ object ĠBF SS tr ategy Ġ: ĠStrategy Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcompute ( initialState : ĠGameState ): Ġ( robot Id : ĠRobot Id , Ġstate : ĠGameState ) Ġ-> ĠAction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgraph Builder Ġ= ĠBoard Cells Graph Analyzer . analyze ( initialState ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġrobot Id , Ġgame State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game State . boost ers Available ( Boost er . Extra Arm ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction . Attach Manip ulator ( game State . robot ( robot Id ). opt imum Manip ulator Arm Target ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} Ġelse Ġif Ġ( game State . boost ers Available ( Boost er . Fast Wheel s ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ ĠAction . Attach Fast Wheel s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= Ġgraph Builder . invoke ( robot Id , Ġgame State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Point Ġ= Ġgame State . robot ( robot Id ). current Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentNode Ġ= Ġgame State . get ( current Point ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbors Ġ= ĠcurrentNode . point . neighbors () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame State . isIn Board ( it ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame State . node State ( it ). is Wrapped . not () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame State . get ( it ). is Ob stacle . not () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( neighbors . any ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb fs Iterator . next () Ġ// Ġmove Ġpast ĠcurrentNode Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbor Ġ= Ġb fs Iterator . next (). point ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Point . action To Get To Neighbor ( neighbors . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb fs Iterator : ĠGraph Iterator < Board Cell , ĠDefault Edge > Ġ= ĠB read th First Iterator ( graph , ĠcurrentNode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġseen Un wrapped Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnode : ĠBoard Cell ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( board Cell Ġin Ġb fs Iterator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( seen Un wrapped ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseen Un wrapped Ġ= Ġ! game State . node State ( board Cell . point ). is Wrapped ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġboard Cell ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanalyze Ġ= ĠShort est Path Using Di jk stra . analyze ( game State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshortest Path Algorithm Ġ= Ġanalyze ( robot Id , Ġgame State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Step Ġ= Ġshortest Path Algorithm . getPath ( currentNode , Ġnode ). vertex List . drop ( 1 ). first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Point . action To Get To Neighbor ( first Step . point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ