chore: make reduce more iter.Seq

This commit is contained in:
xuu 2024-12-01 11:37:27 -07:00
parent 0d652660f1
commit 4b3fc7eb73
Signed by: xuu
GPG Key ID: 8B3B0604F164E04F
3 changed files with 18 additions and 5 deletions

View File

@ -4,6 +4,7 @@ import (
"bufio" "bufio"
_ "embed" _ "embed"
"fmt" "fmt"
"slices"
"strings" "strings"
aoc "go.sour.is/advent-of-code" aoc "go.sour.is/advent-of-code"
@ -62,7 +63,7 @@ func run(scan *bufio.Scanner) (*result, error) {
func(i int, v int, counts [3]int) [3]int { func(i int, v int, counts [3]int) [3]int {
counts[v]++ counts[v]++
return counts return counts
}, [3]int{}, maps.Values(memo)...) }, [3]int{}, slices.Values(maps.Values(memo)))
// fmt.Println(i, counts) // fmt.Println(i, counts)
i = 1_000_000_000 - (1_000_000_000-counts[0]-counts[1])%counts[2] i = 1_000_000_000 - (1_000_000_000-counts[0]-counts[1])%counts[2]

View File

@ -32,14 +32,14 @@ func run(scan *bufio.Scanner) (*result, error) {
r.valuePT1 = aoc.Reduce(func(i int, t string, sum int) int { r.valuePT1 = aoc.Reduce(func(i int, t string, sum int) int {
sum += hash(t) sum += hash(t)
return sum return sum
}, 0, ops...) }, 0, slices.Values(ops))
} }
var boxen boxes var boxen boxes
boxen = aoc.Reduce(func(i int, op string, b boxes) boxes { boxen = aoc.Reduce(func(i int, op string, b boxes) boxes {
return b.Op(op) return b.Op(op)
}, boxen, ops...) }, boxen, slices.Values(ops))
r.valuePT2 = boxen.Sum() r.valuePT2 = boxen.Sum()

View File

@ -1,6 +1,7 @@
package aoc package aoc
import ( import (
"iter"
"strconv" "strconv"
) )
@ -17,8 +18,8 @@ func Repeat[T any](s T, i int) []T {
return lis return lis
} }
func Reduce[T, U any](fn func(int, T, U) U, u U, list ...T) U { func Reduce[T, U any](fn func(int, T, U) U, u U, list iter.Seq[T]) U {
for i, t := range list { for i, t := range Enumerate(list) {
u = fn(i, t, u) u = fn(i, t, u)
} }
return u return u
@ -54,3 +55,14 @@ func Pairwise[T any](arr []T) [][2]T {
} }
return pairs return pairs
} }
func Enumerate[T any](arr iter.Seq[T]) iter.Seq2[int, T] {
return func(yield func(int, T) bool) {
i := 0
for v := range arr {
if !yield(i, v) {
return
}
}
}
}