Example #1
0
        public string PartTwo()
        {
            var N          = 1000000;
            var cups       = new int[N];
            var highestCup = CupLabels.Max();

            for (var i = 0; i < N; i++)
            {
                if (i < highestCup)
                {
                    cups[i] = CupLabels[i];
                }
                else
                {
                    cups[i] = i + 1;
                }
            }

            var cupCircle = new CupCircle(cups);

            PlayNMoves(cupCircle, N * 10, cupCircle.CupWithLabel(CupLabels[0]), N);

            var cup1 = cupCircle.CupWithLabel(1).Next;
            var cup2 = cup1.Next;

            var result = (Int64)cup1.Label * (Int64)cup2.Label;

            return(result.ToString());
        }
Example #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);
            }
        }
Example #3
0
        private void PlayNMoves(CupCircle cupCircle, int nMoves, Cup firstCup, int highestCupLabel)
        {
            var cup = firstCup;

            for (var move = 0; move < nMoves; move++)
            {
                var pickedUpCups   = cupCircle.PickUpNextThreeCups(cup);
                var pickedUpLabels = new int[3];

                var currentCup = pickedUpCups;
                for (var i = 0; i < 3; i++)
                {
                    pickedUpLabels[i] = currentCup.Label;
                    currentCup        = currentCup.Next;
                }

                var destination = cup.Label > 1 ? cup.Label - 1 : highestCupLabel;
                while (pickedUpLabels.Contains(destination))
                {
                    destination = destination > 1 ? destination - 1 : highestCupLabel;
                }

                var destinationCup = cupCircle.CupWithLabel(destination);
                cupCircle.PlaceCupsAfter(pickedUpCups, destinationCup);

                cup = cup.Next;
            }
        }
Example #4
0
        public object GetResult1()
        {
            Cups = new CupCircle(startingCups);

            RunFor(100);

            return(FormatResult());
        }
Example #5
0
        private static string Part1(string input, int iterations = 100)
        {
            var cups = Parse(input);

            var circle = new CupCircle(cups);

            Run(circle, iterations);

            return(string.Join("", circle.From(1).Skip(1)));
        }
Example #6
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);
        }
Example #7
0
        public string PartOne()
        {
            var cupCircle = new CupCircle(CupLabels);

            PlayNMoves(cupCircle, 100, cupCircle.CupWithLabel(CupLabels[0]), CupLabels.Max());

            var cup    = cupCircle.CupWithLabel(1);
            var labels = "";

            for (var i = 0; i < CupLabels.Length - 1; i++)
            {
                cup     = cup.Next;
                labels += cup.Label.ToString();
            }
            return(labels);
        }
Example #8
0
        public object GetResult2()
        {
            var allCups = new long[1000000];

            for (int n = 0; n < allCups.Length; n++)
            {
                allCups[n] = n + 1;
            }
            for (int n = 0; n < startingCups.Length; n++)
            {
                allCups[n] = startingCups[n];
            }

            Cups = new CupCircle(allCups);

            RunFor(10000000);

            var cup1 = Cups.Cups[0];

            return(cup1.ClockWise.Number * cup1.ClockWise.ClockWise.Number);
        }