public void Visit(RegularNumber regularNumber) { _currentNumber = regularNumber; if (_currentNumber.Value >= 10 && SnailFishNumberToSplit is null) { SnailFishNumberToSplit = _currentNumber; } }
public SnailFishNumberSplitter(SnailFishNumber value) { _value = value; var visitor = new SplitterScannerVisitor(); value.Accept(visitor); _canReduce = visitor.MustSplit(); _snailFishNumberToSplit = visitor.SnailFishNumberToSplit; }
public ReduceBySplittingVisitor(RegularNumber numberToSplit) =>
public void Visit(RegularNumber regularNumber) => regularNumber.ReorderTo(_order++);
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); }