public bool Split() { if (IsLeaf() && value >= 10) { left = new SnailNode(value / 2); right = new SnailNode((value / 2) + (value % 2)); value = 0; return(true); } else if (IsLeaf()) { return(false); } else { return(left.Split() || right.Split()); } }
public SnailNode(Queue <char> queue) { if (queue.Peek() == '[') { queue.Dequeue(); left = new SnailNode(queue); queue.Dequeue(); right = new SnailNode(queue); queue.Dequeue(); } else { String toParse = ""; while (queue.Peek() != ',' && queue.Peek() != ']') { toParse += queue.Dequeue(); } value = Int32.Parse(toParse); } }
public bool ExplodeHelper(List <Tuple <SnailNode, SnailDirection> > parents) { if (parents.Count == 5 && !IsLeaf()) { int leftadd = left.value; int i = 4; for (; i >= 0; i--) { if (parents[i].Item2 == SnailDirection.RIGHT) { break; } } if (i != -1) { SnailNode start = parents[i].Item1.left; while (!start.IsLeaf()) { start = start.right; } start.value += leftadd; } int rightadd = right.value; i = 4; for (; i >= 0; i--) { if (parents[i].Item2 == SnailDirection.LEFT) { break; } } if (i != -1) { SnailNode start = parents[i].Item1.right; while (!start.IsLeaf()) { start = start.left; } start.value += rightadd; } left = null; right = null; value = 0; return(true); } else if (IsLeaf()) { return(false); } else { List <Tuple <SnailNode, SnailDirection> > pleft = new List <Tuple <SnailNode, SnailDirection> >(parents.ToArray()); List <Tuple <SnailNode, SnailDirection> > pright = new List <Tuple <SnailNode, SnailDirection> >(parents.ToArray()); pleft.Add(new Tuple <SnailNode, SnailDirection>(this, SnailDirection.LEFT)); pright.Add(new Tuple <SnailNode, SnailDirection>(this, SnailDirection.RIGHT)); return(left.ExplodeHelper(pleft) || right.ExplodeHelper(pright)); } }
public SnailNode(SnailNode left, SnailNode right) { this.left = left; this.right = right; }
public SnailNode Add(SnailNode sn) { return(new SnailNode(this, sn)); }