class Module attr_reader :mass def initialize(mass) @mass = mass end def fuel_required (mass / 3) - 2 end def self.for(string) new(string.to_i) end end class Modules attr_reader :modules def initialize(modules) @modules = modules end def self.from_file(filename, module_type) new(File.read(filename).split.map{ |mass| module_type.for mass }) end def total_fuel_required @modules.map(&:fuel_required).sum end end class HeavyFuelModule < Module def fuel_required super + Fuel.new(super).fuel_required end end class Fuel < Module def fuel_required return 0 if super < 0 super + Fuel.new(super).fuel_required end end puts "Part 1: #{Modules.from_file("../data/2019/1/input.txt", Module).total_fuel_required}" puts "Part 2: #{Modules.from_file("../data/2019/1/input.txt", HeavyFuelModule).total_fuel_required}"