예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }