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()); }
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); }
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); }
public Marble(int value) { Value = value; Next = this; Prev = this; }