summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-12-14 22:50:55 +0100
committerMartin Polden <mpolden@mpolden.no>2023-12-14 22:52:42 +0100
commit27b990f30b993c06ff9db5e4d6a2b7e35575c3b6 (patch)
tree15a7aa7c1386f2342e24cb94de29f6345be12a7a
parentfc6ac09d93dbaa40401bb3d7d96c1ef0b265d7dc (diff)
aoc23: faster solution for day 4b
-rw-r--r--aoc23/day04_test.go19
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])
}