63 lines
1.0 KiB
Go
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
|
|
}))
|
|
}
|