From a5ddfacd0edffa6bcafa651ba9a51fffc1a14d86 Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Tue, 20 Dec 2022 18:01:30 +0100 Subject: Day 15 [WIP] --- day15/__init__.py | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/day15/__init__.py b/day15/__init__.py index 38bef35..7b580d9 100644 --- a/day15/__init__.py +++ b/day15/__init__.py @@ -2,8 +2,8 @@ import re from abc import ABC from dataclasses import dataclass, field -from typing import Union from typing import Tuple, Iterator, Set, List +from typing import Union from aoc import BaseAssignment from aoc.datastructures import Coordinate @@ -25,7 +25,9 @@ class Sensor: distance = self.coordinate.manhattan_distance(coordinate) return distance <= self.radius - def x_coordinates_within_radius_at(self, y: int, map: "Map") -> Union[range, list]: + def x_coordinates_within_radius_at( + self, y: int, min_x: int = None, max_x: int = None + ) -> Union[range, list]: coordinate = Coordinate(self.coordinate.x, y) @@ -35,11 +37,25 @@ class Sensor: dy = abs(self.coordinate.y - y) left_over = self.radius - dy + left_x = self.coordinate.x - left_over + right_x = self.coordinate.x + left_over + return range( - max(self.coordinate.x - left_over, map.width[0]), - min(self.coordinate.x + left_over + 1, map.width[-1]), + max(left_x, min_x if min_x is not None else left_x - 1), + min(right_x, max_x if max_x is not None else right_x + 1) + 1, ) + def area_inside(self) -> Set[Coordinate]: + coordinates = set() + + for y in range( + self.coordinate.y - (self.radius - 1), self.coordinate.y + self.radius + ): + for x in self.x_coordinates_within_radius_at(y): + coordinates.add(Coordinate(x, y)) + + return coordinates + @dataclass class Map: @@ -98,7 +114,7 @@ class AssignmentOne(Assignment): x_coordinates = { x for sensor in map.sensors - for x in sensor.x_coordinates_within_radius_at(y, map) + for x in sensor.x_coordinates_within_radius_at(y) } return len(x_coordinates) - len( @@ -107,4 +123,18 @@ class AssignmentOne(Assignment): class AssignmentTwo(Assignment): - pass + example_result = 56000011 + example_kwargs = {"max": 20} + + def run(self, input: Iterator[Tuple[Sensor, Coordinate]], max=4000000): + map = self.create_map(input) + coordinates = {Coordinate(x, y) for x in range(max) for y in range(max)} + + print("Coordinates generated") + + for sensor in map.sensors: + coordinates -= sensor.area_inside() + + distress_beacon = (coordinates - map.beacons).pop() + + return (distress_beacon.x * 4000000) + distress_beacon.y -- cgit v1.2.3