import argparse import collections import re p = argparse.ArgumentParser() p.add_argument("file", type=argparse.FileType("r"), help="input file") options = p.parse_args() m = collections.defaultdict(list) steps = [] for line in options.file: line = line.strip() if not line: pass elif line.startswith("seeds:"): seeds = [int(s) for s in line.split()[1:]] seeds = [(s, s + sn) for s, sn in zip(seeds[0::2], seeds[1::2])] elif line.endswith("map:"): pmap = line.split()[0] steps.append(pmap) else: [dst, src, n] = [int(s) for s in line.split()] m[pmap].append((dst, src, n)) mini = None for seed in seeds: done = [seed] for step in steps: todo = done done = [] for dst, src, n in m[step]: src1 = src src2 = src + n newtodo = [] for s1, s2 in todo: if s1 < src1: newtodo.append((s1, min(s2, src1))) if s2 > src2: newtodo.append((max(s1, src2), s2)) if s2 > src1 and s1 < src2: done.append((max(s1, src1) - src + dst, min(s2, src2) - src + dst)) todo = newtodo done.extend(todo) print(done) s = min(s1 for s1, s2 in done) if mini is None or s < mini: mini = s print(mini)