Advertisement
Guest User

Untitled

a guest
Dec 5th, 2023
739
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.00 KB | None | 0 0
  1. nodes = {}
  2.  
  3. class Node:
  4.     def __init__(self, name):
  5.         self.name = name
  6.         self.parents = set()
  7.         self.to = {}
  8.  
  9. file = "input.p1"
  10. # file = "example"
  11.  
  12. with open(file, "r") as f:
  13.     for row in f:
  14.         if not row.strip():
  15.             continue
  16.         if row[0].isdigit():
  17.             current_map.append([int(x) for x in row.split(" ")])
  18.         elif row.startswith("seeds: "):
  19.             t_seeds = [int(x) for x in row[7:].split()]
  20.             seeds = [(t_seeds[2*idx], t_seeds[2*idx] + t_seeds[2*idx+1]) for idx in range(len(t_seeds)//2)]
  21.         else:
  22.             from_val, to_val = row.split(" ")[0].split("-to-")
  23.             from_node = nodes.setdefault(from_val, Node(from_val))
  24.             current_map = from_node.to.setdefault(to_val, [])
  25.             nodes.setdefault(to_val, Node(to_val)).parents.add(from_node)
  26.  
  27. def map_to_location(node, start_src_init, end_src_init, depth = 0):
  28.     tabs = "  " * depth
  29.     print(f'{tabs}{node.name} {start_src_init:,} -> {end_src_init:,}')
  30.     if node.name == 'location':
  31.         return start_src_init
  32.  
  33.     lowest_val = 10000000000000000000000000
  34.  
  35.     for child_key, rows in node.to.items():
  36.         src_ranges = [(start_src_init, end_src_init)]
  37.         for dst, src, length in rows:
  38.             next_src_ranges = []
  39.  
  40.             for start_src, end_src in src_ranges:
  41.                 if end_src < src or start_src > src + length:
  42.                     next_src_ranges.append((start_src, end_src))
  43.                     continue
  44.  
  45.                 start_offset = max(src, start_src) - src
  46.                 end_offset = min(src+length, end_src) - src
  47.  
  48.                 dst_start = dst + start_offset
  49.                 dst_end = dst + end_offset
  50.  
  51.                 lowest_val = min(lowest_val, map_to_location(nodes[child_key], dst_start, dst_end, depth+1))
  52.  
  53.                 if start_src < src:
  54.                     next_src_ranges.append((start_src, src-1))
  55.                 if end_src > src + length:
  56.                     next_src_ranges.append((src + length + 1, end_src))
  57.             src_ranges = next_src_ranges
  58.  
  59.         for start_src, end_src in src_ranges:
  60.             lowest_val = min(lowest_val, map_to_location(nodes[child_key], start_src, end_src, depth+1))
  61.         return lowest_val
  62.  
  63. print(min(map_to_location(nodes['seed'], start_src, end_src) for start_src, end_src in seeds))
  64.  
  65.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement