Esempio n. 1
0
        public SnailFishNumber Apply()
        {
            var visitor = new ReduceBySplittingVisitor(_snailFishNumberToSplit);

            _value.Accept(visitor);
            _snailFishNumberToSplitParent = visitor.SnailFishNumberToSplitParent;

            if (_snailFishNumberToSplitParent.LeftSide == _snailFishNumberToSplit)
            {
                _snailFishNumberToSplitParent.LeftSide = new SnailFishNumber(
                    new RegularNumber((int)Math.Floor(_snailFishNumberToSplit.Value / 2.0)),
                    new RegularNumber((int)Math.Ceiling(_snailFishNumberToSplit.Value / 2.0)));
            }
            else
            {
                _snailFishNumberToSplitParent.RightSide = new SnailFishNumber(
                    new RegularNumber((int)Math.Floor(_snailFishNumberToSplit.Value / 2.0)),
                    new RegularNumber((int)Math.Ceiling(_snailFishNumberToSplit.Value / 2.0)));
            }

            var orderVisitor = new ReorderRegularNumberVisitor();

            _value.Accept(orderVisitor);

            return(_value);
        }
Esempio n. 2
0
        public SnailFishNumber Apply()
        {
            _value.Accept(new ReduceByExplosionVisitor(_deepestSnailNumber));
            _deepestSnailNumberParent.ReplaceSideWith(_deepestSnailNumber, 0.AsNumber());

            var visitor = new ReorderRegularNumberVisitor();

            _value.Accept(visitor);

            return(_value);
        }
Esempio n. 3
0
        public void AddNumbers()
        {
            var result = _numbers[0];

            foreach (var operand in _numbers.Skip(1))
            {
                bool reduced = false;
                var  sum     = new SnailFishNumber(result, operand);

                var visitor = new ReorderRegularNumberVisitor();
                sum.Accept(visitor);

                do
                {
                    reduced = false;

                    var exploder = new SnailFishNumberExploder(sum);
                    if (exploder.CanReduce())
                    {
                        sum     = exploder.Apply();
                        reduced = true;
                    }
                    else
                    {
                        var splitter = new SnailFishNumberSplitter(sum);
                        if (splitter.CanReduce())
                        {
                            sum     = splitter.Apply();
                            reduced = true;
                        }
                    }
                }while (reduced);

                result = sum;
            }

            Result = result;
        }