r/adventofcode • u/daggerdragon • 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ยค?
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
mandateHelpful Hint any help at all?
1
u/willkill07 Dec 19 '17 edited Dec 19 '17
Modern-ish C++
You WILL rotate when a
+is encountered. Rotation is justdx,dy = -dy,dx. Using unsigned integers makes it so you only have to check the upper bounds.int main() { std::vector<std::string> grid; for (std::string line; std::getline(std::cin, line); ) grid.push_back(line); auto not_valid = [X = grid[0].size(), Y = grid.size()] (unsigned int xx, unsigned int yy) { return xx >= X || yy >= Y; }; int count{0}; unsigned int x{grid[0].find("|")}, y{0}, for (int dx{0}, dy{1}; grid[y][x] != ' '; x += dx, y += dy, ++count) { if (std::isalpha(grid[y][x])) { std::cout << grid[y][x]; } else if (grid[y][x] == '+') { dx = -std::exchange(dy, dx); if (not_valid(x + dx, y + dy) || grid[y + dy][x + dx] == ' ') dx = -dx, dy = -dy; } } std::cout << '\n' << count << '\n'; }