import collections
class ShoppingCard():
def __init__(self, tours, buyNgetM, bulkDiscount, freeTour):
self.tours = tours
self.buyNgetM = buyNgetM
self.bulkDiscount = bulkDiscount
self.freeTour = freeTour
def calc_price(self, userInput):
orders = userInput.split()
cOrders = collections.Counter(orders)
for t, n, m in self.buyNgetM:
if int(cOrders[t] - (cOrders[t] / m)) != 0 and cOrders[t] >= m:
cOrders[t] = int(cOrders[t] - (cOrders[t] / m))
for buy, free in self.freeTour:
if free in cOrders:
cOrders[free] = cOrders[free] -cOrders[buy]
if cOrders[free] < 0:
del cOrders[free]
price = 0
for k, v in cOrders.items():
if v != 0:
price += self.tours[k]*v
for t, n, discount in self.bulkDiscount:
if t in cOrders and cOrders[t] > n:
price -= cOrders[t]*discount
return price
def buy_n_get_m(self, tour, n, m):
self.buyNgetM.append([tour, n, m])
def add_bulk_discount(self, tour, n, discount):
self.bulkDiscount.append([tour, n, discount])
def free_for_sold(self, buyT, freeT):
self.freeTour.append([buyT, freeT])
def add(self, tour, price):
self.tours[tour] = price
database = {'OH': 300.00, 'BC': 110.00, 'SK': 30.00}
rBuyNgetM = [['OH', 2, 3]]
rBulkDiscount = [['BC', 4, 20.00]]
rfreeTour = [['OH', 'SK']]
sp = ShoppingCard(database, rBuyNgetM, rBulkDiscount, rfreeTour)
print(sp.calc_price('OH OH OH BC'))
print(sp.calc_price('OH SK'))
print(sp.calc_price('BC BC BC BC BC OH'))
print(sp.calc_price('OH OH OH BC SK'))
print(sp.calc_price('OH BC BC SK SK'))
print(sp.calc_price('BC BC BC BC BC BC OH OH'))
print(sp.calc_price('SK SK BC'))
sp.add('AA', 200.00)
sp.add('BB', 1350.00)
print(sp.calc_price('OH OH AA AA AA'))
print(sp.calc_price('AA BB OH'))
aW1wb3J0IGNvbGxlY3Rpb25zCgpjbGFzcyBTaG9wcGluZ0NhcmQoKToKCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdXJzLCBidXlOZ2V0TSwgYnVsa0Rpc2NvdW50LCBmcmVlVG91cik6CiAgICAgICAgc2VsZi50b3VycyA9IHRvdXJzCiAgICAgICAgc2VsZi5idXlOZ2V0TSA9IGJ1eU5nZXRNCiAgICAgICAgc2VsZi5idWxrRGlzY291bnQgPSBidWxrRGlzY291bnQKICAgICAgICBzZWxmLmZyZWVUb3VyID0gZnJlZVRvdXIKCiAgICBkZWYgY2FsY19wcmljZShzZWxmLCB1c2VySW5wdXQpOgogICAgICAgIG9yZGVycyA9IHVzZXJJbnB1dC5zcGxpdCgpCiAgICAgICAgY09yZGVycyA9IGNvbGxlY3Rpb25zLkNvdW50ZXIob3JkZXJzKQoKICAgICAgICBmb3IgdCwgbiwgbSBpbiBzZWxmLmJ1eU5nZXRNOgogICAgICAgICAgICAgICAgaWYgaW50KGNPcmRlcnNbdF0gLSAoY09yZGVyc1t0XSAvIG0pKSAhPSAwIGFuZCBjT3JkZXJzW3RdID49IG06CiAgICAgICAgICAgICAgICAgICAgY09yZGVyc1t0XSA9IGludChjT3JkZXJzW3RdIC0gKGNPcmRlcnNbdF0gLyBtKSkKCiAgICAgICAgZm9yIGJ1eSwgZnJlZSBpbiBzZWxmLmZyZWVUb3VyOgogICAgICAgICAgICBpZiBmcmVlIGluIGNPcmRlcnM6CiAgICAgICAgICAgICAgICBjT3JkZXJzW2ZyZWVdID0gY09yZGVyc1tmcmVlXSAtY09yZGVyc1tidXldCiAgICAgICAgICAgICAgICBpZiBjT3JkZXJzW2ZyZWVdIDwgMDoKICAgICAgICAgICAgICAgICAgICBkZWwgY09yZGVyc1tmcmVlXQoKICAgICAgICBwcmljZSA9IDAKICAgICAgICBmb3IgaywgdiBpbiBjT3JkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIHYgIT0gMDoKICAgICAgICAgICAgICAgIHByaWNlICs9IHNlbGYudG91cnNba10qdgoKICAgICAgICBmb3IgdCwgbiwgZGlzY291bnQgaW4gc2VsZi5idWxrRGlzY291bnQ6CiAgICAgICAgICAgIGlmIHQgaW4gY09yZGVycyBhbmQgY09yZGVyc1t0XSA+IG46CiAgICAgICAgICAgICAgICBwcmljZSAtPSBjT3JkZXJzW3RdKmRpc2NvdW50CgogICAgICAgIHJldHVybiBwcmljZQoKICAgIGRlZiBidXlfbl9nZXRfbShzZWxmLCB0b3VyLCBuLCBtKToKICAgICAgICBzZWxmLmJ1eU5nZXRNLmFwcGVuZChbdG91ciwgbiwgbV0pCgogICAgZGVmIGFkZF9idWxrX2Rpc2NvdW50KHNlbGYsIHRvdXIsIG4sIGRpc2NvdW50KToKICAgICAgICBzZWxmLmJ1bGtEaXNjb3VudC5hcHBlbmQoW3RvdXIsIG4sIGRpc2NvdW50XSkKCiAgICBkZWYgZnJlZV9mb3Jfc29sZChzZWxmLCBidXlULCBmcmVlVCk6CiAgICAgICAgc2VsZi5mcmVlVG91ci5hcHBlbmQoW2J1eVQsIGZyZWVUXSkKCiAgICBkZWYgYWRkKHNlbGYsIHRvdXIsIHByaWNlKToKICAgICAgICBzZWxmLnRvdXJzW3RvdXJdID0gcHJpY2UKCgpkYXRhYmFzZSA9IHsnT0gnOiAzMDAuMDAsICdCQyc6IDExMC4wMCwgJ1NLJzogMzAuMDB9CnJCdXlOZ2V0TSA9IFtbJ09IJywgMiwgM11dCnJCdWxrRGlzY291bnQgPSBbWydCQycsIDQsIDIwLjAwXV0KcmZyZWVUb3VyID0gW1snT0gnLCAnU0snXV0Kc3AgPSBTaG9wcGluZ0NhcmQoZGF0YWJhc2UsIHJCdXlOZ2V0TSwgckJ1bGtEaXNjb3VudCwgcmZyZWVUb3VyKQpwcmludChzcC5jYWxjX3ByaWNlKCdPSCBPSCBPSCBCQycpKQpwcmludChzcC5jYWxjX3ByaWNlKCdPSCBTSycpKQpwcmludChzcC5jYWxjX3ByaWNlKCdCQyBCQyBCQyBCQyBCQyBPSCcpKQpwcmludChzcC5jYWxjX3ByaWNlKCdPSCBPSCBPSCBCQyBTSycpKQpwcmludChzcC5jYWxjX3ByaWNlKCdPSCBCQyBCQyBTSyBTSycpKQpwcmludChzcC5jYWxjX3ByaWNlKCdCQyBCQyBCQyBCQyBCQyBCQyBPSCBPSCcpKQpwcmludChzcC5jYWxjX3ByaWNlKCdTSyBTSyBCQycpKQpzcC5hZGQoJ0FBJywgMjAwLjAwKQpzcC5hZGQoJ0JCJywgMTM1MC4wMCkKcHJpbnQoc3AuY2FsY19wcmljZSgnT0ggT0ggQUEgQUEgQUEnKSkKcHJpbnQoc3AuY2FsY19wcmljZSgnQUEgQkIgT0gnKSk=