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); }
public SnailFishNumber Apply() { _value.Accept(new ReduceByExplosionVisitor(_deepestSnailNumber)); _deepestSnailNumberParent.ReplaceSideWith(_deepestSnailNumber, 0.AsNumber()); var visitor = new ReorderRegularNumberVisitor(); _value.Accept(visitor); return(_value); }
public SnailFishNumberSplitter(SnailFishNumber value) { _value = value; var visitor = new SplitterScannerVisitor(); value.Accept(visitor); _canReduce = visitor.MustSplit(); _snailFishNumberToSplit = visitor.SnailFishNumberToSplit; }
public SnailFishNumberExploder(SnailFishNumber value) { _value = value; var visitor = new ExploderScannerVisitor(); _value.Accept(visitor); _canReduce = visitor.MustExplode(); _deepestSnailNumber = visitor.DeepestSnailNumber; _deepestSnailNumberParent = visitor.DeepestSnailNumberParent; }
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; }