Last active
August 29, 2015 14:15
-
-
Save davidvandusen/2c47132c6a4eced154c2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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