Files
advent-of-gode/2022/04/code.go
2023-12-01 15:13:45 +02:00

78 lines
1.3 KiB
Go
Executable File

package main
import (
"fmt"
"log"
"strconv"
"strings"
"github.com/jpillora/puzzler/harness/aoc"
)
func main() {
aoc.Harness(run)
}
func run(part2 bool, input string) any {
if input == "" {
return "not implemented"
}
count := 0
lines := strings.Split(strings.TrimSpace(input), "\n")
for _, line := range lines {
pair := strings.SplitN(line, ",", 2)
if len(pair) != 2 {
log.Panicf("invalid input %q", line)
}
a := parse(pair[0])
b := parse(pair[1])
if !part2 && a.subsetEither(b) {
count++
} else if part2 && a.intersetsEither(b) {
count++
}
}
return count
}
type hilo struct {
lo, hi int
}
func (h hilo) String() string {
return fmt.Sprintf("%d-%d", h.lo, h.hi)
}
func parse(s string) hilo {
pair := strings.SplitN(s, "-", 2)
if len(pair) != 2 {
panic("bad pair")
}
lo, err := strconv.Atoi(pair[0])
if err != nil {
panic(err)
}
hi, err := strconv.Atoi(pair[1])
if err != nil {
panic(err)
}
return hilo{lo, hi}
}
func (a hilo) subsetEither(b hilo) bool {
return a.subsetOf(b) || b.subsetOf(a)
}
func (a hilo) subsetOf(b hilo) bool {
return a.lo >= b.lo && a.hi <= b.hi
}
func (a hilo) intersetsEither(b hilo) bool {
return a.intersets(b) || b.intersets(a)
}
func (a hilo) intersets(b hilo) bool {
return a.lo <= b.lo && b.lo <= a.hi || // b.lo in a OR
a.lo <= b.hi && b.hi <= a.hi // b.hi in a
}