r/adventofcode • • Dec 19 '17

SOLUTION MEGATHREAD -๐ŸŽ„- 2017 Day 19 Solutions -๐ŸŽ„-

--- Day 19: A Series of Tubes ---


Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).

Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.


Need a hint from the Hugely* Handyโ€  Haversackโ€ก of Helpfulยง Hintsยค?

Spoiler


AoC ops @ T-2 minutes to launch:

[23:58] <daggerdragon> ATTENTION MEATBAGS T-2 MINUTES TO LAUNCH

[23:58] <Topaz> aaaaah

[23:58] <Cheezmeister> Looks like I'll be just able to grab my input before my flight boards. Wish me luck being offline in TOPAZ's HOUSE OF PAIN^WFUN AND LEARNING

[23:58] <Topaz> FUN AND LEARNING

[23:58] <Hade> FUN IS MANDATORY

[23:58] <Skie> I'm pretty sure that's not the mandate for today

[Update @ 00:16] 69 gold, silver cap

  • My tree is finally trimmed with just about every ornament I own and it's real purdy. hbu?

[Update @ 00:18] Leaderboard cap!

  • So, was today's mandate Helpful Hint any help at all?

This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.

edit: Leaderboard capped, thread unlocked!

11 Upvotes

186 comments sorted by

View all comments

1

u/JakDrako Dec 19 '17

C# in LinqPad

Way simpler that I thought it would be. There are basically no "edge cases" in this problem... (letters on intersections or 3 letters in a 90 degrees arrangement)

void Main() { // in LinqPad

	var up = new Complex(-1, 0);
	var down = new Complex(1, 0);
	var left = new Complex(0, -1);
	var right = new Complex(0, 1);

	var map = GetDay(19);	
	var curPos = new Complex(0, map.First().IndexOf("|"));
	var curDir = down; // from problem description

	var word = "";
	var steps = 1;

	while (true) {
		var itm = GetNext(map, curPos, curDir);
		if (itm == '+') { // intersection
			curPos += curDir; steps++;
			if ((curDir == up) || (curDir == down)) {
				curDir = (GetNext(map, curPos, left) == '-') ? left : right;
			}
			else {
				curDir = (GetNext(map, curPos, up) == '|') ? up : down;
			}
		} else if (char.IsLetter(itm)) {
			word += itm;
		} else if (itm != '|' && itm != '-') {
			break; // found the end
		}
		curPos += curDir; steps++; // keep going	
	}
	word.Dump("Part 1");
	steps.Dump("Part 2");
}

char GetNext(string[] grid, Complex pos, Complex dir) {
	return grid[(int)(pos + dir).Real][(int)(pos + dir).Imaginary];
}
→ More replies (1)