package Ġad vent . of . code . day 1 8 Ċ Ċ import Ġad vent . of . code . day 1 8 . A cre .* Ċ import Ġjava . io . File Ċ Ċ data Ġclass ĠPosition ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ġ: ĠComparable < Position > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠPosition ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcompare By < Position >({ Ġit . y Ġ}, Ġ{ Ġit . x Ġ}). compare ( this , Ġother ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" (${ x . toString (). pad Start ( 3 , Ġ' Ġ') }, ${ y . toString (). pad Start ( 3 , Ġ' Ġ') })" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġup () Ġ= Ġcopy ( y Ġ= Ġy Ġ- Ġ 1 ) ĊĠĠĠ Ġfun Ġdown () Ġ= Ġcopy ( y Ġ= Ġy Ġ+ Ġ 1 ) ĊĠĠĠ Ġfun Ġleft () Ġ= Ġcopy ( x Ġ= Ġx Ġ- Ġ 1 ) ĊĠĠĠ Ġfun Ġright () Ġ= Ġcopy ( x Ġ= Ġx Ġ+ Ġ 1 ) ĊĠĠĠ Ġfun Ġup Left () Ġ= Ġcopy ( x Ġ= Ġx Ġ- Ġ 1 , Ġy Ġ= Ġy Ġ- Ġ 1 ) ĊĠĠĠ Ġfun Ġup Right () Ġ= Ġcopy ( x Ġ= Ġx Ġ+ Ġ 1 , Ġy Ġ= Ġy Ġ- Ġ 1 ) ĊĠĠĠ Ġfun Ġdown Left () Ġ= Ġcopy ( y Ġ= Ġy Ġ+ Ġ 1 , Ġx Ġ= Ġx Ġ- Ġ 1 ) ĊĠĠĠ Ġfun Ġdown Right () Ġ= Ġcopy ( y Ġ= Ġy Ġ+ Ġ 1 , Ġx Ġ= Ġx Ġ+ Ġ 1 ) ĊĊĠĠĠ Ġfun Ġaround () Ġ= ĠlistOf ( up (), Ġdown (), Ġleft (), Ġright (), Ġup Left (), Ġup Right (), Ġdown Left (), Ġdown Right ()) Ċ } Ċ Ċ val Ġinput Ġ= ĠFile (" day 1 8 . txt ") Ċ Ċ enum Ġclass ĠA cre ( val Ġsymbol : ĠChar ) Ġ{ ĊĠĠĠ ĠT RE ES ('| '), ĠL UM BER Y ARD ('# '), ĠOPEN ('.') Ċ } Ċ Ċ class ĠForest Field ( input : ĠFile ) Ġ{ ĊĠĠĠ Ġvar Ġac res Ġ= Ġmap Of < Position , ĠA cre >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġac res Ġ= Ġinput . read Lines (). flatMap Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . map NotNull Ġ{ Ġsymbol Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠPosition ( x ++, Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT RE ES . symbol Ġ-> ĠPair ( pos , ĠT RE ES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL UM BER Y ARD . symbol Ġ-> ĠPair ( pos , ĠL UM BER Y ARD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ Ġy ++ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġaround ( position : ĠPosition ) Ġ= Ġposition . around (). map NotNull Ġ{ Ġac res [ it ] Ġ} ĊĊĠĠĠ Ġfun Ġplots () Ġ= Ġ( 0 .. ( ac res . map Ġ{ Ġit . key . y Ġ}. max () Ġ?: Ġ 0 )). flatMap Ġ{ Ġy Ġ-> ĊĠĠĠĠĠĠĠ Ġ( 0 .. ( ac res . map Ġ{ Ġit . key . x Ġ}. max () Ġ?: Ġ 0 )). map Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠPosition ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( pos , Ġac res [ pos ] Ġ?: ĠOPEN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoutput Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ( 0 .. ( ac res . map Ġ{ Ġit . key . y Ġ}. max () Ġ?: Ġ 0 ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ( 0 .. ( ac res . map Ġ{ Ġit . key . x Ġ}. max () Ġ?: Ġ 0 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ+= Ġ( ac res [ Position ( x , Ġy )] Ġ?: ĠOPEN ). symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ+= Ġ'\ n ' ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġ 1 0 0 0 0 0 0 0 0 0 Ċ Ċ fun Ġpart 1 (): ĠInt Ġ{ ĊĠĠĠ Ġval Ġforest Ġ= ĠForest Field ( input ) ĊĠĠĠ Ġprintln (( 1 .. 1 0 0 0 0 0 0 0 0 0 ). map Ġ{ Ġidx Ġ-> ĊĠĠĠĠĠĠĠ Ġforest . ac res Ġ= Ġforest . plots (). map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . second ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT RE ES Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( forest . around ( it . first ). count Ġ{ Ġnear Ġ-> Ġnear Ġ== ĠL UM BER Y ARD Ġ} Ġ>= Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( it . first , ĠL UM BER Y ARD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL UM BER Y ARD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( forest . around ( it . first ). count Ġ{ Ġnear Ġ-> Ġnear Ġ== ĠL UM BER Y ARD Ġ} Ġ>= Ġ 1 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforest . around ( it . first ). count Ġ{ Ġnear Ġ-> Ġnear Ġ== ĠT RE ES Ġ} Ġ>= Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( it . first , ĠL UM BER Y ARD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( forest . around ( it . first ). count Ġ{ Ġnear Ġ-> Ġnear Ġ== ĠT RE ES Ġ} Ġ>= Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( it . first , ĠT RE ES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġval Ġwood Ġ= Ġforest . plots (). count Ġ{ Ġit . second Ġ== ĠT RE ES Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġy ards Ġ= Ġforest . plots (). count Ġ{ Ġit . second Ġ== ĠL UM BER Y ARD Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ((( idx Ġ- Ġ 1 0 0 0 ) Ġ% Ġ 7 0 0 0 Ġin ĠlistOf ( 6 9 9 9 , Ġ 0 , Ġ 1 ))) Ġprintln ("$ idx Ġ-> Ġ$ wood Ġ-> Ġ$ y ards Ġ-> Ġ${ wood Ġ* Ġy ards }") ĊĠĠĠĠĠĠĠ Ġidx Ġto Ġwood Ġ* Ġy ards ĊĠĠĠ Ġ}. last ()) ĊĠĠĠ Ġreturn Ġforest . plots (). count Ġ{ Ġit . second Ġ== ĠL UM BER Y ARD Ġ} Ġ* Ġforest . plots (). count Ġ{ Ġit . second Ġ== ĠT RE ES Ġ} Ċ }