115 lines
2.1 KiB
Go
115 lines
2.1 KiB
Go
package day4
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type SectionRange struct {
|
|
start int
|
|
end int
|
|
}
|
|
|
|
func total_overlap(a SectionRange, b SectionRange) bool {
|
|
return ((a.start >= b.start) && (a.end <= b.end)) ||
|
|
((b.start >= a.start) && (b.end <= a.end))
|
|
}
|
|
|
|
func partial_overlap(a SectionRange, b SectionRange) bool {
|
|
return (a.start >= b.start && a.start <= b.end) ||
|
|
(a.end >= b.end && a.end <= b.end) ||
|
|
(b.start >= a.start && b.start <= a.end) ||
|
|
(b.end >= a.start && b.end <= a.end)
|
|
}
|
|
|
|
func range_from_string(s string) (ret_range SectionRange, err error) {
|
|
ret_range = SectionRange{0, 0}
|
|
items := strings.Split(s, "-")
|
|
|
|
if len(items) != 2 {
|
|
err = errors.New("invalid range format")
|
|
return
|
|
}
|
|
|
|
start, start_err := strconv.Atoi(items[0])
|
|
if start_err != nil {
|
|
err = start_err
|
|
return
|
|
}
|
|
ret_range.start = start
|
|
|
|
end, end_err := strconv.Atoi(items[1])
|
|
if end_err != nil {
|
|
err = end_err
|
|
return
|
|
}
|
|
ret_range.end = end
|
|
|
|
err = nil
|
|
|
|
return
|
|
}
|
|
|
|
func line_to_pair(s string) (left SectionRange, right SectionRange, err error) {
|
|
items := strings.Split(s, ",")
|
|
|
|
if len(items) != 2 {
|
|
err = errors.New("invalid range format")
|
|
return
|
|
}
|
|
|
|
left, left_err := range_from_string(items[0])
|
|
if left_err != nil {
|
|
err = left_err
|
|
return
|
|
}
|
|
|
|
right, right_err := range_from_string(items[1])
|
|
if right_err != nil {
|
|
err = right_err
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func Run(filename string) {
|
|
file, err := os.Open(filename)
|
|
|
|
if err != nil {
|
|
fmt.Println("Error opening file:", err)
|
|
return
|
|
}
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
scanner.Split(bufio.ScanLines)
|
|
var total_overlapping int = 0
|
|
var partial_overlapping int = 0
|
|
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
left, right, err := line_to_pair(line)
|
|
|
|
if err != nil {
|
|
fmt.Println("ERROR: failed to parse line:", err)
|
|
} else {
|
|
if total_overlap(left, right) {
|
|
total_overlapping += 1
|
|
}
|
|
|
|
if partial_overlap(left, right) {
|
|
partial_overlapping += 1
|
|
}
|
|
}
|
|
}
|
|
|
|
file.Close()
|
|
|
|
fmt.Println("# of overlapping pairs", total_overlapping)
|
|
fmt.Println("# of partially overlapping pairs", partial_overlapping)
|
|
}
|