diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-12-14 22:50:55 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-12-14 22:52:42 +0100 |
commit | 27b990f30b993c06ff9db5e4d6a2b7e35575c3b6 (patch) | |
tree | 15a7aa7c1386f2342e24cb94de29f6345be12a7a | |
parent | fc6ac09d93dbaa40401bb3d7d96c1ef0b265d7dc (diff) |
aoc23: faster solution for day 4b
-rw-r--r-- | aoc23/day04_test.go | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/aoc23/day04_test.go b/aoc23/day04_test.go index b334006..c5655dd 100644 --- a/aoc23/day04_test.go +++ b/aoc23/day04_test.go @@ -10,6 +10,7 @@ import ( type Card struct { winning []int numbers []int + matches int } func parseCard(s string) Card { @@ -17,14 +18,18 @@ func parseCard(s string) Card { winning := transform(strings.Fields(parts[1]), requireInt) slices.Sort(winning) numbers := transform(strings.Fields(parts[2]), requireInt) - return Card{winning, numbers} + return Card{winning, numbers, -1} } func (c *Card) winners() int { - return quantify(c.numbers, func(n int) bool { - _, found := slices.BinarySearch(c.winning, n) - return found - }) + if c.matches < 0 { + c.matches = quantify(c.numbers, func(n int) bool { + _, found := slices.BinarySearch(c.winning, n) + return found + }) + } + return c.matches + } func cardPoints(r io.Reader) int { @@ -41,8 +46,8 @@ func cardPoints(r io.Reader) int { func countCards(cards []Card) int { sum := 0 - for i, card := range cards { - winners := card.winners() + for i := range cards { + winners := cards[i].winners() next := i + 1 sum += 1 + countCards(cards[next:next+winners]) } |