This commit is contained in:
2022-12-23 19:45:56 -08:00
commit 8792e5275a
77 changed files with 31154 additions and 0 deletions

114
solutions/day4/day4.go Normal file
View File

@@ -0,0 +1,114 @@
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)
}