| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -13,24 +13,21 @@ type maprange struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    dst uint64 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					type mapdir struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						src string | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						dst string | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					type mapval struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    cunt uint64 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    rnge maprange | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					type mapping struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    dir mapdir | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    src string | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    dst string | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    val []mapval | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					func parse(f *os.File) (seeds []uint64, maps []mapping) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					func parse(f *os.File) (seeds []uint64, maps map[string]mapping) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    s := bufio.NewScanner(f) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    maps = make(map[string]mapping) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    inmap := false | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    var curmap mapping | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for s.Scan() { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -44,7 +41,7 @@ func parse(f *os.File) (seeds []uint64, maps []mapping) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        case strings.HasSuffix(line, " map:"): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if inmap { maps = append(maps, curmap) } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if inmap { maps[curmap.src] = curmap } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            curmap = mapping{} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            inmap = true | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -52,8 +49,8 @@ func parse(f *os.File) (seeds []uint64, maps []mapping) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            split2 := strings.Index(line, " ") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            src := line[:split1] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            dst := line[split1 + 4:split2] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            curmap.dir.src = src | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            curmap.dir.dst = dst | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            curmap.src = src | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            curmap.dst = dst | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        case strings.Count(line, " ") >= 2 && inmap: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            thing := strings.Split(line, " ") | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -64,28 +61,19 @@ func parse(f *os.File) (seeds []uint64, maps []mapping) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            curmap.val = append(curmap.val, val) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if inmap { maps = append(maps, curmap) } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if inmap { maps[curmap.src] = curmap } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					func part1(init_seeds []uint64, maps []mapping) uint64 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					func part1(init_seeds []uint64, maps map[string]mapping) uint64 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    seeds := append(make([]uint64, 0, len(init_seeds)), init_seeds...) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    currency := "seed" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for currency != "location" { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        var map_cur mapping | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        map_found := false | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        for _, v := range maps { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if v.dir.src == currency { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                map_cur = v | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                map_found = true | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                break | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if !map_found { break } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        map_cur := maps[currency] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        currency = map_cur.dst | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        currency = map_cur.dir.dst | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        for i, v := range seeds { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for _, x := range map_cur.val { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                tmp := v - x.rnge.src | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -105,7 +93,7 @@ func part1(init_seeds []uint64, maps []mapping) uint64 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return min | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					func part2(init_seeds []uint64, maps []mapping) uint64 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					func part2(init_seeds []uint64, maps map[string]mapping) uint64 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    seeds := make([]maprange, 0) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for i, _ := range init_seeds { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if i % 2 == 1 { continue } | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -117,18 +105,9 @@ func part2(init_seeds []uint64, maps []mapping) uint64 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    currency := "seed" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for currency != "location" { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        var map_cur mapping | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        map_found := false | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        for _, v := range maps { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if v.dir.src == currency { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                map_cur = v | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                map_found = true | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                break | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if !map_found { break } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        map_cur := maps[currency] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        currency = map_cur.dst | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        currency = map_cur.dir.dst | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        newseedrnge := make([]maprange, 0) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        for _, v := range seeds { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for _, x := range map_cur.val { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -160,11 +139,11 @@ func part2(init_seeds []uint64, maps []mapping) uint64 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        seeds = newseedrnge | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    minrnge := seeds[0].src | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    min := seeds[0].src | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for _, v := range seeds[1:] { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if v.src < minrnge { minrnge = v.src } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if v.src < min { min = v.src } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return minrnge | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return min | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					func main() { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |