/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ġby ĠT odd ĠG ins berg Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠAd vent Ġof ĠCode Ġ 2 0 2 1 , ĠDay Ġ 1 2 Ġ- ĠPass age ĠPath ing Ċ Ġ* ĠProblem ĠDescription : Ġhttp :// ad vent of code . com / 2 0 2 1 / day / 1 2 Ċ Ġ* ĠBlog ĠPost / Comment ary : Ġhttps :// tod d . gin s berg . com / post / ad vent - of - code / 2 0 2 1 / day 1 2 / Ċ Ġ*/ Ċ package Ġcom . gin s berg . ad vent 2 0 2 1 Ċ Ċ class ĠDay 1 2 ( input : ĠList < String >) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġc aves : ĠMap < String , ĠList < String >> Ġ= Ġparse Input ( input ) ĊĊĠĠĠ Ġfun Ġsolve Part 1 (): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġtraverse (:: part 1 Visit Rule ). size ĊĊĠĠĠ Ġfun Ġsolve Part 2 (): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġtraverse (:: part 2 Visit Rule ). size ĊĊĠĠĠ Ġprivate Ġfun Ġtraverse ( ĊĠĠĠĠĠĠĠ Ġallowed To Visit : Ġ( String , ĠList < String >) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠ Ġpath : ĠList < String > Ġ= ĠlistOf (" start ") ĊĠĠĠ Ġ): ĠList < List < String >> Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( path . last () Ġ== Ġ" end ") ĠlistOf ( path ) ĊĠĠĠĠĠĠĠ Ġelse Ġc aves . getValue ( path . last ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġallowed To Visit ( it , Ġpath ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraverse ( allowed To Visit , Ġpath Ġ+ Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpart 1 Visit Rule ( name : ĠString , Ġpath : ĠList < String >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġname . is UpperCase () Ġ|| Ġname Ġ! in Ġpath ĊĊĠĠĠ Ġprivate Ġfun Ġpart 2 Visit Rule ( name : ĠString , Ġpath : ĠList < String >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname . is UpperCase () Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ== Ġ" start " Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ! in Ġpath Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . is UpperCase () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. none Ġ{ Ġit . value . size Ġ== Ġ 2 Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . is UpperCase (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġall Ġ{ Ġit . is UpperCase () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Input ( input : ĠList < String >): ĠMap < String , ĠList < String >> Ġ= ĊĠĠĠĠĠĠĠ Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split ("- ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first () Ġto Ġit . last (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . last () Ġto Ġit . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy ({ Ġit . first Ġ}, Ġ{ Ġit . second Ġ}) Ċ } Ċ