package Ġcom . no hex . a oc . day 1 2 Ċ Ċ const Ġval ĠSTART _ NAME Ġ= Ġ" start " Ċ const Ġval ĠEND _ NAME Ġ= Ġ" end " Ċ Ċ class ĠC ave Map ( input : ĠSequence < String >) Ġ{ ĊĠĠĠ Ġval Ġpath Count : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget Paths Ġ{ Ġpath , Ġcave Ġ-> Ġpath . can Visit ( c ave ) Ġ}. count () ĊĠĠĠ Ġval Ġlong Path Count : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget Paths Ġ{ Ġpath , Ġcave Ġ-> Ġpath . can Visit Tw ice ( c ave ) Ġ}. count () ĊĊĠĠĠ Ġprivate Ġval Ġc aves : ĠSet < C ave > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġa Ġdictionary Ġat Ġbuild Ġtime Ġfor Ġspeed . ĊĠĠĠĠĠĠĠ Ġval Ġtemp Places Ġ= Ġmutable Map Of < String , ĠC ave >() ĊĠĠĠĠĠĠĠ Ġ// ĠEach Ġline Ġin Ġthe Ġinput Ġis Ġa Ġpath Ġbetween Ġtwo Ġvertices . ĊĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( place A Name , Ġplace B Name ) Ġ= Ġline . split ("- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġor Ġcreate Ġthe Ġnodes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcave A Ġ= Ġtemp Places [ place A Name ] Ġ?: ĠC ave ( place A Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcave B Ġ= Ġtemp Places [ place B Name ] Ġ?: ĠC ave ( place B Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLink Ġboth Ġplaces . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcave A . connect To ( c ave B ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthe Ġnew Ġplaces Ġare Ġin Ġthe Ġdictionary . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Places [ place A Name ] Ġ= Ġcave A ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Places [ place B Name ] Ġ= Ġcave B ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġc aves Ġ= Ġtemp Places . values . toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġall Ġpaths Ġfrom Ġthe Ġstart Ġcave . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Paths ( visit able Condition : Ġ( Path , ĠC ave ) Ġ-> ĠBoolean ): ĠList < Path > Ġ= ĊĠĠĠĠĠĠĠ Ġc aves . find Ġ{ Ġit . is Start Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfollow Paths ( it , ĠPath (), Ġvisit able Condition ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġall Ġpaths Ġto Ġ[ c ave ]' s Ġconnections . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfollow Paths ( ĊĠĠĠĠĠĠĠ Ġcave : ĠC ave , ĊĠĠĠĠĠĠĠ Ġpath : ĠPath , ĊĠĠĠĠĠĠĠ Ġvisit able Condition : Ġ( Path , ĠC ave ) Ġ-> ĠBoolean ĊĠĠĠ Ġ): ĠList < Path > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġcurrent Ġplace Ġto Ġthe Ġpath . ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Path Ġ= ĠPath ( path . c aves Ġ+ Ġcave ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthere Ġare Ġno Ġmore Ġconnections , Ġreturn Ġthe Ġpath Ġso Ġfar . ĊĠĠĠĠĠĠĠ Ġif Ġ( c ave . connections . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( current Path ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġexplore Ġthe Ġconnections . ĊĠĠĠĠĠĠĠ Ġreturn Ġcave . connections ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFollow Ġall Ġvisit able Ġpaths Ġfrom Ġthis Ġplace . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġvisit able Condition ( path , Ġcave ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew Ġpath Ġfor Ġeach Ġconnection . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġfollow Paths ( it , Ġcurrent Path , Ġvisit able Condition ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ