-
Notifications
You must be signed in to change notification settings - Fork 0
/
day4.go
97 lines (78 loc) · 2.28 KB
/
day4.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"strings"
"time"
"github.com/japorito/merry/libxmas/sleigh"
"github.com/japorito/merry/libxmas/toybag"
"github.com/japorito/merry/libxmas/xmas"
"github.com/spf13/cobra"
)
func parseAssignmentRanges(input []string) [][]int64 {
output := make([][]int64, len(input))
for i, assignmentPair := range input {
output[i] =
sleigh.ToInt64s(
strings.FieldsFunc(assignmentPair,
func(r rune) bool {
return r == ',' || r == '-'
}))
}
return output
}
func sectionRangeContains(range1, range2 []int64) bool {
return range1[0] <= range2[0] && range1[1] >= range2[1]
}
func eitherIsSubset(range1, range2 []int64) bool {
return sectionRangeContains(range1, range2) || sectionRangeContains(range2, range1)
}
func countCompleteSectionSubsets(assignmentPairs [][]int64) int64 {
var subsets int64 = 0
for _, rangePair := range assignmentPairs {
if eitherIsSubset(rangePair[:2], rangePair[2:]) {
subsets++
}
}
return subsets
}
func sectionRangeOverlaps(range1, range2 []int64) bool {
return (range1[0] <= range2[0] && range1[1] >= range2[0]) ||
(range2[0] <= range1[0] && range2[1] >= range1[0])
}
func countOverlaps(assignmentPairs [][]int64) int64 {
var overlaps int64 = 0
for _, rangePair := range assignmentPairs {
if sectionRangeOverlaps(rangePair[:2], rangePair[2:]) {
overlaps++
}
}
return overlaps
}
// day4Cmd represents the day4 command
var day4Cmd = &cobra.Command{
Use: "day4 path/to/input/file",
Short: "AoC Day 4",
Long: `Advent of Code Day 4: Camp Cleanup`,
Run: func(cmd *cobra.Command, args []string) {
defer xmas.PrintHolidayMessage(time.Now())
if input := toybag.ReadToLines(args...); input != nil {
fmt.Printf("%d assignment pairs read.\n", len(input))
assignmentPairs := parseAssignmentRanges(input)
if Parts.Has(1) {
fmt.Println("Part 1 running...")
fmt.Printf("There are **%d** elves with cleaning assignments containing their partner's assignments.\n",
countCompleteSectionSubsets(assignmentPairs))
}
if Parts.Has(2) {
fmt.Println("Part 2 running...")
fmt.Printf("There are **%d** elf pairs with overlapping cleaning assignments.\n", countOverlaps(assignmentPairs))
}
}
},
}
func init() {
rootCmd.AddCommand(day4Cmd)
}