package Ġcom . jasper van mer le . a oc 2 0 2 0 . day Ċ Ċ import Ġkotlin . math . abs Ċ Ċ class ĠDay 1 2 Ġ: ĠDay (" 1 5 8 9 ", Ġ" 2 3 9 6 0 ") Ġ{ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠInstruction ( val Ġaction : ĠChar , Ġval Ġvalue : ĠInt ) ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠDirection ( val Ġx Modifier : ĠInt , Ġval Ġy Modifier : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠNOR TH ( 0 , Ġ 1 ), ĊĠĠĠĠĠĠĠ ĠE AST ( 1 , Ġ 0 ), ĊĠĠĠĠĠĠĠ ĠS OUT H ( 0 , Ġ- 1 ), ĊĠĠĠĠĠĠĠ ĠW EST (- 1 , Ġ 0 ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġabstract Ġclass ĠShip ( var Ġx : ĠInt , Ġvar Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġapply Instruction ( instruction : ĠInstruction ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Man h att an Distance (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġabs ( x ) Ġ+ Ġabs ( y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠSimple Ship ( x : ĠInt , Ġy : ĠInt , Ġvar Ġdirection : ĠDirection ) Ġ: ĠShip ( x , Ġy ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply Instruction ( instruction : ĠInstruction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( instruction . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' N ' Ġ-> Ġy Ġ+= Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' S ' Ġ-> Ġy Ġ-= Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' E ' Ġ-> Ġx Ġ+= Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' W ' Ġ-> Ġx Ġ-= Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' L ' Ġ-> Ġrotate (- 1 Ġ* Ġ( instruction . value Ġ/ Ġ 9 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' R ' Ġ-> Ġrotate ( instruction . value Ġ/ Ġ 9 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' F ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġdirection . x Modifier Ġ* Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+= Ġdirection . y Modifier Ġ* Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrotate ( steps : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirections Ġ= ĠDirection . values () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġdirections [ Math . floor Mod ( direction . ordinal Ġ+ Ġsteps , Ġdirections . size )] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Simple Ship ( x =$ x , Ġy =$ y , Ġdirection =$ direction )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠAdvanced Ship ( x : ĠInt , Ġy : ĠInt , Ġvar Ġway point X : ĠInt , Ġvar Ġway point Y : ĠInt ) Ġ: ĠShip ( x , Ġy ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply Instruction ( instruction : ĠInstruction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( instruction . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' N ' Ġ-> Ġway point Y Ġ+= Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' S ' Ġ-> Ġway point Y Ġ-= Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' E ' Ġ-> Ġway point X Ġ+= Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' W ' Ġ-> Ġway point X Ġ-= Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' L ' Ġ-> Ġrotate (- instruction . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' R ' Ġ-> Ġrotate ( instruction . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' F ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġway point X Ġ* Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+= Ġway point Y Ġ* Ġinstruction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrotate ( degrees : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrot ations Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġto Ġ( waypoint X Ġto Ġway point Y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 0 Ġto Ġ( waypoint Y Ġto Ġ- waypoint X ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 8 0 Ġto Ġ(- waypoint X Ġto Ġ- waypoint Y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 7 0 Ġto Ġ(- waypoint Y Ġto Ġway point X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Waypoint Ġ= Ġrot ations [( degrees Ġ+ Ġ 3 6 0 ) Ġ% Ġ 3 6 0 ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġway point X Ġ= Ġnew Waypoint . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġway point Y Ġ= Ġnew Waypoint . second ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Advanced Ship ( x =$ x , Ġy =$ y , Ġway point X =$ waypoint X , Ġway point Y =$ waypoint Y )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġinstructions Ġ= Ġget Input () ĊĠĠĠĠĠĠĠ Ġ. lines () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠInstruction ( it [ 0 ], Ġit . substring ( 1 ). toInt ()) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsolve Part One (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġship Ġ= ĠSimple Ship ( 0 , Ġ 0 , ĠDirection . EAST ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( instruction Ġin Ġinstructions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġship . apply Instruction ( instruction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġship . get Man h att an Distance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsolve Part Two (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġship Ġ= ĠAdvanced Ship ( 0 , Ġ 0 , Ġ 1 0 , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( instruction Ġin Ġinstructions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġship . apply Instruction ( instruction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġship . get Man h att an Distance () ĊĠĠĠ Ġ} Ċ } Ċ