private static long Part2(string input) { var cups = Parse(input); var circle = new CupCircle(cups, 1000000); Run(circle, 10000000); var star1 = circle.Next(1); var star2 = circle.Next(star1); return((long)star1 * (long)star2); }
private static void Run(CupCircle circle, int iterations) { var current = circle.Start; for (int i = 0; i < iterations; i++) { var pickup1 = circle.Next(current); var pickup2 = circle.Next(pickup1); var pickup3 = circle.Next(pickup2); var destination = current; do { destination--; if (destination == 0) { destination = circle.Max; } }while (destination == pickup1 || destination == pickup2 || destination == pickup3); circle.Link(current, circle.Next(pickup3)); circle.Link(pickup3, circle.Next(destination)); circle.Link(destination, pickup1); current = circle.Next(current); } }