Retrofit 2019 1 ruby

This commit is contained in:
Bill Rossi 2025-12-05 20:09:29 -05:00
parent f10e57eb79
commit c368f223c4
4 changed files with 53 additions and 46 deletions

7
ruby/2019/1/bin/problem Normal file
View File

@ -0,0 +1,7 @@
#!/usr/bin/env ruby
require "rocket_equation"
rockets = STDIN.read.chomp.split("\n").map { |line| RocketEquation.for line }
puts "Part 1: #{rockets.map(&:fuel_required).sum}"
puts "Part 2: #{rockets.map(&:more_fuel_required).sum}"

View File

@ -0,0 +1,20 @@
class RocketEquation
attr_reader :mass
def initialize(mass)
@mass = mass
end
def self.for(line)
new line.to_i
end
def fuel_required
[(mass / 3) - 2, 0].max
end
def more_fuel_required
return 0 unless mass.positive?
fuel_required + RocketEquation.new(fuel_required).more_fuel_required
end
end

View File

@ -1,46 +0,0 @@
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}"

View File

@ -0,0 +1,26 @@
require "minitest/autorun"
require "rocket_equation"
class TestRocketEquation < Minitest::Test
def assert_fuel_required(fuel, mass)
assert_equal(fuel, RocketEquation.for(mass).fuel_required)
end
def test_fuel_required
assert_fuel_required(2, 12)
assert_fuel_required(2, 14)
assert_fuel_required(654, 1969)
assert_fuel_required(33583, 100756)
end
def assert_more_fuel_required(fuel, mass)
assert_equal(fuel, RocketEquation.for(mass).more_fuel_required)
end
def test_more_fuel_required
assert_more_fuel_required(2, 12)
assert_more_fuel_required(2, 14)
assert_more_fuel_required(966, 1969)
assert_more_fuel_required(50346, 100756)
end
end