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); }
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; } } }
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; }
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}"); }