From e3ee530ad2f36de6dc5775ea205cc8eb77bc9b9d Mon Sep 17 00:00:00 2001 From: Peter Hudec Date: Sun, 19 Dec 2021 06:33:30 +0100 Subject: [PATCH] added day 17 --- 17/input01.txt | 1 + 17/input01_sample.txt | 1 + 17/solve01.py | 61 +++++++++++++++++++++++++++++++++++++++ 17/solve02.py | 66 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 17/input01.txt create mode 100644 17/input01_sample.txt create mode 100644 17/solve01.py create mode 100644 17/solve02.py diff --git a/17/input01.txt b/17/input01.txt new file mode 100644 index 0000000..c6f8206 --- /dev/null +++ b/17/input01.txt @@ -0,0 +1 @@ +target area: x=14..50, y=-267..-225 \ No newline at end of file diff --git a/17/input01_sample.txt b/17/input01_sample.txt new file mode 100644 index 0000000..f40609b --- /dev/null +++ b/17/input01_sample.txt @@ -0,0 +1 @@ +target area: x=20..30, y=-10..-5 \ No newline at end of file diff --git a/17/solve01.py b/17/solve01.py new file mode 100644 index 0000000..d918ee0 --- /dev/null +++ b/17/solve01.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +import re + + +def get_velocity_x(target): + result = dict() + + for x in range(max(target[0], target[1])+1): + result[x] = [] + pos = 0 + for i, speed in enumerate(reversed(range(x+1))): + if (target[0] <= pos <= target[1]): + result[x].append(i) + pos += speed + return result + +def get_velocity_y(target): + result = dict() + + min_y = min(target[2], target[3]) + for y in range(min_y, abs(min_y)+1): + result[y] = [] + pos = 0 + i = 0 + speed = y + while pos >= min_y: + i += 1 + pos += speed + #print("%d %d %d %d" % (y, pos, speed, i)) + if (target[2] <= pos <= target[3]): + result[y].append(i) + speed -= 1 + return result + +def get_max_heigth(velocity_x, velocity_y): + for y in reversed(velocity_y.keys()): + for x in velocity_x.keys(): + sx = set(velocity_x[x]) + sy = set(velocity_y[y]) + if len(sx) == 0: + continue + if len(sy) == 0: + continue + s = sx.intersection(sy) + if len(s): + return int(y*(y+1)/2) + if velocity_x[x][-1] == x: + return int(y*(y+1)/2) + return None + +with open("input01.txt","r") as f: + line = f.readline() + m = re.match(".*: x=(.*)\.\.(.*), y=(.*)\.\.(.*)", line.strip()) + target = [int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4))] + + +velocity_x = get_velocity_x(target) +velocity_y = get_velocity_y(target) +result = get_max_heigth(velocity_x, velocity_y) +print(result) diff --git a/17/solve02.py b/17/solve02.py new file mode 100644 index 0000000..636a41a --- /dev/null +++ b/17/solve02.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +import re + + +def get_velocity_x(target): + result = dict() + + for x in range(max(target[0], target[1])+1): + result[x] = [] + pos = 0 + for i, speed in enumerate(reversed(range(x+1))): + if (target[0] <= pos <= target[1]): + result[x].append(i) + pos += speed + return result + +def get_velocity_y(target): + result = dict() + + min_y = min(target[2], target[3]) + for y in range(min_y, abs(min_y)+1): + result[y] = [] + pos = 0 + i = 0 + speed = y + while pos >= min_y: + i += 1 + pos += speed + #print("%d %d %d %d" % (y, pos, speed, i)) + if (target[2] <= pos <= target[3]): + result[y].append(i) + speed -= 1 + return result + +def get_velocity_count(velocity_x, velocity_y): + result = 0 + for y in reversed(velocity_y.keys()): + for x in velocity_x.keys(): + sx = set(velocity_x[x]) + sy = set(velocity_y[y]) + if len(sx) == 0: + continue + if len(sy) == 0: + continue + s = sx.intersection(sy) + if len(s): + result += 1 + continue + if velocity_x[x][-1] == x: + t = [i for i in sy if i > x] + if len(t): + result += 1 + continue + return result + +with open("input01.txt","r") as f: + line = f.readline() + m = re.match(".*: x=(.*)\.\.(.*), y=(.*)\.\.(.*)", line.strip()) + target = [int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4))] + + +velocity_x = get_velocity_x(target) +velocity_y = get_velocity_y(target) +result = get_velocity_count(velocity_x, velocity_y) +print(result)