Skip to content

Instantly share code, notes, and snippets.

@davidvandusen
Last active August 29, 2015 14:15
Show Gist options
  • Save davidvandusen/2c47132c6a4eced154c2 to your computer and use it in GitHub Desktop.
Save davidvandusen/2c47132c6a4eced154c2 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
class PoppinBottles
def self.run
loop do
print "\nNumber of dollars to invest: $"
input = gets.chomp
begin
dollars = Float(input)
rescue
puts "Error: '#{input}' is not a valid number"
next
end
begin
print_redemption_summary RedeemingCusomer.new dollars
rescue => err
puts "Error: #{err.message}"
end
end
end
private
def self.print_redemption_summary(customer)
puts "For their investment of $#{'%.02f' % customer.dollars_invested} the customer got a total of #{customer.total_bottles} #{customer.total_bottles == 1 ? 'bottle' : 'bottles'} of pop."
puts "#{customer.bottles_purchased} #{customer.bottles_purchased == 1 ? 'bottle was' : 'bottles were'} purchased."
puts "#{customer.bottles_from_bottle_redemption} #{customer.bottles_from_bottle_redemption == 1 ? 'bottle was' : 'bottles were'} gained through bottle recycling."
puts "#{customer.bottles_from_cap_redemption} #{customer.bottles_from_cap_redemption == 1 ? 'bottle was' : 'bottles were'} gained through cap recycling."
puts "The customer has #{customer.bottles} #{customer.bottles == 1 ? 'bottle' : 'bottles'} left over."
puts "The customer has #{customer.caps} #{customer.caps == 1 ? 'cap' : 'caps'} left over."
puts "The customer has $#{'%.02f' % customer.dollars} left over."
end
end
class RedeemingStore
@@bottle_purchase_price = 2.0
@@redemption_rates = {
bottles: 2,
caps: 4
}
def self.bottle_purchase_price
@@bottle_purchase_price
end
def self.redemption_rate(item)
@@redemption_rates[item]
end
end
class RedeemingCusomer
attr_reader :dollars_invested, :bottles_purchased, :dollars
def initialize(dollars)
@dollars_invested = dollars.round(2)
unless @dollars_invested > 0.0
raise 'dollars must be greater than 0.00'
end
@bottles_purchased = (@dollars_invested / RedeemingStore::bottle_purchase_price).floor
@dollars = @dollars_invested - @bottles_purchased * RedeemingStore::bottle_purchase_price
@inventory = {
bottles: @bottles_purchased,
caps: @bottles_purchased
}
@bottles_from_redemption = {
bottles: 0,
caps: 0
}
redeem if can_redeem?
end
def total_bottles
@bottles_purchased + @bottles_from_redemption[:bottles] + @bottles_from_redemption[:caps]
end
def bottles
@inventory[:bottles]
end
def caps
@inventory[:caps]
end
def bottles_from_bottle_redemption
@bottles_from_redemption[:bottles]
end
def bottles_from_cap_redemption
@bottles_from_redemption[:caps]
end
private
def redeem
redeem_items :bottles
redeem_items :caps
redeem if can_redeem?
end
def redeem_items(item)
new_bottles = @inventory[item] / RedeemingStore::redemption_rate(item)
@inventory[item] -= new_bottles * RedeemingStore::redemption_rate(item)
@inventory[:bottles] += new_bottles
@inventory[:caps] += new_bottles
@bottles_from_redemption[item] += new_bottles
end
def can_redeem?
@inventory[:bottles] >= RedeemingStore::redemption_rate(:bottles) || @inventory[:caps] >= RedeemingStore::redemption_rate(:caps)
end
end
if __FILE__ == $PROGRAM_NAME
PoppinBottles.run
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment