aoc2021/day07.py

54 lines
1.4 KiB
Python

from tools.aoc import AOCDay
from tools.int_seq import triangular
from typing import Any, List
def getMinFuelUse(crabs: List[int], increased: bool = False) -> int:
min_num = min(crabs)
max_num = max(crabs)
avg = (min_num + max_num) // 2
while 1:
if increased:
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:
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 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):
inputs = [
[
(37, "test_input07"),
(336120, "input07")
],
[
(168, "test_input07"),
(96864235, "input07")
]
]
def part1(self) -> Any:
crabs = self.getInputAsArraySplit(",", int)
return getMinFuelUse(crabs)
def part2(self) -> Any:
crabs = self.getInputAsArraySplit(",", int)
return getMinFuelUse(crabs, True)
if __name__ == '__main__':
day = Day(7)
day.run(verbose=True)