package main import ( "fmt" "slices" "strconv" "strings" "tangled.org/evan.jarrett.net/aoc2025/internal/puzzle" ) type IDRange struct { first int last int } type DayFive struct { freshIds []IDRange tocheck []int } func (d *DayFive) ParseInput(input string) error { for line := range strings.SplitSeq(strings.TrimSpace(input), "\n") { line = strings.TrimSpace(line) if strings.Contains(line, "-") { splits := strings.Split(line, "-") first, _ := strconv.Atoi(splits[0]) last, _ := strconv.Atoi(splits[1]) d.freshIds = append(d.freshIds, IDRange{first, last}) } else if line == "" { continue } else { ingredient, _ := strconv.Atoi(line) d.tocheck = append(d.tocheck, ingredient) } } return nil } func (d *DayFive) Part1() (int, error) { count := 0 for _, i := range d.tocheck { for _, idrange := range d.freshIds { if i >= idrange.first && i <= idrange.last { count++ break } } } return count, nil } func (d *DayFive) Part2() (int, error) { count := 0 slices.SortFunc(d.freshIds, func(a, b IDRange) int { return a.first - b.first }) var combinedFreshIds []IDRange last := d.freshIds[0] for _, current := range d.freshIds { if current.first <= last.last { last.last = max(last.last, current.last) } else { combinedFreshIds = append(combinedFreshIds, last) last = current } } // combine one last time combinedFreshIds = append(combinedFreshIds, last) for _, idrange := range combinedFreshIds { numInRange := idrange.last - idrange.first + 1 fmt.Println(numInRange) count += numInRange } return count, nil } func main() { puzzle.Run(5, &DayFive{}) }