Unable to load image

The luckiest of days, Day 13!!

Let's fricking gooo!

17
Jump in the discussion.

No email address required.

[[[ packets ]]] :marseycapymerchant:

https://wtools.io/paste-code/bHYu

namespace AOC2022.Puzzles;

public class Day13 : IPuzzle
{
	private readonly string[] _linesFromFile;

	public Day13(string[] linesFromFile)
	{
		_linesFromFile = linesFromFile;
	}

	public void SolveFirstPuzzle()
	{
		var initialScore = 0;
		for (var index = 0; index < _linesFromFile.Length; index += 3)
		{
			var leftNode = ParseNode(_linesFromFile[index]);
			var rightNode = ParseNode(_linesFromFile[index + 1]);
			if (CompareNodes(leftNode, rightNode) < 0)
				initialScore += index / 3 + 1;
		}

		Console.WriteLine($"Part 1 answer: {initialScore}");
	}

	public void SolveSecondPuzzle()
	{
		var packets = new List<PacketNode>();
		for (var index = 0; index < _linesFromFile.Length; index += 3)
		{
			var left = ParseNode(_linesFromFile[index]);
			var right = ParseNode(_linesFromFile[index + 1]);
			packets.Add(right);
			packets.Add(left);
		}

		const string t2 = "[[2]]";
		const string t6 = "[[6]]";
		packets.Add(ParseNode(t2));
		packets.Add(ParseNode(t6));
		packets.Sort(CompareNodes);

		var initialScore = 1;
		for (var i = 0; i < packets.Count; i++)
			if (packets[i]._stringValue is "[[2]]" or "[[6]]")
				initialScore *= i + 1;
		Console.WriteLine($"Part 2 answer: {initialScore}");
	}

	private class PacketNode
	{
		public bool _isANumber;
		public string? _stringValue;
		public int _value;
		public readonly List<PacketNode> _childNodes = new();

		public override string ToString()
		{
			return _isANumber ? $"N: {_value}" : $"Ch: {_childNodes.Count}";
		}
	}

	private static int CompareNodes(PacketNode leftPacketNode, PacketNode rightPacketNode)
	{
		switch (leftPacketNode._isANumber)
		{
			case true when rightPacketNode._isANumber:
			{
				if (leftPacketNode._value < rightPacketNode._value)
					return -1;
				if (leftPacketNode._value > rightPacketNode._value)
					return +1;
				return 0;
			}
			case false when !rightPacketNode._isANumber:
			{
				var i = 0;
				while (true)
				{
					if (i >= leftPacketNode._childNodes.Count && i < rightPacketNode._childNodes.Count)
						return -1;
					if (i >= rightPacketNode._childNodes.Count && i < leftPacketNode._childNodes.Count)
						return +1;
					if (i == rightPacketNode._childNodes.Count && i == leftPacketNode._childNodes.Count)
						return 0;
					var c = CompareNodes(leftPacketNode._childNodes[i], rightPacketNode._childNodes[i]);
					if (c != 0) return c;
					++i;
				}
			}
			case true when !rightPacketNode._isANumber:
			{
				var c = CompareNodes(NumToList(leftPacketNode), rightPacketNode);
				return c != 0 ? c : 0;
			}
		}

		if (leftPacketNode._isANumber || !rightPacketNode._isANumber) return 0;
		{
			var c = CompareNodes(leftPacketNode, NumToList(rightPacketNode));
			return c != 0 ? c : 0;
		}

		PacketNode NumToList(PacketNode n)
		{
			var n1 = new PacketNode();
			n1._childNodes.Add(n);
			return n1;
		}
	}

	private static PacketNode ParseNode(string line)
	{
		var index = 0;
		var p = RecurseThroughNodes(line, ref index);
		p._stringValue = line;
		return p;
	}

	private static PacketNode RecurseThroughNodes(string line, ref int i)
	{
		var packetNode = new PacketNode();
		if (i == 0)
		{
			++i;
		}

		while (true)
		{
			var charAtI = line[i++];
			switch (charAtI)
			{
				case '[':
					packetNode._childNodes.Add(RecurseThroughNodes(line, ref i));
					break;
				case ']':
					return packetNode;
				default:
				{
					if (char.IsDigit(charAtI))
					{
						var val = charAtI - '0';
						while (char.IsDigit(line[i]))
							val = 10 * val + (line[i++] - '0');
						packetNode._childNodes.Add(new PacketNode {_isANumber = true, _value = val});
					}

					break;
				}
			}
		}
	}
}

![](/images/16709136145570378.webp)

Ignore my shit function naming, i thought of one thing and first and then did something diff after

Jump in the discussion.

No email address required.

you're fricking bananas if you think I'm reading all that, take my downkong and shut up idiot

Jump in the discussion.

No email address required.

![](https://media.giphy.com/media/QU3YSdsm2dkLJ2bb0E/giphy.webp)

Jump in the discussion.

No email address required.



Now playing: Lost World Theme (DKC2).mp3

Link copied to clipboard
Action successful!
Error, please refresh the page and try again.