import Ġjava . io .* Ċ fun Ġprint _ day _ 1 7 () Ġ{ ĊĠĠĠ Ġval Ġyellow Ġ= Ġ"\ u 0 0 1 B [ 3 3 m " ĊĠĠĠ Ġval Ġreset Ġ= Ġ"\ u 0 0 1 b [ 0 m " ĊĠĠĠ Ġval Ġgreen Ġ= Ġ"\ u 0 0 1 B [ 3 2 m " ĊĠĠĠ Ġprintln ( yellow Ġ+ Ġ"- ". repeat ( 2 5 ) Ġ+ Ġ" Ad vent Ġof ĠCode Ġ- ĠDay Ġ 1 7 " Ġ+ Ġ"- ". repeat ( 2 5 ) Ġ+ Ġreset ) ĊĠĠĠ Ġprintln ( green ) ĊĠĠĠ Ġval Ġprocess Ġ= ĠRuntime . get Runtime (). exec (" fig let ĠTr ick ĠShot Ġ- c Ġ- f Ġsmall ") ĊĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( InputStream Reader ( process . inputStream )) ĊĠĠĠ Ġreader . forEach Line Ġ{ Ġprintln ( it ) Ġ} ĊĠĠĠ Ġprintln ( reset ) ĊĠĠĠ Ġprintln ( yellow Ġ+ Ġ"- ". repeat ( 3 3 ) Ġ+ Ġ" Output " Ġ+ Ġ"- ". repeat ( 3 3 ) Ġ+ Ġreset Ġ+ Ġ"\ n ") Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġprint _ day _ 1 7 () ĠĊĠĠĠ Ġprintln (" P uzzle Ġ 1 : Ġ${ Day 1 7 (). part _ 1 () }") ĊĠĠĠ Ġprintln (" P uzzle Ġ 2 : Ġ${ Day 1 7 (). part _ 2 () }") ĊĠĠĠ Ġprintln ("\ n " Ġ+ Ġ"\ u 0 0 1 B [ 3 3 m " Ġ+ Ġ" =". repeat ( 7 2 ) Ġ+ Ġ"\ u 0 0 1 b [ 0 m " Ġ+ Ġ"\ n ") Ċ } Ċ Ċ class ĠDay 1 7 Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠBounding Box ( val Ġx Range : ĠInt Range , Ġval Ġy Range : ĠInt Range ) ĊĠĠĠ Ġprivate Ġval Ġtarget Ġ= ĠFile ("../ Input / day 1 7 . txt "). read Lines (). first (). drop ( 1 3 ) ĊĠĠĠĠĠĠĠ Ġ. split (", Ġ"). map Ġ{ Ġit . drop ( 2 ). split (" .. "). let Ġ{ Ġ( a , Ġb ) Ġ-> Ġa . toInt () .. b . toInt () Ġ}} ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠBounding Box ( it [ 0 ], Ġit [ 1 ]) Ġ} ĊĊĊĠĠĠ Ġfun Ġpart _ 1 () Ġ= Ġ( 1 .. 4 0 0 ). flatMap Ġ{ Ġx Ġ-> Ġ( 1 .. 4 0 0 ). map Ġ{ Ġy Ġ-> Ġcheck Step ( x , Ġy , Ġtarget ) Ġ} Ġ}. fold ( 0 ) Ġ{ Ġmax , Ġstep Ġ-> Ġif Ġ( step . first ) Ġmax Of ( max , Ġstep . second ) Ġelse Ġmax Ġ} ĊĠĠĠ Ġfun Ġpart _ 2 () Ġ= Ġ( 1 .. 4 0 0 ). flatMap Ġ{ Ġx Ġ-> Ġ(- 4 0 0 .. 4 0 0 ). map Ġ{ Ġy Ġ-> Ġcheck Step ( x , Ġy , Ġtarget ). first Ġ} Ġ}. count Ġ{ Ġit Ġ} ĊĊĊĠĠĠ Ġdata Ġclass ĠCoord ( var Ġx : Int , Ġvar Ġy : Int ) ĊĠĠĠ Ġdata Ġclass ĠVe locity ( var Ġx : Int , Ġvar Ġy : Int ) ĊĠĠĠ Ġprivate Ġfun Ġcheck Step ( x Velocity : ĠInt , Ġy Velocity : ĠInt , Ġtarget : ĠBounding Box ): ĠPair < Boolean , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠCoord ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= ĠVe locity ( x Velocity , Ġy Velocity ) ĊĠĠĠĠĠĠĠ Ġvar ĠmaxHeight Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġhit Target Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhile Ġ( p . x Ġ<= Ġtarget . x Range . last Ġ&& Ġp . y Ġ>= Ġtarget . y Range . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . x Ġ+= Ġv . x ĠĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . y Ġ+= Ġv . y ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠmaxHeight Ġ= Ġmax Of ( p . y , ĠmaxHeight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p . x Ġin Ġtarget . x Range Ġ&& Ġp . y Ġin Ġtarget . y Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhit Target Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . x Ġ> Ġ 0 ) Ġv . x -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . y -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( hit Target , ĠmaxHeight ) ĊĠĠĠ Ġ} Ċ }