Example #1
0
        static Int64 Play(int players, int marbles)
        {
            Marble circle = new Marble(0);

            var d = new Dictionary <int, Int64>();

            for (int i = 0; i < players; i++)
            {
                d[i] = 0;
            }

            for (int marble = 1; marble <= marbles; marble++)
            {
                if (marble % 23 != 0)
                {
                    circle = circle.Rotate(1).Append(marble);
                }
                else
                {
                    int valu;
                    circle = circle.Rotate(-7).Remove(out valu);
                    d[marble % players] += marble + valu;
                }
            }

            return(d.Values.Max());
        }
Example #2
0
        public Marble Append(int v)
        {
            Marble marble = new Marble(v);

            marble.Prev      = this;
            marble.Next      = this.Next;
            marble.Next.Prev = marble;
            this.Next        = marble;

            return(marble);
        }
Example #3
0
        public Marble Rotate(int index)
        {
            Marble m   = this;
            bool   fwd = index > 0;

            index = Math.Abs(index);

            while (index-- > 0)
            {
                m = fwd ? m.Next : m.Prev;
            }

            return(m);
        }
Example #4
0
 public Marble(int value)
 {
     Value = value;
     Next  = this;
     Prev  = this;
 }