描述
火车时速在200以上的列车:座位号是以ABCDF五个字母为区分的,一般会把座席分为商务座、一等座、二等座。
商务座:座位布局“2+1”,一排有三个座位,其中AC是相连的,F是单独一个座位;
一等座:座位布局“2+2”,一排有四个座位,其中AC是相连的,DF是相连的,每个车厢13排座位。
二等座:座位布局“3+2”,一排有五个座位,其中ABC是相连的三个座位,DF是相连的两个座位,这些座位中A、F都是靠窗的座位,每个车厢20排座位。
当前有一个空闲的一等座车厢和一个二等座车厢,用户输入座位等级和位置,位置可以是“窗口”、“中间”、“过道”和“不限”。每个一等座车厢座位排数是1-13,二等座车厢座位排数是1-20。
根据每次输入信息为用户订购一张车票,可以反复订购,输入回车时结束程序。
若输入的位置信息不正确,输出 ‘位置输入错误,请重新输入’。
若选择的位置无可用车票,从可用车票中随机订购一张并请用户确认是否需要订购,若用户输入“是”则订购成功,否则输出’请重新输入购票信息’,用户重新输入订票信息。
random.choice() # 为实现自动评测,本题要求用此方法随机为用户选择车票
random.seed(19730516) # 为实现自动评测,本题要求用此随机数种子
输入格式
输入用空格分隔的座位等级位置
输出格式
订票成功时输出: 购票成功,您的车票是*
其他情况按题目要求输出
示例 1
输入:二等座 过道 输出:购票成功,您的车票是19D
示例 2
输入:2C 二等座 窗口 输出:购票成功,您的车票是1A
示例 3**
输入: 一等座 不限 输出: 购票成功,您的车票是4F
import random
def generate():
"""产生一个一等座车厢和一个二等座车厢的全部座位号,返回一个字典"""
ticket = {}
first_class, second_class = [], []
for i in range(1, 21):
for c in 'ABCDF':
second_class.append(str(i) + str(c))
for i in range(1, 14):
for c in 'ACDF':
first_class.append(str(i) + str(c))
ticket['一等座'] = first_class
ticket['二等座'] = second_class
return ticket
def order_ticket(seat_class, position, letter):
"""购票"""
available = [x for x in tickets[seat_class] if x[-1] in letter]
if available:
user_seat = random.choice(available) # 随机一张车票
tickets[seat_class].remove(user_seat) # 字典中删除卖出的车票
print(f'购票成功,您的车票是{user_seat}')
else: # 没有满足要求的位置,随机一张车票并询问是否需要
user_seat = random.choice(tickets[seat_class]) # 随机一张车票
print(f'没有{position}位置,可购买{user_seat},是否需要?输入"是"继续购买,其他输入重新购买')
if input() == '是':
print(f'购票成功,您的车票是{user_seat}')
tickets[seat_class].remove(user_seat) # 字典中删除卖出的车票
else:
print('请重新输入购票信息')
def order_input():
"""输入购票信息"""
while order := input(): # 输入购票信息,输入回车结束
seat_class, position = order.split()
if position == '窗口':
letter = 'AF'
elif position == '中间':
letter = 'B'
elif position == '过道':
letter = 'CD'
elif position == '不限':
letter = 'ABCDF'
else:
print('位置输入错误,请重新输入')
continue
order_ticket(seat_class, position, letter)
if __name__ == '__main__':
random.seed(19730516)
tickets = generate()
order_input()