113 lines
1.8 KiB
Go
113 lines
1.8 KiB
Go
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)
|
|
}
|