package main import ( "fmt" "strconv" "strings" "git.z1glr.de/advent-of-code-2025/pkg/aoc" ) type Range struct { From, To int } func parseRange(r string) Range { parts := strings.Split(r, "-") var err error rng := Range{} if rng.From, err = strconv.Atoi(parts[0]); err != nil { panic(err) } if rng.To, err = strconv.Atoi(parts[1]); err != nil { panic(err) } return rng } func main() { rows := aoc.ReadFileRows(false) ranges := []Range{} var idsStartIndex int for ii, rr := range rows { if rr == "" { idsStartIndex = ii + 1 break } else { ranges = append(ranges, parseRange(rr)) } } for { deleteIndex := -1 for ii, rngBasis := range ranges { for jj, rngCompare := range ranges { if ii != jj { if rngCompare.From >= rngBasis.From && rngCompare.From <= rngBasis.To && rngCompare.To > rngBasis.To { ranges[ii].To = rngCompare.To deleteIndex = jj } if rngCompare.To >= rngBasis.From && rngCompare.To <= rngBasis.To && rngCompare.From < rngBasis.From { ranges[ii].From = rngCompare.From deleteIndex = jj } if rngCompare.From <= rngBasis.From && rngCompare.To >= rngBasis.To { ranges[ii] = rngCompare deleteIndex = jj } if deleteIndex != -1 { break } } if deleteIndex != -1 { break } } } if deleteIndex != -1 { ranges[deleteIndex] = ranges[len(ranges)-1] ranges = ranges[:len(ranges)-1] } else { break } } freshCounter := 0 for _, sID := range rows[idsStartIndex:] { id := aoc.ParseInt(sID) for _, goodRange := range ranges { if id >= goodRange.From && id <= goodRange.To { freshCounter++ break } } } freshIDCount := 0 for _, rng := range ranges { freshIDCount += rng.To - rng.From + 1 } fmt.Println(freshCounter) fmt.Println(freshIDCount) }