solve_2.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "sort"
  7. "strconv"
  8. "strings"
  9. )
  10. type interval struct {
  11. lb,ub int64
  12. }
  13. type sinterval []interval
  14. func (a sinterval) Len() int { return len(a)}
  15. func (a sinterval) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
  16. func (a sinterval) Less(i, j int) bool { return a[i].lb < a[j].lb }
  17. func main(){
  18. fmt.Println("Advent of Code 2025 - Day 5 - Part 2")
  19. f,_:= os.Open("5/input")
  20. defer f.Close()
  21. scanner := bufio.NewScanner(f)
  22. var ranges []interval;
  23. for scanner.Scan(){
  24. line := scanner.Text()
  25. if (len(line) == 0){
  26. break
  27. }
  28. line_split := strings.Split(line, "-")
  29. lb,_ := strconv.ParseInt(line_split[0],10,64)
  30. ub,_ := strconv.ParseInt(line_split[1],10,64)
  31. ranges = append(ranges, interval{lb,ub})
  32. }
  33. res := int64(0)
  34. sort.Sort(sinterval(ranges))
  35. var compressed_ranges []interval;
  36. for _, itvl := range ranges{
  37. if (len(compressed_ranges)==0){
  38. compressed_ranges = append(compressed_ranges, itvl)
  39. } else {
  40. last_compressed := &compressed_ranges[len(compressed_ranges)-1]
  41. if (last_compressed.ub >= itvl.lb){
  42. last_compressed.ub = max(itvl.ub, last_compressed.ub)
  43. } else {
  44. compressed_ranges = append(compressed_ranges, itvl)
  45. }
  46. }
  47. }
  48. for _,itvl := range compressed_ranges{
  49. res += itvl.ub - itvl.lb + 1
  50. }
  51. fmt.Println(res)
  52. }