示例#1
0
 private NailNumber CheckSplit(ref bool split)
 {
     if (IsNumber)
     {
         if (_value > 9)
         {
             var node = new NailNumber(new NailNumber(_value / 2), new NailNumber((_value + 1) / 2));
             node._left.SetPrevious(_previous);
             _previous?.SetNext(node._left);
             node._right.SetNext(_next);
             _next?.SetPrevious(node._right);
             split = true;
             return(node);
         }
     }
     else
     {
         _left = _left.CheckSplit(ref split);
         if (split)
         {
             return(this);
         }
         _right = _right.CheckSplit(ref split);
     }
     return(this);
 }
示例#2
0
 private NailNumber(NailNumber left, NailNumber right)
 {
     _left  = left;
     _right = right;
     _left.SetNext(_right.Left());
     _right.SetPrevious(_left.Right());
 }
示例#3
0
            private NailNumber CheckExplode(ref bool explode, int depth = 0)
            {
                if (IsNumber)
                {
                    return(this);
                }

                if (depth == 4)
                {
                    // too deep
                    explode = true;
                    var node = new NailNumber(0);
                    if (_left._previous != null)
                    {
                        _left._previous._value += _left._value;
                        node.SetPrevious(_left._previous);
                        _left._previous.SetNext(node);
                    }

                    if (_right._next == null)
                    {
                        return(node);
                    }
                    _right._next._value += _right._value;
                    node.SetNext(_right._next);
                    _right._next.SetPrevious(node);
                    return(node);
                }

                _left  = _left.CheckExplode(ref explode, depth + 1);
                _right = _right.CheckExplode(ref explode, depth + 1);
                return(this);
            }
示例#4
0
 private NailNumber(NailNumber other)
 {
     if (other.IsNumber)
     {
         _value = other._value;
     }
     else
     {
         _left  = new NailNumber(other._left);
         _right = new NailNumber(other._right);
         _left.SetNext(_right.Left());
         _right.SetPrevious(_left.Right());
     }
 }