Skip to content

Instantly share code, notes, and snippets.

@serradura
Last active January 15, 2023 21:24
Show Gist options
  • Select an option

  • Save serradura/2d9cab9a1f0975ba1e0a0bbd53ea8fa9 to your computer and use it in GitHub Desktop.

Select an option

Save serradura/2d9cab9a1f0975ba1e0a0bbd53ea8fa9 to your computer and use it in GitHub Desktop.

Revisions

  1. serradura revised this gist Jan 15, 2023. 1 changed file with 35 additions and 0 deletions.
    35 changes: 35 additions & 0 deletions iteration_05.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    class AssemblyLine
    SuccessRate = Struct.new(:speed, :percentage, keyword_init: true) do
    private_class_method :new

    @options = [
    new(speed: 1..4, percentage: 1.00),
    new(speed: 5..8, percentage: 0.90),
    new(speed: 9, percentage: 0.80),
    new(speed: 10, percentage: 0.77)
    ].map!(&:freeze).freeze

    def self.detect_for(speed)
    @options.detect { |rate| rate.speed === speed }
    end
    end

    attr_reader :speed, :success_rate

    def initialize(speed)
    @speed = speed
    @success_rate = SuccessRate.detect_for(speed)
    end

    CARS_PRODUCED_PER_HOUR = 221.0

    def production_rate_per_hour
    @production_rate_per_hour ||= (CARS_PRODUCED_PER_HOUR * speed) * success_rate.percentage
    end

    ONE_HOUR_IN_MINUTES = 60

    def working_items_per_minute
    @working_items_per_minute ||= (production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i
    end
    end
  2. serradura created this gist Jan 14, 2023.
    34 changes: 34 additions & 0 deletions iteration_01.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    class AssemblyLine
    CARS_PRODUCED_PER_HOUR = 221.0

    def self.calculate_cars_per_hour(speed)
    speed * CARS_PRODUCED_PER_HOUR
    end

    def self.calculate_success_rate(speed)
    case speed
    when 1..4 then 1
    when 5..8 then 0.9
    when 9 then 0.8
    when 10 then 0.77
    end
    end

    def self.calculate_production_rate_per_hour(speed)
    calculate_cars_per_hour(speed) * calculate_success_rate(speed)
    end

    def initialize(speed)
    @speed = speed
    end

    def production_rate_per_hour
    self.class.calculate_production_rate_per_hour(@speed)
    end

    ONE_HOUR_IN_MINUTES = 60

    def working_items_per_minute
    (production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i
    end
    end
    32 changes: 32 additions & 0 deletions iteration_02.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,32 @@
    class AssemblyLine
    module Calculate
    def self.cars_per_hour(speed)
    speed * 221.0
    end

    def self.success_rate(speed)
    case speed
    when 1..4 then 1
    when 5..8 then 0.9
    when 9 then 0.8
    when 10 then 0.77
    end
    end

    def self.production_rate_per_hour(speed)
    cars_per_hour(speed) * success_rate(speed)
    end
    end

    attr_reader :production_rate_per_hour

    def initialize(speed)
    @production_rate_per_hour = Calculate.production_rate_per_hour(speed)
    end

    ONE_HOUR_IN_MINUTES = 60

    def working_items_per_minute
    @working_items_per_minute ||= (production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i
    end
    end
    33 changes: 33 additions & 0 deletions iteration_03.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,33 @@
    class AssemblyLine
    SuccessRate = Struct.new(:speed, :percentage, keyword_init: true) do
    @options = [
    { speed: 1..4, percentage: 1.00 },
    { speed: 5..8, percentage: 0.90 },
    { speed: 9, percentage: 0.80 },
    { speed: 10, percentage: 0.77 }
    ].map! { |config| new(**config).freeze }.freeze

    def self.detect_for(speed)
    @options.find { |rate| rate.speed === speed }
    end
    end

    attr_reader :speed, :success_rate

    def initialize(speed)
    @speed = speed
    @success_rate = SuccessRate.detect_for(speed)
    end

    CARS_PRODUCED_PER_HOUR = 221.0

    def production_rate_per_hour
    @production_rate_per_hour ||= (CARS_PRODUCED_PER_HOUR * speed) * success_rate.percentage
    end

    ONE_HOUR_IN_MINUTES = 60

    def working_items_per_minute
    @working_items_per_minute ||= (production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i
    end
    end
    33 changes: 33 additions & 0 deletions iteration_04.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,33 @@
    class AssemblyLine
    SuccessRate = Struct.new(:speed, :percentage, keyword_init: true) do
    @options = [
    new(speed: 1..4, percentage: 1.00),
    new(speed: 5..8, percentage: 0.90),
    new(speed: 9, percentage: 0.80),
    new(speed: 10, percentage: 0.77)
    ].map!(&:freeze).freeze

    def self.detect_for(speed)
    @options.detect { |rate| rate.speed === speed }
    end
    end

    attr_reader :speed, :success_rate

    def initialize(speed)
    @speed = speed
    @success_rate = SuccessRate.detect_for(speed)
    end

    CARS_PRODUCED_PER_HOUR = 221.0

    def production_rate_per_hour
    @production_rate_per_hour ||= (CARS_PRODUCED_PER_HOUR * speed) * success_rate.percentage
    end

    ONE_HOUR_IN_MINUTES = 60

    def working_items_per_minute
    @working_items_per_minute ||= (production_rate_per_hour / ONE_HOUR_IN_MINUTES).to_i
    end
    end