public void Visit(RegularNumber regularNumber)
        {
            _currentNumber = regularNumber;

            if (_currentNumber.Value >= 10 && SnailFishNumberToSplit is null)
            {
                SnailFishNumberToSplit = _currentNumber;
            }
        }
Beispiel #2
0
        public SnailFishNumberSplitter(SnailFishNumber value)
        {
            _value = value;

            var visitor = new SplitterScannerVisitor();

            value.Accept(visitor);

            _canReduce = visitor.MustSplit();
            _snailFishNumberToSplit = visitor.SnailFishNumberToSplit;
        }
Beispiel #3
0
 public ReduceBySplittingVisitor(RegularNumber numberToSplit) =>
 public void Visit(RegularNumber regularNumber) =>
 regularNumber.ReorderTo(_order++);
Beispiel #5
0
    public SnailfishNumber Reduce()
    {
        var  infoList = Traverse().ToList();
        bool done     = false;

        while (!done)
        {
            done = true;
            for (int i = 0; i < infoList.Count; i++)
            {
                var info = infoList[i];
                if (info.ShouldExplode)
                {
                    var left      = infoList[i - 1];
                    var right     = infoList[i + 1];
                    var newNumber = new RegularNumber(0);
                    if (info.IsRightChild)
                    {
                        info.Parent !.Right = newNumber;
                    }
                    else
                    {
                        info.Parent !.Left = newNumber;
                    }
                    if (i - 3 >= 0)
                    {
                        infoList[i - 3].Value !.Number += left.Value !.Number;
                    }
                    if (i + 3 < infoList.Count)
                    {
                        infoList[i + 3].Value !.Number += right.Value !.Number;
                    }
                    info.Value = newNumber;
                    infoList.RemoveAt(i + 1);
                    infoList.RemoveAt(i - 1);
                    done = false;
                }
            }
            for (int i = 0; i < infoList.Count; i++)
            {
                var info = infoList[i];
                if (info.ShouldSplit)
                {
                    int value     = info.Value !.Number;
                    var left      = new RegularNumber(value / 2);
                    var right     = new RegularNumber(value - left.Number);
                    var splitPair = new Pair(left, right);
                    if (info.IsRightChild)
                    {
                        info.Parent !.Right = splitPair;
                    }
                    else
                    {
                        info.Parent !.Left = splitPair;
                    }
                    infoList.RemoveAt(i);
                    infoList.Insert(i, new SnailfishNumberInfo(right, splitPair, info.Depth + 1, true));
                    infoList.Insert(i, new SnailfishNumberInfo(null, info.Parent, info.Depth, info.IsRightChild));
                    infoList.Insert(i, new SnailfishNumberInfo(left, splitPair, info.Depth + 1, false));
                    done = false;
                    break;
                }
            }
        }
        return(this);
    }