🌅
This commit is contained in:
114
solutions/day4/day4.go
Normal file
114
solutions/day4/day4.go
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user