78 lines
1.3 KiB
Go
Executable File
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
|
|
}
|