aoc/2021/7/main.go
2021-12-07 17:41:22 +01:00

63 lines
1.0 KiB
Go

package main
import (
aoc "AoC/2021/common"
"bufio"
"strconv"
"strings"
)
func findMinFuel(cf func (distance int) int) func (*bufio.Scanner) int {
return func (input *bufio.Scanner) int {
max := 0
input.Scan()
crabs := make(map[int] int)
for _, s := range strings.Split(input.Text(), ",") {
n, err := strconv.Atoi(s)
if err != nil {
panic(err)
}
if n > max {
max = n
}
crabs[n]++
}
// Loop over all possible options
costmin := -1
for i := 0; i <= max; i++ {
cost := 0
for p, n := range crabs {
distance := p - i
if distance < 0 {
distance = -distance
}
cost += cf(distance) * n
}
if cost < costmin || costmin == -1 {
costmin = cost
}
}
return costmin
}
}
func main() {
aoc := aoc.New(2021, 7)
aoc.Test(`16,1,2,0,4,2,7,1,2,14`, []int{37, 168})
aoc.Solution(1, findMinFuel(func (distance int) int {
return distance
}))
aoc.Solution(2, findMinFuel(func (distance int) int {
return distance * (distance + 1) / 2
}))
}