예제 #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);
        }
예제 #2
0
        public void FindLargestMagnitude()
        {
            var largestMagnitude = 0;

            foreach (var number in _numbers)
            {
                for (var index = 0; index < _numbers.Count; index++)
                {
                    if (number == _numbers[index])
                    {
                        continue;
                    }

                    var calculator = new SnailFishNumberCalculator($"{number}\n{_numbers[index]}");
                    calculator.AddNumbers();
                    var magnitude = calculator.Result.GetMagnitude();

                    if (magnitude > largestMagnitude)
                    {
                        largestMagnitude = magnitude;
                        Result           = calculator.Result;
                    }
                }
            }
        }
예제 #3
0
        public void ExplodeSnailFishNumbersCorrectly(string number, SnailFishNumber expectedNumber)
        {
            var parser = new SnailFishNumberParser(number);
            var value  = parser.Value;

            var sut = new SnailFishNumberExploder(value).Apply();

            Assert.Equal(expectedNumber, sut);
        }
예제 #4
0
        public SnailFishNumberSplitter(SnailFishNumber value)
        {
            _value = value;

            var visitor = new SplitterScannerVisitor();

            value.Accept(visitor);

            _canReduce = visitor.MustSplit();
            _snailFishNumberToSplit = visitor.SnailFishNumberToSplit;
        }
예제 #5
0
        public SnailFishNumberExploder(SnailFishNumber value)
        {
            _value = value;

            var visitor = new ExploderScannerVisitor();

            _value.Accept(visitor);

            _canReduce                = visitor.MustExplode();
            _deepestSnailNumber       = visitor.DeepestSnailNumber;
            _deepestSnailNumberParent = visitor.DeepestSnailNumberParent;
        }
예제 #6
0
        public SnailFishNumberCalculator(string homework)
        {
            if (string.IsNullOrWhiteSpace(homework))
            {
                throw new ArgumentException("Invalid homework");
            }

            _numbers  = new List <SnailFishNumber>();
            _homework = homework;

            Parse();

            Result = _numbers[0];
        }
예제 #7
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;
        }
 private void Parse() => Value = (SnailFishNumber)ParseNumber();
 public ReduceByExplosionVisitor(SnailFishNumber deepestFishNumber) =>
 public void Visit(SnailFishNumber snailFishNumber)
 {
 }
        public void BeInitializedCorrectly(string homework, SnailFishNumber expectedNumber)
        {
            var sut = new SnailFishNumberCalculator(homework);

            Assert.Equal(expectedNumber, sut.Result);
        }