import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġedges Ġ= Ġgenerate Edges ("../ input ") ĊĊĠĠĠ Ġprintln (" ===== ĠPart Ġ 1 Ġ=== ==" ) ĊĠĠĠ Ġprintln ( run Part 1 ( edges )) ĊĠĠĠ Ġprintln (" ===== ĠPart Ġ 2 Ġ=== ==" ) ĊĠĠĠ Ġprintln ( run Part 2 ( edges )) Ċ } Ċ Ċ fun Ġrun Part 1 ( edges : ĠMap < String , ĠSet < String >> ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġqueue : ĠDe que < Pair < String , ĠInt >> Ġ= ĠArray Deque () ĊĠĠĠ Ġqueue . add Last ( Pair (" COM ", Ġ 0 )) ĊĊĠĠĠ Ġval Ġqueued Nodes Ġ= Ġmutable Set Of (" COM ") ĊĊĠĠĠ Ġvar ĠnumberOf Or bits Ġ= Ġ 0 ĊĊĠĠĠ Ġwhile Ġ( queue . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( curr Planet , Ġcurr NumberOf Or bits ) Ġ= Ġqueue . remove First () ĊĠĠĠĠĠĠĠ ĠnumberOf Or bits Ġ+= Ġcurr NumberOf Or bits ĊĠĠĠĠĠĠĠ Ġedges [ curr Planet ]?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! queued Nodes . contains ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add Last ( Pair ( it , Ġcurr NumberOf Or bits Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueued Nodes . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠnumberOf Or bits Ċ } Ċ Ċ fun Ġrun Part 2 ( edges : ĠMap < String , ĠSet < String >> ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġcalculate Minimum Orbit al Trans fers ( edges , Ġ" YO U ", Ġ" SAN ") Ċ } Ċ Ċ fun Ġcalculate Minimum Orbit al Trans fers ( edges : ĠMap < String , ĠSet < String >>, Ġsource : ĠString , Ġdestination : ĠString ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġqueue : ĠDe que < String > Ġ= ĠArray Deque () ĊĠĠĠ Ġqueue . add Last ( source ) ĊĊĠĠĠ Ġval Ġqueued Nodes Ġ= Ġmutable Set Of ( source ) ĊĠĠĠ Ġvar ĠnumberOf Orbit al Trans fers Ġ= Ġ- 2 ĊĊĠĠĠ Ġwhile Ġ( queue . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġqueue . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Planet Ġ= Ġqueue . remove First () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Planet Ġ== Ġdestination ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠnumberOf Orbit al Trans fers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedges [ current Planet ]?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! queued Nodes . contains ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add Last ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueued Nodes . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠnumberOf Orbit al Trans fers Ġ+= Ġ 1 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ- 1 Ċ } Ċ Ċ fun Ġgenerate Edges ( path : ĠString ): ĠMap < String , ĠSet < String >> Ġ{ ĊĠĠĠ Ġval Ġedges : ĠMutable Map < String , ĠMutable Set < String >> Ġ= Ġmutable Map Of () ĊĠĠĠ ĠFile ( path ). forEach Line Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( node 1 , Ġnode 2 ) Ġ= Ġextract Edge ( it ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! edges . contains ( node 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedges [ node 1 ] Ġ= Ġmutable Set Of () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġedges [ node 1 ]?. add ( node 2 ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! edges . contains ( node 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedges [ node 2 ] Ġ= Ġmutable Set Of () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġedges [ node 2 ]?. add ( node 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġedges Ċ } Ċ Ċ fun Ġextract Edge ( line : ĠString ): ĠPair < String , ĠString > Ġ{ ĊĠĠĠ Ġval Ġsplit Line Ġ= Ġline . split (" )") ĊĠĠĠ Ġreturn ĠPair ( split Line [ 0 ], Ġsplit Line [ 1 ]) Ċ } Ċ