武汉理工大学 python实验五

第1关:判断火车票座位

任务描述

我国高铁一等座车座席采用2+2方式布置,每排设有“2+2”方式排列四个座位,以“A、C、D、F”代表,字母“A”和“F”的座位靠窗,字母“C”和“D”靠中间走道。 二等座车座席采用2+3布置,每排设有“3+2”方式排列五个座位,以“A、B、C、D、F”代表,字母“A”和“F”的座位靠窗,字母“C”和“D”靠中间走道,“B”代表三人座中间座席。每个车厢座位排数是1-17,字母不区分大小写。

用户输入一个数字和一个字母组成的座位号,根据字母判断位置是窗口、过道还是中间座席,输入不合法座位号时输出'输入错误'。

输入格式

输入一个数字和字母组合成的字符串

输出格式

'窗口'、'过道'、'中间' 或'输入错误'

示例 1

输入:

12F

输出:

窗口

示例 2

输入:

2C

输出:

过道

def seat_numbers(seat):           # 判定座位是否合法
    if not(seat[:-1].isdigit()):# 万一输入是 2c1c排除
        return  False
    if 1 <= int(seat[:-1]) <= 17 and seat[-1] in 'ABCDF':
        return True
    else:
        return False


def window_or_aisle(seat):       # 判定是窗口、过道还是中间
    if seat[-1] in 'AF':
        return '窗口'
    elif seat[-1] in 'CD':
        return '过道'
    elif seat[-1] == 'B':
        return '中间'


if __name__ == '__main__':
    Seat = input().upper()
    if seat_numbers(Seat):
        print(window_or_aisle(Seat))
    else:
        print('输入错误')

第2关:缩写月份单词

任务描述

月份的缩写为月份单词的前3个字母(九月为前4个),且首字母大写,以 '.' 做为缩写结束标记。月份的英文单词及其缩写如下表所示:

月份缩写单词月份缩写单词
一月Jan.January二月Feb.February
三月Mar.March四月Apr.April
五月May.May六月Jun.June
七月Jul.July八月Aug.August
九月Sept.September十月Oct.October
十一月Nov.November十二月Dec.December

编写一个程序,用户输入一个月份单词,不论输入的单词各字符是大写还是小写,请正确输出对应月份的缩写。当输入单词拼写错误时,输出“spelling mistake”

提示:

  • 字符串有以下方法可用 str.upper() 转换字符串 str 中所有字母为大写 str.lower() 转换字符串 str 中所有字母为小写 str.capitalize() 把字符串 str 的第一个字符大写

  • 月份名列表 month_lst = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

输入格式

某月份的英文单词

输出格式

该月的缩写或“spelling mistake”

示例 1

输入:

february

输出:

Feb.

示例 2

输入:

auGust

输出:

Aug.

# month = input().lower().capitalize()
# if month == 'January':
#          output = month[:3] + '.'
# elif month == 'February':
#          output = month[:3] + '.'
# elif month == 'March':
#          output = month[:3] + '.'
# elif month == 'April':
#          output = month[:3] + '.'
# elif month == 'May':
#          output = month[:3] + '.'
# elif month == 'July':
#          output = month[:3] + '.'
# elif month == 'July':
#          output = month[:3] + '.'
# elif month == 'August':
#          output = month[:3] + '.'
# elif month == 'September':
#          output = month[:4] + '.'
# elif month == 'October':
#          output = month[:3] + '.'
# elif month == 'November':
#          output = month[:3] + '.'
# elif month == 'December':
#     output = month[:3] + '.'
# else:
#     output = 'spelling mistake'
# print(output)
 
# 列表实现
month = input().lower().capitalize()
month_lst = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October','November', 'December']
if month == 'September':
    print(month[:4] + '.')
elif month in month_lst:
    print(month[:3] + '.')
else:
    print('spelling mistake')

第3关:子串出现了多少次?

任务描述

本关任务:计算一个子串在目标字符串中出现的次数并输出。

相关知识

通用序列中,count()函数可以统计某子序列sub在目标序列target不重叠(non-overlapping时出现的次数。 如:

  1. target = 'abcyxtabcedfjkdabdfpabc'
  2. sub = 'abc'
  3. print(target.count(sub)) #得到结果为3

  1. target = '112345#$%114711'
  2. sub = '11'
  3. print(target.count(sub)) #得到结果为3

但当出现位置重叠(overlapping)时,返回结果并不准确 如:

  1. target = '1112345#$%114711'
  2. sub = '11'
  3. print(target.count(sub)) #得到结果仍为3

如果计算重叠(overlapping)的情况,子串11出现次数应为4次,但count函数得到结果为3。

编程要求

本题要求设计一段代码,可以正确统计重叠(overlapping)情况下的子串出现次数。

测试说明

第一行输入目标字符串target 第二行输入子串sub 在目标字符串中统计子串sub在目标字符串target出现次数(包括重叠(overlapping)的情况) 如果该子串没有出现过,输出0

测试格式

测试输入: 112345#$%114711 11 预期输出: 3

测试输入: 1112345#$%114711 11 预期输出: 4

测试输入: 在图书馆学习 学习 预期输出: 1


开始你的任务吧,祝你成功!

 
def count_substring(target, sub):
    count = start = 0
    while True:
        start = target.find(sub, start) + 1
        if start > 0:
            count += 1
        else:
            return count

target = input()
sub = input()
print(count_substring(target, sub))

第4关:字母查找2.0

定义一个函数来判断单词m是否可以由字符串n中出现的字母来组成。 本题保证字符串中出现的字母均为小写字母,n中的字母只能使用一次。 在两行中分别输入两个字符串m,n 如果m,n 满足条件,则输出’FOUND‘ ,否则输出'NOT FOUND' 如果输入的m包含有除字母外的其他字符,输出’ERROR‘结束

示例 1

输入: word world 输出:
FOUND

示例 2

输入: 1a3e 输出:
ERROR

示例 3

输入: at bcda 输出:
NOT FOUND

示例 4

输入: hello heol 输出:
NOT FOUND

def f(m,n):
    for i in m:
        if n.count(i)>0:
            n=n.replace(i,'',1)
        else:
            return 'NOT FOUND'
    return 'FOUND'
 
 
m=input()
if m.isalpha():
    n=input()
    print(f(m,n))
else:
    print('ERROR')

第5关:个人信息提取

任务描述

用户输入自己的个人信息,格式如下:

0122923450321 王昊 法学1801 河北 2001年

数据分别表示:学号 姓名 专业班级 籍贯 出生年份,各数据间空格间隔

有些用户没有按照规则输入数据,输入自己出生年份的时候写成了类似‘1900年生’或‘出生于1985’或‘19岁生于2006年11月’的数据格式。请注意程序此时仍然需要正确读取该项数据,本题保证这些用户输入时一定只含有1个4位数字连续组成的年份数据

请按照输出样式输出姓名,班级,出生年份。

提示:

  • 列表中的数据和字符串当中的字符一样,都具有有序的索引,且引用数据和切片方式一致。

  • str.isdigit()可以帮助判断字符串是否全部由数字字符组成,返回值为'True'或'False'

输入格式

按如下示例,在一行内依次输入5个字符串,分别表示:学号 姓名 专业班级 籍贯 出生年份,各数据间空格间隔

0122923450321 王昊 法学1801 河北 2001年

输出格式

按如下示例,分行依次输出姓名,班级,出生年份

姓名:王昊 班级:法学1801 出生:2001年

示例

输入:

0122923450321 王昊 法学1801 河北 2001年

输出:

姓名:王昊 班级:法学1801 出生:2001年

def main():
    input_str = input()
    data = input_str.split(' ')
    name = data[1]
    class_name = data[2]
    birth_year = ''
    for char in data[4]:
        if char.isdigit() and len(birth_year) < 4:
            birth_year += char
    print("姓名:{}".format(name))
    print("班级:{}".format(class_name))
    print("出生:{}年".format(birth_year))

if __name__ == "__main__":
    main()

第6关:汽车限行

任务描述

为缓解城市交通压力,武汉市交管局对于长江一桥及江汉一桥实行限行,规定如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

每日7时至22时,中型(含)以下载客汽车(新能源车除外)按车牌尾号分单双日通行(法定节假日、休息日除外),车牌尾号为英文字母的,按字母前最后一位阿拉伯数字对应日期的通行管理措施通行。出租车不受单双日限制通行。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬请根据输入的汽车牌号判断单双日通行。

编程要求

输入武汉市车牌号,本题中正确的数据形式为"鄂A-*****",8位长度。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

前3位为'鄂A-',后5位字符串由数字字符和大写字母字符(不包含大写O与I字母)组成,大写字母数量不超过两个,车牌号最后一位可能是数字字符或字母字符。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬ 如'鄂A-FQ234'或'鄂A-1D23A'。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

如果输入为正确的车牌号,则对应输出‘单号通行’或'双号通行'。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬ 如果输入不正确,输出'Data Error!'

测试说明

平台会对你编写的代码进行测试:

  1. 示例1:
  2. 输入:
  3. 鄂A-12345
  4. 输出
  5. 单号通行
  6. 示例2:
  7. 输入:
  8. 鄂A-5432W
  9. 输出:
  10. 双号通行
  11. 示例3:
  12. 输入:
  13. 鄂A-2345
  14. 输出:
  15. Data Error!

开始你的任务吧,祝你成功!

plate_number = input()
if len (plate_number) == 8 and plate_number[:3] == "鄂A-" and plate_number[3:].isalnum() and plate_number[3:]. count ('o') == 0 and plate_number[3:].count ('I') == 0:
    last_character = plate_number[-1]#提取车牌号最后一位
    s = ''.join([x for x in plate_number[3:] if x.isalpha()])
    a = ''.join([x for x in plate_number[3:] if x.isdigit()])

    if 0<=len(s)<=2:#字母最多两位
        if int(a)%2==0:
            print("双号通行")
        else:
            print("单号通行")
    else:
        print ('Data Error!')
else:#非法车牌号
    print ('Data Error!')

第7关:模拟生成车牌号

任务描述

本关任务:编写一段能生成若干个车牌号的代码

在本题中,根据如下步骤随机生成若干个车牌号。

分行输入随机种子以及车牌号数量n,生成包含n个车牌号的列表并输出。

车牌号规则:

  1. 以'鄂A-'或'鄂W-'开头
  2. 长度总共为8位,后5位中包含最多2个字母字符,其余为数字
  3. 为避免数字与字母混淆,如'1'与'I','0'与'O',车牌号中不应出现字母'I'与'O'

生成车牌号步骤:

 
  1. 定义一个函数完成下列步骤
  2. 随机生成0~2之间的随机整数t,代表车牌中字母个数---random.randint()
  3. 在大写字母字符串string.ascii_uppercase(需要删除'I'与'O')中随机抽取t个字母---random.choices(),权重相同
  4. 在数字字符串string.digits中随机抽取5-t个数字字符---random.choices(),权重相同
  5. 将生成的随机字母串与数字字符串连接,字母字符串在前
  6. 对连接后的列表随机打乱---random.shuffle()
  7. 将打乱后的列表中字符连接为字符串s
  8. 随机在列表['鄂A-','鄂W-']中随机抽取车牌前三位---random.choice()
  9. 将选取的车牌前三位与s连接得到车牌号并返回

为保证评测结果相同,代码中必须严格按照上述步骤顺序及使用指定随机数函数。

知识点

 
  1. random.choices(pop, weights, k)
  2. pop为样本序列
  3. weight为从pop中随机抽取时对应的权重列表,如果省略,则默认为序列中每个样本被抽取的概率相同
  4. k为随机抽取的样本数量
  5. 如:
  6. random.choices([34,12,47,51,-1], k = 3)
  7. 代表从[34,12,47,51,-1]列表中,按相同权重,随机抽取三个样本数据
  8. random.choices([34,12,47,51,-1], weights = [1,1,3,1,1], k = 3)
  9. 代表从[34,12,47,51,-1]列表中,按权重列表weight,随机抽取三个样本数据

测试说明

平台会对你编写的代码进行测试:

 
  1. 测试输入:
  2. 5
  3. 20
  4. 预期输出:
  5. ['鄂A-958G7', '鄂W-67161', '鄂W-94731', '鄂A-05W5H', '鄂W-7Y18Y', '鄂A-75121', '鄂A-1107U', '鄂A-1530D', '鄂W-R2005', '鄂W-7629W', '鄂W-R069D', '鄂W-87657', '鄂A-76S9L', '鄂A-28312', '鄂A-46J15', '鄂W-39T2U', '鄂W-65425', '鄂A-220T8', '鄂W-36PL9', '鄂W-E9582']

开始你的任务吧,祝你成功!

import random
import string

def generate_license_plates(seed, n):
    random.seed(seed)
    license_plates = []
    
    for _ in range(n):
        t = random.randint(0, 2)
        letters = random.choices(string.ascii_uppercase.replace('I', '').replace('O', ''), k=t)
        digits = random.choices(string.digits, k=5-t)
        combined = letters + digits
        random.shuffle(combined)
        s = ''.join(combined)
        prefix = random.choice(['鄂A-', '鄂W-'])
        license_plate = prefix + s
        license_plates.append(license_plate)
    
    return license_plates

seed = int(input())
n = int(input())
result = generate_license_plates(seed, n)
print(result)

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值