package Ġday 1 2 Ċ Ċ import Ġutils . Input Ċ Ċ @ Opt In ( Experimental Std lib Api :: class ) Ċ class ĠDay 1 2 Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠ ĠDay 1 2 (). part 1 () ĊĠĠĠĠĠ ĠDay 1 2 (). part 2 () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġsample Ġ= Ġ""" ĊĠĠĠ Ġstart - A ĊĠĠĠ Ġstart - b ĊĠĠĠ ĠA - c ĊĠĠĠ ĠA - b ĊĠĠĠ Ġb - d ĊĠĠĠ ĠA - end ĊĠĠĠ Ġb - end """. trim Indent (). split ("\ n "). filter Ġ{ Ġit . isNotBlank () Ġ} ĊĊĠ Ġval Ġsample 2 Ġ= Ġ""" ĊĠĠĠ Ġdc - end ĊĠĠĠ ĠH N - start ĊĠĠĠ Ġstart - kj ĊĠĠĠ Ġdc - start ĊĠĠĠ Ġdc - HN ĊĠĠĠ ĠLN - dc ĊĠĠĠ ĠH N - end ĊĠĠĠ Ġk j - sa ĊĠĠĠ Ġk j - HN ĊĠĠĠ Ġk j - dc """. trim Indent (). split ("\ n "). filter Ġ{ Ġit . isNotBlank () Ġ} ĊĊĠ Ġval Ġsample 3 Ġ= Ġ""" ĊĠĠĠ Ġfs - end ĊĠĠĠ Ġhe - DX ĊĠĠĠ Ġfs - he ĊĠĠĠ Ġstart - DX ĊĠĠĠ Ġpj - DX ĊĠĠĠ Ġend - zg ĊĠĠĠ Ġz g - sl ĊĠĠĠ Ġz g - pj ĊĠĠĠ Ġpj - he ĊĠĠĠ ĠRW - he ĊĠĠĠ Ġfs - DX ĊĠĠĠ Ġpj - RW ĊĠĠĠ Ġz g - RW ĊĠĠĠ Ġstart - pj ĊĠĠĠ Ġhe - WI ĊĠĠĠ Ġz g - he ĊĠĠĠ Ġpj - fs ĊĠĠĠ Ġstart - RW """. trim Indent (). split ("\ n "). filter Ġ{ Ġit . isNotBlank () Ġ} ĊĊĠ Ġprivate Ġfun Ġget Input ( use Real Input : ĠBoolean ): ĠList < String > Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= Ġif Ġ( use Real Input ) Ġ{ ĊĠĠĠĠĠ ĠInput . read As Lines (" 1 2 ") Ġ Ġ// Ġ< ====== ĠTODO ĠSet Ġthe Ġday Ġnumber !!!! ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġsample 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġinput ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġpart 1 () Ġ{ ĊĠĠĠ Ġval Ġinputs Ġ= Ġget Input ( use Real Input Ġ= Ġtrue ) ĊĊĠĠĠ Ġval Ġgraph Ġ= Ġcreate Graph ( inputs ) ĊĊĠĠĠ Ġval Ġpaths Ġ= Ġget Tra vers als ( graph , Ġused Small C ave Exception Ġ= Ġtrue ) ĊĠĠĠ Ġprintln ( paths . size ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġpart 2 () Ġ{ ĊĠĠĠ Ġval Ġinputs Ġ= Ġget Input ( use Real Input Ġ= Ġtrue ) ĊĊĠĠĠ Ġval Ġgraph Ġ= Ġcreate Graph ( inputs ) ĊĊĠĠĠ Ġval Ġpaths Ġ= Ġget Tra vers als ( graph , Ġused Small C ave Exception Ġ= Ġfalse ) ĊĠĠĠ Ġprintln ( paths . size ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Graph ( inputs : ĠList < String >): ĠMap < String , ĠList < String >> Ġ{ ĊĠĠĠ Ġreturn Ġinputs . map Ġ{ Ġline Ġ-> ĊĠĠĠĠĠ Ġparse Line ( line ) ĊĠĠĠ Ġ}. flatMap Ġ{ Ġp Ġ-> ĊĠĠĠĠĠ Ġif Ġ( p . first Ġ== Ġ" start " Ġ|| Ġp . second Ġ== Ġ" end ") Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( p ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( p , Ġp . second Ġto Ġp . first ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. groupBy ( key Selector Ġ= Ġ{ Ġit . first Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Transform Ġ= Ġ{ Ġit . second Ġ}) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġparse Line ( line : ĠString ): ĠPair < String , ĠString > Ġ= ĊĠĠĠ Ġline . split ("- "). let Ġ{ Ġit . first () Ġto Ġit . last () Ġ} ĊĊĠ Ġprivate Ġfun Ġget Tra vers als ( ĊĠĠĠ Ġgraph : ĠMap < String , ĠList < String >>, ĊĠĠĠ Ġnode : ĠString Ġ= Ġ" start ", ĊĠĠĠ Ġused : ĠList < String > Ġ= ĠlistOf (" start "), ĊĠĠĠ Ġused Small C ave Exception : ĠBoolean Ġ= Ġfalse ĊĠ Ġ): ĠList < List < String >> Ġ{ ĊĠĠĠ Ġif Ġ( node Ġ== Ġ" end ") Ġ{ ĊĠĠĠĠĠ Ġreturn ĠlistOf ( used ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġchildren Ġ= Ġgraph [ node ] Ġ?: Ġthrow ĠException (" No Ġsuch Ġnode : Ġ$ node ") ĊĊĠĠĠ Ġreturn ĠgetNext Nodes ( children , Ġused , Ġused Small C ave Exception ). flatMap Ġ{ ĠnewNode Ġ-> ĊĠĠĠĠĠ Ġval Ġused Exception Ġ= Ġif Ġ( used Small C ave Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġused Small C ave Exception ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( new Node Ġ== Ġ" end " Ġ|| ĠnewNode . is UpperCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġused Small C ave Exception ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠnewNode Ġin Ġused ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġnew Used Ġ= Ġused . to Mutable List (). also Ġ{ Ġit . add ( new Node ) Ġ} ĊĠĠĠĠĠ Ġget Tra vers als ( graph , ĠnewNode , Ġnew Used , Ġused Exception ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠgetNext Nodes ( ĊĠĠĠ Ġchildren : ĠList < String >, ĊĠĠĠ Ġused : ĠList < String >, ĊĠĠĠ Ġused Small C ave Exception : ĠBoolean , ĊĠ Ġ) Ġ= Ġchildren ĊĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it Ġ== Ġ" start " Ġ|| Ġit Ġ== Ġ" end ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit Ġ== Ġ" end " ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . is UpperCase ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! used Small C ave Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit Ġ! in Ġused ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. sorted () Ċ } Ċ Ċ private Ġfun ĠString . is UpperCase (): ĠBoolean Ġ{ ĊĠ Ġreturn Ġuppercase () Ġ== Ġthis Ċ } Ċ