package main
import (
"io"
"log"
"os"
"strconv"
"strings"
)
func main() {
if err := myMain(); err != nil {
log.Println(err)
}
}
func myMain() error {
// parse input.txt
crabs, err := parseInput("input.txt")
if err != nil {
return err
}
log.Println(solveFirst(crabs))
log.Println(solveSecond(crabs))
return nil
}
func solveFirst(crabs []int) int {
var least int
for i := 0; ; i++ {
var fuel int
for _, crab := range crabs {
fuel += abs(crab - i)
}
if i == 0 {
least = fuel
continue
}
if fuel < least {
least = fuel
} else {
break
}
}
return least
}
func solveSecond(crabs []int) int {
var least int
for i := 0; ; i++ {
var fuel int
for _, crab := range crabs {
diff := abs(crab - i)
if diff == 0 {
continue
}
fuel += (diff * (diff + 1)) / 2 // Gauss would be proud :-)
}
if i == 0 {
least = fuel
continue
}
if fuel < least {
least = fuel
} else {
break
}
}
return least
}
func abs(a int) int {
if a < 0 {
return -a
}
return a
}
func parseInput(fileName string) ([]int, error) {
var ret []int
fd, err := os.Open(fileName)
if err != nil {
return ret, err
}
defer fd.Close()
input, err := io.ReadAll(fd)
if err != nil {
return nil, err
}
instr := strings.Split(strings.TrimSuffix(string(input), "\n"), ",")
for _, elem := range instr {
tmp, err := strconv.Atoi(elem)
if err != nil {
return nil, err
}
ret = append(ret, tmp)
}
return ret, nil
}