import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ class ĠDay 0 2 Ġ{ ĊĠĠĠ Ġenum Ġclass ĠInstruction Ġ{ ĠFOR WARD , ĠUP , ĠDOWN Ġ} ĊĠĠĠ Ġdata Ġclass ĠCommand ( val Ġinstruction : ĠInstruction , Ġval Ġunits : ĠInt ) ĊĠĠĠ Ġdata Ġclass ĠPosition ( val Ġposition : ĠInt , Ġval Ġdepth : ĠInt , Ġval Ġaim : ĠInt ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` run Ġpart Ġ 0 1 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Times Depth Ġ= Ġget Course () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. grouping By Ġ{ Ġit . instruction Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( 0 ) Ġ{ Ġacc , Ġit Ġ-> Ġacc Ġ+ Ġit . units Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . getValue ( Instruction . FORWARD ) Ġ* Ġ( it . getValue ( Instruction . DOWN ) Ġ- Ġit . getValue ( Instruction . UP )) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 6 3 5 9 3 0 , Ġposition Times Depth ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` run Ġpart Ġ 0 2 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Times Depth Ġ= Ġget Course () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( Position ( 0 , Ġ 0 , Ġ 0 )) Ġ{ Ġacc , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPosition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . instruction Ġ== ĠInstruction . FORWARD ) Ġacc . position Ġ+ Ġit . units Ġelse Ġacc . position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . instruction Ġ== ĠInstruction . FORWARD ) Ġacc . depth Ġ+ Ġacc . aim Ġ* Ġit . units Ġelse Ġacc . depth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . instruction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstruction . DOWN Ġ-> Ġacc . aim Ġ+ Ġit . units ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstruction . UP Ġ-> Ġacc . aim Ġ- Ġit . units ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġacc . aim ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . position Ġ* Ġit . depth Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 7 8 1 8 1 9 4 7 8 , Ġposition Times Depth ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Course () Ġ= ĠUtil . getInput As ListOf String (" day 0 2 - input . txt ") ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ("\\ s ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġs Ġ-> ĠCommand ( Instruction . valueOf ( s . first (). uppercase ()), Ġs . last (). toInt ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ }