AOC/2023/day05/src/part2.py

78 lines
2.0 KiB
Python
Raw Normal View History

2023-12-05 04:10:33 -05:00
import threading
import time
2023-12-05 04:15:20 -05:00
text: str = open("example.txt", "r").read()
2023-12-05 03:56:18 -05:00
_value: int = 0
_lines = text.splitlines()
2023-12-05 04:15:20 -05:00
current_ranges = []
2023-12-05 03:56:18 -05:00
convertions = []
bozo = _lines[0][7:].split(" ")
for i, value in enumerate(bozo):
if (i % 2):
continue
2023-12-05 04:15:20 -05:00
current_ranges.append((int(bozo[i]), int(bozo[i]) + int(bozo[i + 1])))
2023-12-05 03:56:18 -05:00
def extract_map_data(lines: [str]):
lst = []
for line in lines:
if (line == ""):
break
bozo = line.split()
length = int(bozo[2])
destination = int(bozo[0]) - int(bozo[1])
source_range = range(int(bozo[1]), int(bozo[1]) + length)
lst.append({"destination": destination, "source_range": source_range})
return lst
def translation(lst: list[dict], value: int):
for map in lst:
if value in map["source_range"]:
value += map["destination"]
break
return value
for i, line in enumerate(_lines):
if (line.endswith(" map:")):
convertions.append(extract_map_data(_lines[i + 1:]))
current_time = time.time()
def display_duration(interval_between_call, nb_total_values):
global current_time
old_time = current_time
current_time = time.time()
diff = int(((current_time - old_time) / interval_between_call) * nb_total_values)
print(f"{int(diff / 3600)}h {int(diff % 3600 / 60)}min {int(diff % 60)}s")
2023-12-05 04:10:33 -05:00
def do_all_convertions(lst_convertions: [[dict]], value):
for i, tab_convertion in enumerate(convertions):
value = translation(tab_convertion, value)
return value
def get_min_in_range(lst_conversions, start, stop):
min_value = do_all_convertions(lst_conversions, start)
i = start + 1;
while (i != stop):
2023-12-05 03:56:18 -05:00
2023-12-05 04:10:33 -05:00
if ((i - start) % 10000 == 0):
display_duration(10000, stop - start)
print(i - start, '/', stop - start)
2023-12-05 03:56:18 -05:00
2023-12-05 04:10:33 -05:00
value = do_all_convertions(lst_conversions, i)
2023-12-05 04:15:20 -05:00
print(min_value, value, min(value, min_value))
min_value = min(value, min_value)
2023-12-05 04:10:33 -05:00
i += 1
return (min_value)
2023-12-05 03:56:18 -05:00
2023-12-05 04:15:20 -05:00
_min = 2000000000000000000
for current_range in current_ranges:
start, stop = current_range
_min = min(_min, get_min_in_range(convertions, start, stop))
2023-12-05 03:56:18 -05:00
_value = _min
print(_value)