diff --git a/day-05/src/part01.py b/day-05/src/part01.py index 37c6de3..f3db296 100644 --- a/day-05/src/part01.py +++ b/day-05/src/part01.py @@ -30,66 +30,69 @@ class Seed: seeds = [] +transforms = [] def map_range(num, map_ranges): - #print(map_ranges) - #print([list(range(tr.src_start, tr.src_start+tr.range)) for tr in map_ranges]) - s_range = list(chain.from_iterable([range(tr.src_start, tr.src_start+tr.range) for tr in map_ranges])) - d_range = list(chain.from_iterable([range(tr.dest_start, tr.dest_start+tr.range) for tr in map_ranges])) - #s_range = list(chain.from_iterable([list(range(tr.src_start, tr.src_start+tr.range) for tr in map_ranges]])) - #debug_print("map_range", s_range, d_range) - if DEBUG: - assert len(s_range) == len(d_range) - - #s_range = list(range(tr.src_start, tr.src_start+tr.range)) - #d_range = list(range(tr.dest_start, tr.dest_start+tr.range)) - - for i, s_num in enumerate(s_range): - if num == s_num: - #print("match", num, s_num, d_range[i]) - return d_range[i] + for range_cont in map_ranges: + if num >= range_cont.src_start and num <= range_cont.src_start+range_cont.range: + debug_print("in range", num, range_cont) + return (num-range_cont.src_start) + range_cont.dest_start return num -seeds = [Seed(79), Seed(14), Seed(55), Seed(13)] -to_soil_maps = [RangeContainer(50, 98, 2), RangeContainer(52, 50, 48)] -to_fertilizer_maps = [RangeContainer(0, 15, 37), RangeContainer(37, 52, 2), RangeContainer(39, 0, 15)] - - -for seed in seeds: - seed.soil = map_range(seed.number, to_soil_maps) - seed.fertilizer = map_range(seed.soil, to_fertilizer_maps) - debug_print(f"seed {seed.number}, soil {seed.soil}, fertilizer {seed.fertilizer}") -#debug_print(seeds.soil) - - - - - print("Parsing Input:") print("") print("===================================\n"); -FILENAME = "/home/icaema/Public/advent-of-code/day-05/data/p01test.txt" +FILENAME = "/home/icaema/Public/advent-of-code/day-05/data/p01data.txt" f = open(FILENAME, "r") +parse_map_no = 0 #the index of the maps that we are processing + # 1 is seed-to-soil + # 2 is soil-to-fert + # and so on + #for line in sys.stdin: for line in f.readlines(): line = line.strip() - #debug_print("input", line) - - - - + debug_print("input", line, "no", parse_map_no) + if line == "": + continue + if line[:7] == "seeds: ": + seeds = [Seed(int(num)) for num in line[7:].split()] + debug_print("seeds", [s.number for s in seeds]) + continue + if "map" in line: + parse_map_no += 1 + transforms.append([]) + continue + + pr = [int(x) for x in line.split()] + transforms[-1].append(RangeContainer(pr[0], pr[1], pr[2])) + #debug_print("transforms", transforms[-1]) print("") print(" Proccessing:") print("===================================\n"); # Insert Processing Code +for seed in seeds: + attributes = seed.__dir__()[:8] + for i, attribute in enumerate(attributes): + if i == 0: continue + setattr(seed, attribute, map_range(getattr(seed, attributes[i-1]), transforms[i-1])) + debug_print("attr", i , attribute) + debug_print("set_val", i , getattr(seed, attribute)) + seed.soil = map_range(seed.number, transforms[0]) + debug_print("soil", seed.soil) + #for i, attribute in enumerate(attributes): + # setattr(seed, attribute, map_range(seed, transforms[i-1])) + # debug_print("get", attribute, getattr(seed, attribute)) + #debug_print(f"seed {seed.number}, soil {seed.soil}, fertilizer {seed.fertilizer}") - +for seed in seeds: + debug_print("location", seed.location) @@ -98,6 +101,7 @@ print(" Calculate Answer:") print("===================================\n"); +min_location = min([s.location for s in seeds]) @@ -105,4 +109,4 @@ print("===================================\n"); print("") print(" Answer:") print("===================================\n"); -print("Answer: XXX"); \ No newline at end of file +print(f"min_location: \n{min_location}"); \ No newline at end of file