From 522edc867cc2bc6993da73701b0c13a538621700 Mon Sep 17 00:00:00 2001 From: Tomasz Kramkowski Date: Fri, 17 Dec 2021 15:07:25 +0000 Subject: day 17 --- 17.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 17.py diff --git a/17.py b/17.py new file mode 100644 index 0000000..fa426d4 --- /dev/null +++ b/17.py @@ -0,0 +1,37 @@ +from math import sqrt, ceil, floor +from utils import parse_day + +tx_min, tx_max, ty_min, ty_max = \ + map(int, parse_day(17, r'.* x=(-?\d+)..(-?\d+), y=(-?\d+)..(-?\d+)')) + +vx_min = int(sqrt(tx_min * 2) - 1) +vx_max = tx_max +vy_min = ty_min +vy_max = abs(ty_min) - 1 + +def sum_n(n): + return n * (n + 1) // 2 + +print(sum_n(vy_max)) + +def time_at_pos(v, d): + """d = - (t + 1)(t - 2v) / 2 solved for t""" + return (sqrt((2 * v + 1) ** 2 - 8 * d) + 2 * v - 1) / 2 + 1 + +def y_times(vy0): + start = time_at_pos(vy0, ty_max) + end = time_at_pos(vy0, ty_min) + return range(ceil(start), floor(end) + 1) + +def x_at(vx0, t): + assert(t >= 0) + return sum_n(vx0) - sum_n(max(vx0 - t, 0)) + +count = 0 +for vy0 in range(vy_min, vy_max + 1): + for vx0 in range(vx_min, vx_max + 1): + for t in y_times(vy0): + if tx_min <= x_at(vx0, t) <= tx_max: + count += 1 + break +print(count) -- cgit v1.2.3-54-g00ecf