Пример #1
0
        public SnailNum Add(SnailNum other)
        {
            var newHead = Token.GetToken('[');
            var comma   = Token.GetToken(',');
            var close   = Token.GetToken(']');

            newHead.Right = _head;
            _head.Left    = newHead;

            var tail = _head.Tail();

            tail.Right = comma;
            comma.Left = tail;

            comma.Right      = other._head;
            other._head.Left = comma;

            tail       = other._head.Tail();
            tail.Right = close;
            close.Left = tail;

            var newSN = new SnailNum(newHead);

            newSN.Reduce();

            return(newSN);
        }
Пример #2
0
        public ulong Magnitiude()
        {
            var sn = new SnailNum(this.ToString());

            while (true)
            {
                var n = sn._head;

                if (IsSimplePair(n) && n.Left == null)
                {
                    return(n.Right.Val * 3 + n.Right.Right.Right.Val * 2);
                }

                while (n.Right != null)
                {
                    if (IsSimplePair(n))
                    {
                        var left  = n.Right.Val;
                        var right = n.Right.Right.Right.Val;
                        var m     = n.Right;
                        m.Val        = left * 3 + right * 2;
                        n.Left.Right = m;
                        m.Right      = n.Right.Right.Right.Right.Right; // perfectly ordinary double linked list code...
                    }
                    n = n.Right;
                }
            }
        }
Пример #3
0
        void DoSplit(Token t)
        {
            float tval     = t.Val;
            int   leftVal  = (int)Math.Floor(tval / 2);
            int   rightVal = (int)Math.Ceiling(tval / 2);

            var newPair = new SnailNum($"[{(char)(leftVal +'0')},{(char)(rightVal +'0')}]");

            t.Left.Right       = newPair._head;
            newPair._head.Left = t.Left;
            var tail = newPair._head.Tail();

            tail.Right      = t.Right;
            tail.Right.Left = tail;
        }
Пример #4
0
        public void Solve()
        {
            var lines = File.ReadAllLines("inputs/day18.txt");
            var res   = new SnailNum(lines[0]);

            for (int j = 1; j < lines.Length; j++)
            {
                res = res.Add(new SnailNum(lines[j]));
            }
            Console.WriteLine($"P1: {res.Magnitiude()}");

            ulong greatest = 0;

            for (int j = 0; j < lines.Length - 1; j++)
            {
                for (int k = j + 1; k < lines.Length - 2; k++)
                {
                    var sn0 = new SnailNum(lines[j]);
                    var sn1 = new SnailNum(lines[k]);
                    try
                    {
                        ulong mn = sn0.Add(sn1).Magnitiude();
                        if (mn > greatest)
                        {
                            greatest = mn;
                        }
                        sn0 = new SnailNum(lines[j]);
                        sn1 = new SnailNum(lines[k]);
                        mn  = sn1.Add(sn0).Magnitiude();
                        if (mn > greatest)
                        {
                            greatest = mn;
                        }
                    }
                    catch (Exception)
                    {
                        Console.WriteLine($"{j}, {k}");
                        Console.WriteLine(sn0);
                        Console.WriteLine(sn1);
                    }
                }
            }
            Console.WriteLine($"P2: {greatest}");
        }