In [11]:
from enum import Enum
import sys

class Soda:
    def __init__(self, name, price):
        self.price = price
        self.name = name
        
    def __str__(self):
        return self.name

class Coin(Enum):
    cent = 1
    nickel = 5
    dime = 10
    quarter = 25
    def __str__(self):
        return name
    
class WendingMachine:
    def __init__(self):
        self.soda_inventory = {}
        self.coin_inventory = {}
        self.accepted_money = 0
        self.selected_soda = None
        self.incomplete_txn_coins = None
    def __str__(self):
        items = []
        for k,v in self.soda_inventory.iteritems():
            items.append(str(v) +" of "+k.name+" left" )
        items.append("******************************")
        for k,v in self.coin_inventory.iteritems():
            items.append(str(v) +" "+k.name+" left" )
        items.append("******************************")
        items.append("Soda: "+self.selected_soda.name if self.selected_soda.name is not None else "None Selected")
        items.append("******************************")
        items.append("TXN: "+ ", ".join([k.name for k in self.incomplete_txn_coins ])if self.incomplete_txn_coins is not None else "Txn not started")
        items.append("******************************")
        items.append("Accepted Money: "+ str(self.accepted_money)+" cents")
        items.append("******************************")

        return "\n".join(items)
        
    def select_soda_show_price(self, soda):
        self.selected_soda = soda
        return self.selected_soda.price
    
    def accept_money(self, coin_list):
        if self.incomplete_txn_coins is None:
            self.incomplete_txn_coins = coin_list
        else:
            self.incomplete_txn_coins.extend(coin_list)
            
        for coin in coin_list:
            self.accepted_money += coin.value
            self.coin_inventory[coin] =  self.coin_inventory.get(coin,0)+1
        
        return self.accepted_money >= self.selected_soda.price *100
            
    
    def calculate_return(self):
        return_amount = self.accepted_money - self.selected_soda.price*100
        temp_return = return_amount

        quarters=int(temp_return/Coin.quarter.value)
        temp_return = temp_return%Coin.quarter.value

        dimes = int(temp_return/Coin.dime.value)
        temp_return = temp_return%Coin.dime.value

        nickels = int(temp_return/Coin.nickel.value)
        cents = temp_return%Coin.nickel.value

        return [return_amount, (quarters, dimes, nickels, cents)]
    
    def return_money(self,coin_count):
        quarters,dimes,nickels,cents = coin_count
        self.coin_inventory[quarters] -= quarters
        self.coin_inventory[dimes] -= dimes
        self.coin_inventory[nickels] -= nickels
        self.coin_inventory[dimes] -= dimes

    def cancel_txn(self):
        self.return_money(self.incomplete_txn_coins)
        quarters = filter(lambda x: x is )
        self.incomplete_txn_coins = None
        self.selected_soda = None
        self.accepted_money = 0
        
    def transaction_complete(self):
        self.accepted_money = 0
        self.incomplete_txn_coins = None

In [14]:
w = WendingMachine()
coke = Soda("Coke",1.25)
pepsi = Soda("Pepsi",1.19)
md = Soda("Mountain Dew",.99)
mp = Soda("Mr.Pepper",1.25)

w.soda_inventory = {coke:100, pepsi:100, md:50, mp :75}
w.coin_inventory = {Coin.quarter:1000, Coin.dime:1000, Coin.nickel:1000, Coin.cent:10000}
w.select_soda_show_price(coke)
print w.accept_money([Coin.quarter, Coin.quarter, Coin.quarter])
print w.accept_money([Coin.quarter, Coin.dime])
print w.accept_money([Coin.quarter])
print w.accepted_money, w.incomplete_txn_coins
print w.calculate_return()
print w.cancel_txn()


False
False
True
135 [<Coin.quarter: 25>, <Coin.quarter: 25>, <Coin.quarter: 25>, <Coin.quarter: 25>, <Coin.dime: 10>, <Coin.quarter: 25>]
[10.0, (0, 1, 0, 0.0)]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-69d2de39c6ce> in <module>()
     13 print w.accepted_money, w.incomplete_txn_coins
     14 print w.calculate_return()
---> 15 print w.cancel_txn()

<ipython-input-11-c242c50e08c7> in cancel_txn(self)
     82 
     83     def cancel_txn(self):
---> 84         self.return_money(self.incomplete_txn_coins)
     85         self.incomplete_txn_coins = None
     86         self.selected_soda = None

<ipython-input-11-c242c50e08c7> in return_money(self, coin_count)
     75 
     76     def return_money(self,coin_count):
---> 77         quarters,dimes,nickels,cents = coin_count
     78         self.coin_inventory[quarters] -= quarters
     79         self.coin_inventory[dimes] -= dimes

ValueError: too many values to unpack

In [6]:
print w


100 of Pepsi left
75 of Mr.Pepper left
50 of Mountain Dew left
100 of Coke left
******************************
1005 quarter left
1000 nickel left
10000 cent left
1001 dime left
******************************
Soda: Coke
******************************
TXN: quarter, quarter, quarter, quarter, dime, quarter
******************************
Accepted Money: 135 cents
******************************

In [7]:
def calculate_return(return_amount):
#         return_amount = self.accepted_money = self.selected_soda.price
    temp_return = return_amount

    quarters=temp_return/Coin.quarter.value
    temp_return = temp_return%Coin.quarter.value

    dimes = temp_return/Coin.dime.value
    temp_return = temp_return%Coin.dime.value

    nickels = temp_return/Coin.nickel.value
    cents = temp_return%Coin.nickel.value

    return quarters, dimes, nickels, cents

calculate_return(624)


Out[7]:
(24, 2, 0, 4)

In [108]:
37%25 == 37-(37/25)*25


Out[108]:
True

In [ ]: