Day 7 solution
This commit is contained in:
70
seven/crabs.go
Normal file
70
seven/crabs.go
Normal file
@@ -0,0 +1,70 @@
|
||||
package seven
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"math"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type crabs struct {
|
||||
crabs map[int]int
|
||||
count int
|
||||
max int
|
||||
}
|
||||
|
||||
func (c *crabs) load(filename string) error {
|
||||
c.crabs = map[int]int{}
|
||||
|
||||
file, err := os.Open(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
initialPositions := strings.Split(scanner.Text(), ",")
|
||||
for _, n := range initialPositions {
|
||||
position, err := strconv.Atoi(n)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if position > c.max {
|
||||
c.max = position
|
||||
}
|
||||
|
||||
c.crabs[position]++
|
||||
}
|
||||
|
||||
for _, count := range c.crabs {
|
||||
c.count += count
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *crabs) align(notConstant bool) (fuel int) {
|
||||
for i := 0; i < c.max; i++ {
|
||||
fuelUsed := 0
|
||||
for k, count := range c.crabs {
|
||||
fuelPerCrab := int(math.Abs(float64(i - k)))
|
||||
|
||||
if notConstant {
|
||||
for i := fuelPerCrab - 1; i > 0; i-- {
|
||||
fuelPerCrab += i
|
||||
}
|
||||
}
|
||||
|
||||
fuelUsed += fuelPerCrab * count
|
||||
}
|
||||
|
||||
if i == 0 || fuelUsed < fuel {
|
||||
fuel = fuelUsed
|
||||
}
|
||||
}
|
||||
|
||||
return fuel
|
||||
}
|
Reference in New Issue
Block a user