# 自动售货系统,详见注解
good_value = [2,3,4,5,8,6]
coin_value = [1,2,5,10]
input = '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;'
input = 'r 28-12-11-1-16-10 19-30-8-11;b A1;p 1;'
L = input.strip().split(';')
left = 0 # 这里要维护一个已投币总额,或购物剩余的一个变量left
for com in L:
if com: # 最后一个分号;后面为空,排除
#---------------------------------------------------------------------
# 命令合法检查
if com[0] not in 'rpbcq':
print('E010:Parameter error')
continue
else:
if com[0] in 'rpbq' and com[1] != ' ':
print('E010:Parameter error')
continue
if com[0] == 'c' and len(com) != 1:
print('E010:Parameter error')
continue
#---------------------------------------------------------------------
# 初始化:长度不合法提示
if com[0]=='r':
good_num,coin_num = com[2:].strip().split()
good_num = list(map(int,good_num.split('-'))) # A1~A6
coin_num = list(map(int,coin_num.split('-'))) # 1,2,5,10
#print('good_value=',good_value)
#print('good_num=',good_num)
#print('coin_value=',coin_value)
#print('coin_num=',coin_num)
if len(good_num)==6 and len(coin_num)==4:
print('S001:Initialization is successful')
else:
print('E010:Parameter error')
#---------------------------------------------------------------------
# 投币
if com[0]=='p':
coin = int(com[2:].strip())
#print('>> coin=',coin)
if not(coin==1 or coin==2 or coin==5 or coin==10): # 只接受1,2,5,10的投币
print('E002:Denomination error')
elif (coin==5 or coin==10) and coin_value[0]*coin_num[0] + coin_value[1]*coin_num[1] < coin: # 投5,10币时检查1,2元币是否足够找零
print('E003:Change is not enough, pay fail')
elif sum(good_num)==0:
print('E005:All the good_num sold out')
else: # 投币成功后,钱币数量加1,投币总额增加
if coin==1:
coin_num[0] += 1
if coin==2:
coin_num[1] += 1
if coin==5:
coin_num[2] += 1
if coin==10:
coin_num[3] += 1
left += coin
#print('coin_num=',coin_num)
print('S002:Pay success,balance='+str(left)) # 提示投币总额
#print('----post-left=',left)
#---------------------------------------------------------------------
# 购物
if com[0]=='b':
buy = com[2:].strip()
#print('>> buy=',buy)
good_name = ['A1','A2','A3','A4','A5','A6']
if buy not in good_name:
print('E006:Goods does not exist')
elif good_num[good_name.index(buy)]==0:
print('E007:The goods sold out')
elif left < good_value[good_name.index(buy)]:
print('E008:Lack of balance')
else: # 购物成功后,投币总额减少,货物数量减1
left -= good_value[good_name.index(buy)]
good_num[good_name.index(buy)] -= 1
#print('left=',left)
#print('good_num=',good_num)
print('S003:Buy success,balance='+str(left)) # 提示投币总额
#print('----buy-left=',left)
#---------------------------------------------------------------------
# 退币
#
if com[0]=='c':
#print('>> change')
if left == 0:
print('E009:Work failure')
elif left > 0:
c1 = left%10%5%2 # 找零规则,类似于进制转换算法,通过整除和余数实现
c2 = left%10%5//2
c5 = left%10//5
c10 = left//10
# coin_value[0]*coin_num[0] + coin_value[1]*coin_num[1] < coin: # 投5,10币时检查1,2元币是否足够找零
# 按正常逻辑,上面这条规则保证了,当1元钱币不够时,coin_num[0]==-1,此时强制coin_num[0]=0,c1=0,欠用户1元
if coin_num[0]-c1 < 0:
coin_num[0] = 0
c1 = 0
else:
coin_num[0] -= c1
coin_num[1] -= c2
coin_num[2] -= c5
coin_num[3] -= c10
print('1 yuan coin number='+str(c1))
print('2 yuan coin number='+str(c2))
print('5 yuan coin number='+str(c5))
print('10 yuan coin number='+str(c10))
#print('coin_num=',coin_num)
left -= (c1+ 2*c2 + 5*c5 + 10*c10)
#print('----change-left=',left)
#---------------------------------------------------------------------
# 查询
if com[0]=='q':
query = int(com[2:].strip())
#print('>> query=',query)
if query==0:
tmp = [['A1 2 ',good_num[0]],
['A2 3 ',good_num[1]],
['A3 4 ',good_num[2]],
['A4 5 ',good_num[3]],
['A5 8 ',good_num[4]],
['A6 6 ',good_num[5]]]
tmp = sorted(tmp,key=lambda x:x[1],reverse=1) # 按货物数量排序
for i in range(6):
print(tmp[i][0]+str(tmp[i][1]))
if query==1:
print('1 yuan coin number='+str(coin_num[0]))
print('2 yuan coin number='+str(coin_num[1]))
print('5 yuan coin number='+str(coin_num[2]))
print('10 yuan coin number='+str(coin_num[3]))