Files
advent-of-code-2025/05/main.go
Simon Ziegler 0cb6eea26c day 05
2025-12-08 14:49:29 +01:00

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)
}