diff --git a/day04/common/section.go b/day04/common/section.go new file mode 100644 index 0000000..796a8c1 --- /dev/null +++ b/day04/common/section.go @@ -0,0 +1,48 @@ +package common + +import ( + "bufio" + "strconv" + "strings" +) + +type Assignment struct { + start int + end int +} + +func (assignment Assignment) Contains(other Assignment) bool { + return assignment.start <= other.start && assignment.end >= other.end +} + +type AssignmentPair struct { + assignments [2]Assignment +} + +func (pair AssignmentPair) OverlapsFully() bool { + return pair.assignments[0].Contains(pair.assignments[1]) || pair.assignments[1].Contains(pair.assignments[0]) +} + +func (pair AssignmentPair) Overlaps() bool { + return (pair.assignments[0].start >= pair.assignments[1].start && pair.assignments[0].start <= pair.assignments[1].end) || + (pair.assignments[1].start >= pair.assignments[0].start && pair.assignments[1].start <= pair.assignments[0].end) +} + +func Parse(scanner bufio.Scanner) []AssignmentPair { + pairs := []AssignmentPair{} + + for scanner.Scan() { + line := scanner.Text() + splittedPair := strings.Split(line, ",") + currentAssignmentPair := AssignmentPair{} + for i := 0; i < 2; i++ { + splittedAssignment := strings.Split(splittedPair[i], "-") + start, _ := strconv.Atoi(splittedAssignment[0]) + end, _ := strconv.Atoi(splittedAssignment[1]) + currentAssignmentPair.assignments[i] = Assignment{start, end} + } + pairs = append(pairs, currentAssignmentPair) + } + + return pairs +} diff --git a/day04/ex1/main.go b/day04/ex1/main.go new file mode 100644 index 0000000..a343b7d --- /dev/null +++ b/day04/ex1/main.go @@ -0,0 +1,21 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "aoc2022/day04/common" +) + +func main() { + assignmentPairs := common.Parse(*bufio.NewScanner(os.Stdin)) + sum := 0 + + for _, assignmentPair := range assignmentPairs { + if assignmentPair.OverlapsFully() { + sum++ + } + } + + fmt.Println(sum) +} diff --git a/day04/ex2/main.go b/day04/ex2/main.go new file mode 100644 index 0000000..016ec0c --- /dev/null +++ b/day04/ex2/main.go @@ -0,0 +1,21 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "aoc2022/day04/common" +) + +func main() { + assignmentPairs := common.Parse(*bufio.NewScanner(os.Stdin)) + sum := 0 + + for _, assignmentPair := range assignmentPairs { + if assignmentPair.Overlaps() { + sum++ + } + } + + fmt.Println(sum) +}