package Ġde . di k od am . calendar Ċ Ċ import Ġde . di k od am . Abstract Day Ċ import Ġde . di k od am . Coordinates 2 D Ċ import Ġde . di k od am . calendar . Command Type .* Ċ import Ġde . di k od am . execute Tasks Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Time Ċ fun Ġmain () Ġ{ ĊĠĠĠ ĠDay 0 2 (). execute Tasks () Ċ } Ċ Ċ class ĠDay 0 2 Ġ: ĠAbstract Day () Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= Ġread Input Lines () ĊĠĠĠ Ġoverride Ġfun Ġtask 1 (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . map Ġ{ Ġparse Instruction Task 1 ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( Coordinates 2 D ( 0 , Ġ 0 ), ĠCoordinates 2 D :: plus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġ( horizontal , Ġdepth ) Ġ-> Ġ"${ horizontal Ġ* Ġdepth }" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtask 2 (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . map Ġ{ Ġparse Instruction Task 2 ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( Sub mar ine State ( 0 , Ġ 0 , Ġ 0 ), ĠSub mar ine State :: process ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ Ġ"${ horizontal Ġ* Ġdepth }" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Instruction Task 1 ( instruction Line : ĠString ): ĠCoordinates 2 D Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( direction , Ġcount String ) Ġ= Ġinstruction Line . split ( Regex (" Ġ")) ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcount String . toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" forward " Ġ-> ĠCoordinates 2 D ( count , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" up " Ġ-> ĠCoordinates 2 D ( 0 , Ġ- count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" down " Ġ-> ĠCoordinates 2 D ( 0 , Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" w tf : Ġ$ instruction Line ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Instruction Task 2 ( line : ĠString ): ĠMove Command Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( direction , Ġcount String ) Ġ= Ġline . split ( Regex (" Ġ")) ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcount String . toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" forward " Ġ-> ĠMove Command ( FORWARD , Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" up " Ġ-> ĠMove Command ( UP , Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" down " Ġ-> ĠMove Command ( DOWN , Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" w tf : Ġ$ line ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġenum Ġclass ĠCommand Type Ġ{ ĊĠĠĠ ĠDOWN , ĠUP , ĠFOR WARD Ċ } Ċ Ċ private Ġdata Ġclass ĠMove Command ( val Ġcommand Type : ĠCommand Type , Ġval Ġamount : ĠInt ) Ċ Ċ private Ġdata Ġclass ĠSub mar ine State ( val Ġhorizontal : ĠInt , Ġval Ġdepth : ĠInt , Ġval Ġaim : ĠInt ) Ġ{ ĊĠĠĠ Ġfun Ġprocess ( command : ĠMove Command ): ĠSub mar ine State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( command Type , Ġamount ) Ġ= Ġcommand ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( command Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDOWN Ġ-> Ġthis . copy ( aim Ġ= Ġaim Ġ+ Ġamount ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUP Ġ-> Ġthis . copy ( aim Ġ= Ġaim Ġ- Ġamount ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFOR WARD Ġ-> Ġthis . copy ( horizontal Ġ= Ġhorizontal Ġ+ Ġamount , Ġdepth Ġ= Ġdepth Ġ+ Ġaim Ġ* Ġamount ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ