rm
This commit is contained in:
		
							parent
							
								
									65de255264
								
							
						
					
					
						commit
						9c8fc68651
					
				
					 1 changed files with 0 additions and 111 deletions
				
			
		
							
								
								
									
										111
									
								
								res/05/main.py
									
									
									
									
									
								
							
							
						
						
									
										111
									
								
								res/05/main.py
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,111 +0,0 @@
 | 
			
		|||
# https://adventofcode.com/2023/day/5
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
FILE = 'input'
 | 
			
		||||
 | 
			
		||||
# 1. part - What is the lowest location number that corresponds to any of the initial seed numbers?
 | 
			
		||||
with open(FILE) as f:
 | 
			
		||||
    seeds = list(map(int, f.readline().split()[1:]))
 | 
			
		||||
    f.readline() # skip first header
 | 
			
		||||
    f.readline() # skip empty line
 | 
			
		||||
    maps = []
 | 
			
		||||
    map_ranges = []
 | 
			
		||||
 | 
			
		||||
    for line in f:
 | 
			
		||||
        if line == '\n':
 | 
			
		||||
            maps.append(map_ranges)
 | 
			
		||||
            map_ranges = []
 | 
			
		||||
            next(f) # skip next header
 | 
			
		||||
        else:
 | 
			
		||||
            map_ranges.append(tuple(map(int, line.split())))
 | 
			
		||||
    if map_ranges:  # add the last mapping if it exists
 | 
			
		||||
        maps.append(map_ranges)
 | 
			
		||||
 | 
			
		||||
    # apply mappings for each seed
 | 
			
		||||
    lowest_location = sys.maxsize
 | 
			
		||||
    for s in seeds:
 | 
			
		||||
        for map_ranges in maps:
 | 
			
		||||
            for destination_start, source_start, length in map_ranges:
 | 
			
		||||
                # if seed is in range of the mapping
 | 
			
		||||
                if source_start <= s <= source_start + length - 1:
 | 
			
		||||
                    s = destination_start + s - source_start
 | 
			
		||||
                    break
 | 
			
		||||
 | 
			
		||||
        # keep only tle lowest location
 | 
			
		||||
        lowest_location = min(s, lowest_location)
 | 
			
		||||
 | 
			
		||||
    print(lowest_location)
 | 
			
		||||
 | 
			
		||||
# 2. part - What is the lowest location number that corresponds to any of the initial seed numbers?
 | 
			
		||||
from operator import itemgetter
 | 
			
		||||
 | 
			
		||||
def map_seed(s, m):
 | 
			
		||||
    destination_start, source_start, _ = m
 | 
			
		||||
    return destination_start + s - source_start
 | 
			
		||||
 | 
			
		||||
def map_seed_range(seed_range, map_ranges):
 | 
			
		||||
    seed_ranges = []
 | 
			
		||||
    seed_start, seed_end = seed_range[0], seed_range[1]
 | 
			
		||||
 | 
			
		||||
    for m in map_ranges:
 | 
			
		||||
        source_start, source_end = m[1], m[1] + m[2] - 1
 | 
			
		||||
 | 
			
		||||
        overlap_start = max(seed_start, source_start)
 | 
			
		||||
        overlap_end = min(seed_end, source_end)
 | 
			
		||||
        
 | 
			
		||||
        # if overlap exists
 | 
			
		||||
        if overlap_start <= overlap_end:
 | 
			
		||||
            # keep the seed range before ovelap untouched
 | 
			
		||||
            if seed_start <= overlap_start - 1:
 | 
			
		||||
                seed_ranges.append((seed_start, overlap_start - 1))
 | 
			
		||||
            
 | 
			
		||||
            # map range
 | 
			
		||||
            seed_ranges.append((map_seed(overlap_start, m), map_seed(overlap_end, m)))
 | 
			
		||||
            
 | 
			
		||||
            # cut off already mapped seed ranges
 | 
			
		||||
            if overlap_end + 1 <= seed_end:
 | 
			
		||||
                seed_start = overlap_end + 1
 | 
			
		||||
            else:
 | 
			
		||||
                # empty seed range left
 | 
			
		||||
                seed_start = sys.maxsize 
 | 
			
		||||
                break
 | 
			
		||||
    
 | 
			
		||||
    # if we have some seed range left
 | 
			
		||||
    if seed_start <= seed_end:
 | 
			
		||||
        seed_ranges.append((seed_start, seed_end))
 | 
			
		||||
 | 
			
		||||
    return seed_ranges
 | 
			
		||||
 | 
			
		||||
with open(FILE) as f:
 | 
			
		||||
    seeds = list(map(int, f.readline().split()[1:]))
 | 
			
		||||
    f.readline() # skip first header
 | 
			
		||||
    f.readline() # skip empty line
 | 
			
		||||
    maps = []
 | 
			
		||||
    map_ranges = []
 | 
			
		||||
 | 
			
		||||
    for line in f:
 | 
			
		||||
        if line == '\n':
 | 
			
		||||
            map_ranges.sort(key=itemgetter(1)) # sort by source range start
 | 
			
		||||
            maps.append(map_ranges)
 | 
			
		||||
            map_ranges = []
 | 
			
		||||
            next(f) # skip next header
 | 
			
		||||
        else:
 | 
			
		||||
            map_ranges.append(tuple(map(int, line.split())))
 | 
			
		||||
    if map_ranges:  # add the last mapping if it exists
 | 
			
		||||
        map_ranges.sort(key=itemgetter(1)) # sort by source range start
 | 
			
		||||
        maps.append(map_ranges)
 | 
			
		||||
 | 
			
		||||
    # transform seed input into seed ranges
 | 
			
		||||
    seed_ranges = [(seeds[i], seeds[i] + seeds[i + 1] - 1) for i in range(0, len(seeds), 2)]
 | 
			
		||||
 | 
			
		||||
    # apply mappings for each seed
 | 
			
		||||
    for map_ranges in maps:
 | 
			
		||||
        new_seed_ranges = [] # each seed range can be mapped to multiple seed ranges
 | 
			
		||||
        for seed_range in seed_ranges:
 | 
			
		||||
            new_seed_ranges += map_seed_range(seed_range, map_ranges)
 | 
			
		||||
        seed_ranges = new_seed_ranges
 | 
			
		||||
 | 
			
		||||
    # the minimum starting point within the ranges of seed values
 | 
			
		||||
    lowest_location = min(seed_range[0] for seed_range in seed_ranges)
 | 
			
		||||
    print(lowest_location)
 | 
			
		||||
		Loading…
	
		Reference in a new issue