package main import ( "bufio" "fmt" "log" "os" ) func calcFuel(mass int) int { return (mass / 3) - 2 } type Module struct { Mass int } func (m Module) RequiredFuel() (int, int) { base := calcFuel(m.Mass) var extra int e := calcFuel(base) for e >= 0 { extra += e e = calcFuel(e) } return base, extra } type ModuleStack []Module func (ms ModuleStack) RequiredFuel() (int, int) { var base, extra int for _, m := range ms { b, e := m.RequiredFuel() base += b extra += e } return base, extra } func main() { input, err := os.Open("input.txt") if err != nil { log.Fatal(fmt.Errorf("could not open input file: %w", err)) } defer input.Close() var stack ModuleStack scanner := bufio.NewScanner(input) for scanner.Scan() { var mass int fmt.Sscanf(scanner.Text(), "%d", &mass) stack = append(stack, Module{ Mass: mass, }) } if err := scanner.Err(); err != nil { log.Fatal(fmt.Errorf("error while scanning input: %w", err)) } b, e := stack.RequiredFuel() log.Printf("required fuel: %d, %d => %d", b, e, b+e) }