From 86013c25c02f2bed6bfa4368330644a9b035afb1 Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Tue, 7 Dec 2021 11:06:12 +0100 Subject: [PATCH] day07: binary searching makes this go *much* faster --- day07.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/day07.py b/day07.py index d8cbb8e..7130e96 100644 --- a/day07.py +++ b/day07.py @@ -5,17 +5,27 @@ from typing import Any, List def getMinFuelUse(crabs: List[int], increased: bool = False) -> int: - minFuel = inf - for pos in range(min(crabs), max(crabs) + 1): + min_num = min(crabs) + max_num = max(crabs) + avg = (min_num + max_num) // 2 + while 1: if increased: - fuel = sum(triangular(abs(pos - c)) for c in crabs) + avg_fuel = sum(triangular(abs(avg - c)) for c in crabs) + avg_fuel_p = sum(triangular(abs(avg + 1 - c)) for c in crabs) + avg_fuel_m = sum(triangular(abs(avg - 1 - c)) for c in crabs) else: - fuel = sum(abs(pos - c) for c in crabs) + avg_fuel = sum(abs(avg - c) for c in crabs) + avg_fuel_p = sum(abs(avg + 1 - c) for c in crabs) + avg_fuel_m = sum(abs(avg - 1 - c) for c in crabs) - if fuel < minFuel: - minFuel = fuel - - return minFuel + if avg_fuel_m < avg_fuel: + max_num = avg + avg = (min_num + avg) // 2 + elif avg_fuel_p < avg_fuel: + min_num = avg + avg = (max_num + avg) // 2 + else: + return avg_fuel class Day(AOCDay):