1
0
Fork 0
mirror of https://github.com/Luzifer/aoc2019.git synced 2024-12-22 22:11:16 +00:00
aoc2019/day01.go

60 lines
1.2 KiB
Go
Raw Normal View History

2019-12-01 13:28:58 +00:00
package aoc2019
import (
"bufio"
"os"
"strconv"
"github.com/pkg/errors"
)
func calculateDay1FuelForMass(mass int64) int64 {
return mass/3 - 2
}
func calculateDay1FuelForMassRecurse(mass int64) int64 {
sumFuel := mass/3 - 2
var addFuel = calculateDay1FuelForMass(sumFuel)
for addFuel > 0 {
sumFuel += addFuel
addFuel = calculateDay1FuelForMass(addFuel)
}
return sumFuel
}
func solveDay1FromInput(inFile string, sumFn func(int64) int64) (int64, error) {
f, err := os.Open(inFile)
if err != nil {
return 0, errors.Wrap(err, "Unable to open input file")
}
defer f.Close()
var sumFuel int64
scanner := bufio.NewScanner(f)
for scanner.Scan() {
if scanner.Err() != nil {
return 0, errors.Wrap(err, "Unable to scan file")
}
mass, err := strconv.ParseInt(scanner.Text(), 10, 64)
if err != nil {
return 0, errors.Wrapf(err, "Unable to parse integer input %q", scanner.Text())
}
sumFuel += sumFn(mass)
}
return sumFuel, nil
}
func solveDay1Part1(inFile string) (int64, error) {
return solveDay1FromInput(inFile, calculateDay1FuelForMass)
}
func solveDay1Part2(inFile string) (int64, error) {
return solveDay1FromInput(inFile, calculateDay1FuelForMassRecurse)
}