Ejemplo n.º 1
0
 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());
     }
 }
Ejemplo n.º 2
0
 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);
     }
 }
Ejemplo n.º 3
0
        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));
            }
        }
Ejemplo n.º 4
0
 public SnailNode(SnailNode left, SnailNode right)
 {
     this.left  = left;
     this.right = right;
 }
Ejemplo n.º 5
0
 public SnailNode Add(SnailNode sn)
 {
     return(new SnailNode(this, sn));
 }