Retrofit 2019 1 ruby
This commit is contained in:
parent
f10e57eb79
commit
c368f223c4
7
ruby/2019/1/bin/problem
Normal file
7
ruby/2019/1/bin/problem
Normal 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}"
|
||||
|
||||
20
ruby/2019/1/lib/rocket_equation.rb
Normal file
20
ruby/2019/1/lib/rocket_equation.rb
Normal 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
|
||||
@ -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}"
|
||||
26
ruby/2019/1/test/test_rocket_equation.rb
Normal file
26
ruby/2019/1/test/test_rocket_equation.rb
Normal 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
|
||||
Loading…
Reference in New Issue
Block a user