题解 | #自动售货系统#

自动售货系统

https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf

class Vending_Machine(object):
    def __init__(self):
        # 投币余额
        self.amts = 0
        self.goods = {
            "A1": [2, 0],
            "A2": [3, 0],
            "A3": [4, 0],
            "A4": [5, 0],
            "A5": [8, 0],
            "A6": [6, 0]
        }
        self.box = {"1": 0, "2": 0, "5": 0, "10": 0}

    # 投币
    def insert_coin(self, amt):
        if amt not in [10, 5, 2, 1]:
            print("E002:Denomination error")
        elif amt > 2 and amt > self.box["1"] + self.box["2"] * 2:
            print("E003:Change is not enough, pay fail")
        elif sum([i[1][1] for i in self.goods.items()]) == 0:
            print("E005:All the goods sold out")
        else:
            self.amts += amt
            self.box[str(amt)] += 1
            print(f"S002:Pay success,balance={self.amts}")

    # 购买商品
    def purchase_goods(self, good):
        if good not in [key for key in self.goods]:
            print("E006:Goods does not exist")
        elif self.goods[good][1] == 0:
            print("E007:The goods sold out")
        elif self.amts < self.goods[good][0]:
            print("E008:Lack of balance")
        else:
            self.goods[good][1] -= 1
            self.amts -= self.goods[good][0]
            print(f"S003:Buy success,balance={self.amts}")

    # 退币
    def return_coin(self):
        res = []
        if self.amts == 0:
            print("E009:Work failure")
            return
        if self.amts >= 10 and self.box["10"] > 0:
            m, self.amts = divmod(self.amts, 10)
            if m > self.box["10"]:
                self.amts += (m - self.box["10"]) * 10 + self.amts
                res.append(f"10 yuan coin number={self.box['10']}")
                self.box["10"] = 0
            else:
                self.box["10"] -= m
                res.append(f"10 yuan coin number={m}")
        else:
            res.append(f"10 yuan coin number=0")
        if self.amts >= 5 and self.box["5"] > 0:
            m, self.amts = divmod(self.amts, 5)
            if m > self.box["5"]:
                self.amts += (m - self.box["5"]) * 5 + self.amts
                res.append(f"5 yuan coin number={self.box['5']}")
                self.box["5"] = 0
            else:
                self.box["5"] -= m
                res.append(f"5 yuan coin number={m}")
        else:
            res.append(f"5 yuan coin number=0")
        if self.amts >= 2 and self.box["2"] > 0:
            m, self.amts = divmod(self.amts, 2)
            if m > self.box["2"]:
                self.amts += (m - self.box["2"]) * 2 + self.amts
                res.append(f"2 yuan coin number={self.box['2']}")
                self.box["2"] = 0
            else:
                self.box["2"] -= m
                res.append(f"2 yuan coin number={m}")
        else:
            res.append(f"2 yuan coin number=0")
        if self.amts >= 1 and self.box["1"] > 0:
            if self.amts > self.box["1"]:
                # 则说明自动售货即钱不够了
                self.amts = 0
                res.append(f"1 yuan coin number={self.box['1']}")
                self.box["1"] = 0
            else:
                # 说明自动售货即钱够
                self.box["1"] -= self.amts
                res.append(f"1 yuan coin number={self.amts}")
                self.amts = 0
        else:
            res.append(f"1 yuan coin number=0")
        for line in reversed(res):
            print(line)

    # 查询
    def check(self, opt):
        goods = sorted(self.goods.items(), key=lambda x: x[1][1], reverse=True)
        coins = sorted(self.box.items(), key=lambda x: int(x[0]))
        # 查询库存商品
        if opt == "0":
            for tem in goods:
                print("{} {} {}".format(tem[0], tem[1][0], tem[1][1]))
        # 查询存钱盒
        if opt == "1":
            for coin in coins:
                print("{} yuan coin number={}".format(coin[0], coin[1]))

    # 初始化商品和存钱罐
    def set_goods_box(self, goods_nums, coin_nums):
        a, b, c, d, e, f = goods_nums
        self.goods = {
            "A1": [2, a],
            "A2": [3, b],
            "A3": [4, c],
            "A4": [5, d],
            "A5": [8, e],
            "A6": [6, f],
        }
        h, i, j, k = coin_nums
        self.box = {"1": h, "2": i, "5": j, "10": k}


# r 22-18-21-21-7-20 3-23-10-6;c;q0;p 1;b A6;c;b A5;b A1;c;q1;p 5;
vendint = Vending_Machine()
command = input().split(";")[:-1]
# command = 'r 26-3-26-2-14-10 2-1-15-18;p 5;'.split(';')[:-1]
# command = 'r 22-18-21-21-7-20 3-23-10-6;q 1;q 0;'.split(';')[:-1]
for line in command:
    line = line.split()
    if line[0] == "r":
        goods_nums = list(map(int, line[1].split("-")))
        coin_nums = list(map(int, line[2].split("-")))
        vendint.set_goods_box(goods_nums, coin_nums)
        print("S001:Initialization is successful")
    elif line[0] == "p":
        vendint.insert_coin(int(line[1]))
    elif line[0] == "b":
        vendint.purchase_goods(line[1])
    elif line[0] == "c":
        vendint.return_coin()
    elif line[0] == "q":
        vendint.check(line[1])
    else:
        print("E010:Parameter error")

全部评论

相关推荐

11-09 01:22
已编辑
东南大学 Java
高级特工穿山甲:羡慕,我秋招有家企业在茶馆组织线下面试,约我过去“喝茶详谈”😢结果我去了发现原来是人家喝茶我看着
点赞 评论 收藏
分享
10-04 17:25
门头沟学院 Java
snqing:Java已经饱和了,根本不缺人。随便一个2000工资的都200人起投递
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务