Esempio n. 1
0
 public PairNumber(SnailfishNumber left, SnailfishNumber right)
 {
     Left         = left;
     Right        = right;
     left.Parent  = this;
     right.Parent = this;
 }
Esempio n. 2
0
    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);
    }
Esempio n. 3
0
        public void Part1()
        {
            SnailfishNumber number = ReadNumbersFromFile().Aggregate((left, right) => SnailfishNumber.Add(left, right));

            int result = number.ComputeMagnitude();

            Assert.Equal(3216, result);
        }
Esempio n. 4
0
            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);
            }
Esempio n. 5
0
            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);
            }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
            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,
                });
            }
Esempio n. 8
0
            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();
            }
Esempio n. 9
0
            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);
            }
Esempio n. 10
0
            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);
            }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
    public void Snailfish_Magnitude(string input, int expected)
    {
        int actual = new SnailfishNumber(input).Magnitude;

        Assert.Equal(expected, actual);
    }
Esempio n. 13
0
    public void Snailfish_Explode(string input, string expected)
    {
        string actual = SnailfishNumber.Explode(input);

        Assert.Equal(expected, actual);
    }
Esempio n. 14
0
    public void Snailfish_Addition(string lho, string rho, string expected)
    {
        SnailfishNumber actual = new SnailfishNumber(lho) + new SnailfishNumber(rho);

        Assert.Equal(expected, actual.Number);
    }
Esempio n. 15
0
 private List <SnailfishNumber> ReadNumbersFromFile()
 {
     return(File.ReadAllLines("Day18Input.txt")
            .Select(line => SnailfishNumber.Parse(line))
            .ToList());
 }
Esempio n. 16
0
 public Pair(SnailfishNumber left, SnailfishNumber right)
 {
     Left  = left;
     Right = right;
 }