@@ -13,6 +13,7 @@ func main() {
13
13
log .Println ("Day 04 Part 01" )
14
14
partOne (cards )
15
15
log .Println ("Day 04 Part 02" )
16
+ partTwo (cards )
16
17
}
17
18
18
19
func partOne (cards []card ) {
@@ -23,11 +24,33 @@ func partOne(cards []card) {
23
24
log .Println (sum )
24
25
}
25
26
27
+ func partTwo (cards []card ) {
28
+ for cardNumber := 0 ; cardNumber < len (cards ); cardNumber ++ {
29
+ c := cards [cardNumber ]
30
+ matchingNumbers := c .determineMatchingNumbers ()
31
+ // repeat for all instances of the current card (original + copies)
32
+ for k := 1 ; k <= c .instances ; k ++ {
33
+ // increase the instances for each following cards based on matchingNumbers
34
+ for nextCardNo := 1 ; nextCardNo <= matchingNumbers ; nextCardNo ++ {
35
+ cards [cardNumber + nextCardNo ].instances ++
36
+ }
37
+ }
38
+ }
39
+
40
+ // calculate the total number of scratch cards (original + copies)
41
+ var totalScratchCards int
42
+ for _ , c := range cards {
43
+ totalScratchCards += c .instances
44
+ }
45
+ log .Println (totalScratchCards )
46
+ }
47
+
26
48
// ------- Helper functions and structs -------
27
49
type card struct {
28
50
id int
29
51
winningNumbers []int
30
52
myNumbers []int
53
+ instances int // for part two
31
54
}
32
55
33
56
// determinePoints determines the points for a card.
@@ -48,6 +71,20 @@ func (c *card) determinePoints() int {
48
71
return points
49
72
}
50
73
74
+ // determineMatchingNumbers determines the total number of matches between myNumbers and winningNumbers.
75
+ func (c * card ) determineMatchingNumbers () int {
76
+ var matchingNumbers int
77
+ for _ , n := range c .myNumbers {
78
+ for _ , w := range c .winningNumbers {
79
+ if n == w {
80
+ matchingNumbers ++
81
+ break
82
+ }
83
+ }
84
+ }
85
+ return matchingNumbers
86
+ }
87
+
51
88
// readCards reads a slice of strings and returns a slice of cards.
52
89
func readCards (lines []string ) []card {
53
90
cards := []card {}
@@ -58,6 +95,7 @@ func readCards(lines []string) []card {
58
95
numbers := strings .Split (meta [1 ], " | " )
59
96
newCard .winningNumbers = readNumbers (numbers [0 ])
60
97
newCard .myNumbers = readNumbers (numbers [1 ])
98
+ newCard .instances = 1
61
99
cards = append (cards , * newCard )
62
100
}
63
101
return cards
0 commit comments