Day 18: Lavaduct Lagoon
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
You must log in or register to comment.
Python
0.09 line-seconds (third simplest after days 6 and 2).
from .solver import Solver class Day18(Solver): def __init__(self): super().__init__(18) def presolve(self, input: str): self.lines = input.splitlines() def solve_first_star(self): commands = [] for line in self.lines: direction, distance, *_ = line.split(' ') commands.append((direction, int(distance))) return self._solve(commands) def solve_second_star(self): commands = [] for line in self.lines: _, _, command = line.split(' ') distance = int(command[2:-2], 16) direction = ('R', 'D', 'L', 'U')[int(command[-2])] commands.append((direction, distance)) return self._solve(commands) def _solve(self, commands: list[tuple[str, int]]): points: list[tuple[int, int]] = [(0, 0)] perimeter_integer_points = 1 x, y = 0, 0 for direction, distance in commands: dx, dy = {'R': (1, 0), 'L': (-1, 0), 'U': (0, -1), 'D': (0, 1)}[direction] x, y = x + dx * distance, y + dy * distance perimeter_integer_points += distance points.append((x, y)) last_x, last_y = points[-1] perimeter_integer_points += abs(last_x) + abs(last_y) - 1 area_x2 = sum((points[i][1] + points[(i+1) % len(points)][1]) * (points[i][0] - points[(i+1) % len(points)][0]) for i in range(len(points))) interior_integer_points = (area_x2 - perimeter_integer_points) // 2 + 1 return interior_integer_points + perimeter_integer_points
Nim
Decided to go for a polygon approach for part 1 using the Shoelace formula to calculate the area. This meant part 2 only resulted in larger values, no additional computation.
Code runs in <1ms for part 1 and 2 combined
Shoelace formula
This would have been really useful to know about. I’ve committed to a certain level of wheel-reinvention for this event unless I get really stuck, but I’m sure it’ll come up again in the future.
This was actually something I learned for my job, it was nice to be able to apply it here.
I like your commitment to wheel-reinvention, it can be a lot more fun than going for an existing or ‘intended’ approach.