diff --git a/ruby/2019/1/bin/problem b/ruby/2019/1/bin/problem new file mode 100644 index 0000000..7bb738b --- /dev/null +++ b/ruby/2019/1/bin/problem @@ -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}" + diff --git a/ruby/2019/1/lib/rocket_equation.rb b/ruby/2019/1/lib/rocket_equation.rb new file mode 100644 index 0000000..46beb6e --- /dev/null +++ b/ruby/2019/1/lib/rocket_equation.rb @@ -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 diff --git a/ruby/2019/1/main.rb b/ruby/2019/1/main.rb deleted file mode 100644 index 73d0afa..0000000 --- a/ruby/2019/1/main.rb +++ /dev/null @@ -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}" diff --git a/ruby/2019/1/test/test_rocket_equation.rb b/ruby/2019/1/test/test_rocket_equation.rb new file mode 100644 index 0000000..819f8d4 --- /dev/null +++ b/ruby/2019/1/test/test_rocket_equation.rb @@ -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