From 7af9677207d9ba2b24d662aadd8ed3ba323cfa6f Mon Sep 17 00:00:00 2001 From: Sijmen Schoon Date: Thu, 6 Dec 2018 12:02:45 +0100 Subject: [PATCH] Add day 6 --- .gitignore | 2 ++ Day6/Day6.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ Day6/Day6A.py | 2 ++ Day6/Day6B.py | 2 ++ 4 files changed, 75 insertions(+) create mode 100644 Day6/Day6.py create mode 100644 Day6/Day6A.py create mode 100644 Day6/Day6B.py diff --git a/.gitignore b/.gitignore index cd4e12a..106dd62 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ *.hi *.o *.prof + +__pycache__ diff --git a/Day6/Day6.py b/Day6/Day6.py new file mode 100644 index 0000000..30d085f --- /dev/null +++ b/Day6/Day6.py @@ -0,0 +1,69 @@ +from pprint import pprint +import fileinput +import itertools +import numpy + +def distance(a, b): + ax, ay = a + bx, by = b + return abs(ax - bx) + abs(ay - by) + +coordinates = [] +for line in fileinput.input(): + x, y = line.strip().split(", ") + coordinates.append((int(x), int(y))) +xs, ys = numpy.transpose(coordinates) + +def nearest_neighbor(x, y): + closest = -1 + dist = 10000 + for i, coord in enumerate(coordinates): + d = distance((x, y), coord) + if d < dist: + closest = i + dist = d + elif d == dist: + closest = -1 + + return closest + +def calc_farthest(padding): + + xmin, xmax = min(xs) - padding, max(xs) + padding + ymin, ymax = min(ys) - padding, max(ys) + padding + w, h = xmax - xmin, ymax - ymin + + grid = numpy.zeros((h + 1, w + 1), dtype=numpy.int16) - 1 + for y, row in enumerate(grid): + for x in range(len(row)): + nn = nearest_neighbor(x + xmin, y + ymin) + if nn is not None: + grid[y, x] = nn + + flat = grid.flatten() + flat = flat[flat >= 0] + + return numpy.bincount(flat) + +def part1(): + small = calc_farthest(0) + big = calc_farthest(10) + print(small[small == big].max()) + +def part2(): + padding = 5 + max_dist = 10000 + + xmin, xmax = min(xs) - padding, max(xs) + padding + ymin, ymax = min(ys) - padding, max(ys) + padding + w, h = xmax - xmin, ymax - ymin + + grid = numpy.zeros((h + 1, w + 1), dtype=numpy.int16) - 1 + size = 0 + for y, row in enumerate(grid): + for x in range(len(row)): + s = sum(distance((x + xmin, y + ymin), c) for c in coordinates) + if s < max_dist: + size += 1 + + print(size) diff --git a/Day6/Day6A.py b/Day6/Day6A.py new file mode 100644 index 0000000..4464e5b --- /dev/null +++ b/Day6/Day6A.py @@ -0,0 +1,2 @@ +from Day6 import part1 +part1() diff --git a/Day6/Day6B.py b/Day6/Day6B.py new file mode 100644 index 0000000..7595a4e --- /dev/null +++ b/Day6/Day6B.py @@ -0,0 +1,2 @@ +from Day6 import part2 +part2()