public PairNumber(SnailfishNumber left, SnailfishNumber right) { Left = left; Right = right; left.Parent = this; right.Parent = this; }
SnailfishNumber ParseArray(ReadOnlySpan <char> line) { var number = new SnailfishNumber(); var start = number; foreach (var c in line) { if (c == '[') { number.X = new SnailfishNumber { Parent = number }; number.Y = new SnailfishNumber { Parent = number }; number = number.X; } else if (c == ']') { number = number !.Parent !; } else if (c == ',') { number = number !.Parent !.Y !; } else { number.Value = c - '0'; } } return(start); }
public void Part1() { SnailfishNumber number = ReadNumbersFromFile().Aggregate((left, right) => SnailfishNumber.Add(left, right)); int result = number.ComputeMagnitude(); Assert.Equal(3216, result); }
internal SnailfishNumber Clone(SnailfishNumber parent = null) { SnailfishNumber number = new SnailfishNumber(); number.Value = Value; number.Left = Left?.Clone(number); number.Right = Right?.Clone(number); number.Parent = parent; return(number); }
internal static SnailfishNumber Add(SnailfishNumber left, SnailfishNumber right) { if (left.Parent != null || right.Parent != null) { throw new Exception(); } SnailfishNumber result = new SnailfishNumber(); result.Left = left; result.Right = right; left.Parent = result; right.Parent = result; result.Reduce(); return(result); }
public void Part2() { int maxMagnitude = 0; List <SnailfishNumber> numbers = ReadNumbersFromFile(); foreach (SnailfishNumber n1 in numbers) { foreach (SnailfishNumber n2 in numbers) { if (n1 != n2) { int magnitude = SnailfishNumber.Add(n1.Clone(), n2.Clone()).ComputeMagnitude(); maxMagnitude = Math.Max(maxMagnitude, magnitude); } } } Assert.Equal(4643, maxMagnitude); }
internal static SnailfishNumber Parse(string input, SnailfishNumber parent = null) { if (input.StartsWith('[')) { (string left, string right) = GetComponents(input.Substring(1, input.Length - 2)); SnailfishNumber number = new SnailfishNumber(); number.Left = Parse(left, number); number.Right = Parse(right, number); number.Parent = parent; return(number); } return(new SnailfishNumber() { Value = int.Parse(input), Parent = parent, }); }
private SnailfishNumber GetNextNumber(SnailfishNumber requestingChild) { if (requestingChild == Right) { return((Parent != null) ? Parent.GetNextNumber(this) : null); } if (requestingChild == Left) { SnailfishNumber next = Right; while (next.Value == null) { next = next.Left; } return(next); } throw new Exception(); }
private bool Explode(int depth = 0) { if (Value == null) { if (Left.Explode(depth + 1)) { return(true); } if (depth >= 4 && Left.Value != null && Right.Value != null) { SnailfishNumber previous = Parent.GetPreviousNumber(this); if (previous != null) { previous.Value += Left.Value; } SnailfishNumber next = Parent.GetNextNumber(this); if (next != null) { next.Value += Right.Value; } Left = null; Right = null; Value = 0; return(true); } if (Right.Explode(depth + 1)) { return(true); } } return(false); }
private bool Split() { if (Value == null) { if (Left.Split()) { return(true); } if (Right.Split()) { return(true); } } else if (Value.Value >= 10) { int mod = Value.Value % 2; int div = Value.Value / 2; Left = new SnailfishNumber() { Value = div, Parent = this, }; Right = new SnailfishNumber() { Value = div + mod, Parent = this, }; Value = null; return(true); } return(false); }
public static SnailfishNumber operator +(SnailfishNumber a, SnailfishNumber b) { var newNumber = new SnailfishNumber { X = a, Y = b, }; newNumber.X !.Parent = newNumber; newNumber.Y !.Parent = newNumber; #if DEBUG Console.WriteLine($"after addition: {newNumber}"); #endif while (true) { if (newNumber.Explode()) { #if DEBUG Console.WriteLine($"after explode: {newNumber}"); #endif continue; } if (!newNumber.Split()) { break; } #if DEBUG Console.WriteLine($"after split: {newNumber}"); #endif } return(newNumber); }
public void Snailfish_Magnitude(string input, int expected) { int actual = new SnailfishNumber(input).Magnitude; Assert.Equal(expected, actual); }
public void Snailfish_Explode(string input, string expected) { string actual = SnailfishNumber.Explode(input); Assert.Equal(expected, actual); }
public void Snailfish_Addition(string lho, string rho, string expected) { SnailfishNumber actual = new SnailfishNumber(lho) + new SnailfishNumber(rho); Assert.Equal(expected, actual.Number); }
private List <SnailfishNumber> ReadNumbersFromFile() { return(File.ReadAllLines("Day18Input.txt") .Select(line => SnailfishNumber.Parse(line)) .ToList()); }
public Pair(SnailfishNumber left, SnailfishNumber right) { Left = left; Right = right; }