package Ġde . em reak . ad vent of code . days Ċ Ċ import Ġtr . em re one . utils . Logger . logger Ċ import Ġtr . em re one . utils . extensions . Coords Ċ import Ġjava . util . Priority Queue Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ object ĠDay 1 5 Ġ{ ĊĊĠĠĠ Ġclass ĠTra versal ( val Ġlocation : ĠCoord s , Ġval Ġtotal Risk : ĠInt , Ġval Ġtotal Path : ĠList < Coords >) Ġ: ĠComparable < Traversal > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠTra versal ): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . total Risk Ġ- Ġother . total Risk ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠC aver n ( var Ġgrid : ĠArray < IntArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġgrid . size ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġgrid [ 0 ]. size ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( coord : ĠCoord s ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgrid [ coord . second ][ coord . first ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtraverse ( start : ĠCoord s , Ġdestination : ĠCoord s ): ĠTra versal Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Be Evalu ated Ġ= ĠPriority Queue < Traversal >(). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add ( Traversal ( start , Ġ 0 , Ġmutable ListOf ( start ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisited Ġ= Ġmutable Set Of < Coords >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( toBe Evalu ated . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Traversal Ġ= Ġto Be Evalu ated . poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Traversal . location Ġ== Ġdestination ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Traversal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Traversal . location Ġ! in Ġvisited ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited . add ( current Traversal . location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . get Neighbors ( current Traversal . location ). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first Ġin Ġ 0 .. destination . first Ġ&& Ġit . second Ġin Ġ 0 .. destination . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Be Evalu ated . offer ( Traversal ( it , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Traversal . total Risk Ġ+ Ġthis . get ( it ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Traversal . total Path Ġ+ Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" No Ġpath Ġto Ġdestination Ġ( which Ġis Ġreally Ġweird , Ġright ?) ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Neighbors ( location : ĠCoord s ): ĠList < Coords > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbors Ġ= Ġmutable Set Of < Coords >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġneighbors . add ( Coords ( location . first , Ġmax ( 0 , Ġlocation . second Ġ- Ġ 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġneighbors . add ( Coords ( min ( this . width Ġ- Ġ 1 , Ġlocation . first Ġ+ Ġ 1 ), Ġlocation . second )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġneighbors . add ( Coords ( location . first , Ġmin ( this . height Ġ- Ġ 1 , Ġlocation . second Ġ+ Ġ 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġneighbors . add ( Coords ( max ( 0 , Ġlocation . first Ġ- Ġ 1 ), Ġlocation . second )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġneighbors . filter Ġ{ Ġit Ġ!= Ġlocation Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdraw Path ( min Risk Level Path : ĠList < Coords >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Ca ver n . grid . forEach Indexed Ġ{ Ġy , Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . forEach Indexed Ġ{ Ġx , Ġrisk Level Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( min Risk Level Path . contains ( Coords ( x , Ġy ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("[ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( risk Level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ$ risk Level Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġthis . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 1 ( input : ĠList < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgrid Ġ= Ġinput . map Indexed Ġ{ Ġ_, Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . map Indexed Ġ{ Ġ_, Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . digit ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to IntArray () ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġval Ġca ver n Ġ= ĠC aver n ( grid ) ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠCoord s ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= ĠCoord s ( ca ver n . width Ġ- Ġ 1 , Ġca ver n . height Ġ- Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtraversal Ġ= Ġca ver n . traverse ( start , Ġdestination ) ĊĠĠĠĠĠĠĠ Ġca ver n . draw Path ( traversal . total Path ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtraversal . total Risk ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 2 ( input : ĠList < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepeat X Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġval Ġrepeat Y Ġ= Ġ 5 ĊĊĠĠĠĠĠĠĠ Ġval Ġgrid Ġ= Ġinput . map Indexed Ġ{ Ġ_, Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . map Indexed Ġ{ Ġ_, Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . digit ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to IntArray () ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġgrid [ 0 ]. size ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġgrid . size ĊĊĠĠĠĠĠĠĠ Ġval Ġfull Map Ġ= ĠArray ( repeat Y Ġ* Ġheight ) Ġ{ ĠInt Array ( repeat X Ġ* Ġwidth ) Ġ{ Ġ 0 Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrisk Level Ġ= Ġgrid [ y ][ x ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( y Iter Ġin Ġ 0 Ġuntil Ġrepeat Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( x Iter Ġin Ġ 0 Ġuntil Ġrepeat X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġrisk Level Ġ+ Ġy Iter Ġ+ Ġx Iter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Map [ y Iter Ġ* Ġheight Ġ+ Ġy ][ x Iter Ġ* Ġwidth Ġ+ Ġx ] Ġ= Ġif Ġ( newValue Ġ> Ġ 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ- Ġ( newValue Ġ/ Ġ 9 ) Ġ* Ġ 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġca ver n Ġ= ĠC aver n ( full Map ) ĊĠĠĠĠĠĠĠ Ġvar Ġstart Ġ= ĠCoord s ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= ĠCoord s ( ca ver n . width Ġ- Ġ 1 , Ġca ver n . height Ġ- Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtraversal Ġ= Ġca ver n . traverse ( start , Ġdestination ) ĊĠĠĠĠĠĠĠ Ġca ver n . draw Path ( traversal . total Path ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtraversal . total Risk ĊĠĠĠ Ġ} Ċ } Ċ