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 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; } } } }
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); }
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 SnailFishNumberCalculator(string homework) { if (string.IsNullOrWhiteSpace(homework)) { throw new ArgumentException("Invalid homework"); } _numbers = new List <SnailFishNumber>(); _homework = homework; Parse(); Result = _numbers[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); }