Skip to content

Commit 1ea514c

Browse files
feat(day04): solve part02
1 parent 3ff6b72 commit 1ea514c

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

Diff for: 2023-go/day04/day04.go

+38
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ func main() {
1313
log.Println("Day 04 Part 01")
1414
partOne(cards)
1515
log.Println("Day 04 Part 02")
16+
partTwo(cards)
1617
}
1718

1819
func partOne(cards []card) {
@@ -23,11 +24,33 @@ func partOne(cards []card) {
2324
log.Println(sum)
2425
}
2526

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+
2648
// ------- Helper functions and structs -------
2749
type card struct {
2850
id int
2951
winningNumbers []int
3052
myNumbers []int
53+
instances int // for part two
3154
}
3255

3356
// determinePoints determines the points for a card.
@@ -48,6 +71,20 @@ func (c *card) determinePoints() int {
4871
return points
4972
}
5073

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+
5188
// readCards reads a slice of strings and returns a slice of cards.
5289
func readCards(lines []string) []card {
5390
cards := []card{}
@@ -58,6 +95,7 @@ func readCards(lines []string) []card {
5895
numbers := strings.Split(meta[1], " | ")
5996
newCard.winningNumbers = readNumbers(numbers[0])
6097
newCard.myNumbers = readNumbers(numbers[1])
98+
newCard.instances = 1
6199
cards = append(cards, *newCard)
62100
}
63101
return cards

0 commit comments

Comments
 (0)