using System.Collections.Generic;
public const string CENTER_NAME = "COM";
public static void Main()
Universe u = new Universe(TEST_DATA);
int result = Part1(u, false);
Console.WriteLine("Total orbits = " + result);
Console.WriteLine("Distance between YOU and SAN is " + result);
private static int Part1(Universe u, bool verbose)
foreach (Node node in u.universe.Values)
totalDistance += node.DistanceToCenter(verbose);
Console.WriteLine("------------");
Console.WriteLine("total object count (including center) = " + u.universe.Count);
private static int Part2(Universe u, bool verbose)
Node yourObject = u.universe["YOU"].parent;
Node santaObject = u.universe["SAN"].parent;
Node common = u.GetCommonAncestor(yourObject, santaObject);
if (verbose) Console.WriteLine("Found common ancestor: " + common.name);
while (!yourObject.name.Equals(common.name))
yourObject = yourObject.parent;
if (verbose) Console.WriteLine("distance from YOU to " + common.name + " is " + distance1);
while (!santaObject.name.Equals(common.name))
santaObject = santaObject.parent;
if (verbose) Console.WriteLine("distance from SAN to " + common.name + " is " + distance2);
return distance1 + distance2;
public Dictionary<string, Node> universe;
this.center = new Node(CENTER_NAME);
this.universe = new Dictionary<string, Node>();
this.universe.Add(CENTER_NAME, this.center);
public Universe(string[] orbitStrings) : this()
foreach (string orbitString in orbitStrings)
OrbitTuple orbit = new OrbitTuple(orbitString);
public void AddOrbit(OrbitTuple orbit)
if (orbit.orbitingObject.Equals(CENTER_NAME))
Node orbitedObject = this.GetObject(orbit.orbitedObject);
Node orbitingObject = this.GetObject(orbit.orbitingObject);
orbitingObject.parent = orbitedObject;
private Node GetObject(string name)
if (this.universe.ContainsKey(name))
return this.universe[name];
Node obj = new Node(name);
this.universe.Add(name, obj);
public Node GetCommonAncestor(Node object1, Node object2)
var chain = new HashSet<string>();
object1 = object1.parent;
if (chain.Contains(object2.name))
object2 = object2.parent;
return this.name.Equals(CENTER_NAME);
public int DistanceToCenter(bool verbose)
if (this.IsCenter()) return 0;
Node pointer = this.parent;
while (pointer != null && !pointer.IsCenter())
pointer = pointer.parent;
Console.WriteLine(String.Format("object '{0}' has orbit count: {1,3}", this.name, distance));
public string orbitedObject;
public string orbitingObject;
public OrbitTuple(string orbitString)
string[] result = orbitString.Split(')');
this.orbitedObject = result[0];
this.orbitingObject = result[1];
public OrbitTuple(string orbitedObject, string orbitingObject)
this.orbitedObject = orbitedObject;
this.orbitingObject = orbitingObject;
static string[] TEST_DATA_2 = {
static string[] TEST_DATA = {