package main import ( "bufio" "fmt" "os" "sort" "strconv" "strings" ) type interval struct { lb,ub int64 } type sinterval []interval func (a sinterval) Len() int { return len(a)} func (a sinterval) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a sinterval) Less(i, j int) bool { return a[i].lb < a[j].lb } func main(){ fmt.Println("Advent of Code 2025 - Day 5 - Part 2") f,_:= os.Open("5/input") defer f.Close() scanner := bufio.NewScanner(f) var ranges []interval; for scanner.Scan(){ line := scanner.Text() if (len(line) == 0){ break } line_split := strings.Split(line, "-") lb,_ := strconv.ParseInt(line_split[0],10,64) ub,_ := strconv.ParseInt(line_split[1],10,64) ranges = append(ranges, interval{lb,ub}) } res := int64(0) sort.Sort(sinterval(ranges)) var compressed_ranges []interval; for _, itvl := range ranges{ if (len(compressed_ranges)==0){ compressed_ranges = append(compressed_ranges, itvl) } else { last_compressed := &compressed_ranges[len(compressed_ranges)-1] if (last_compressed.ub >= itvl.lb){ last_compressed.ub = max(itvl.ub, last_compressed.ub) } else { compressed_ranges = append(compressed_ranges, itvl) } } } for _,itvl := range compressed_ranges{ res += itvl.ub - itvl.lb + 1 } fmt.Println(res) }