第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
)时出现的次数。 如:
target = 'abcyxtabcedfjkdabdfpabc'
sub = 'abc'
print(target.count(sub)) #得到结果为3
或
target = '112345#$%114711'
sub = '11'
print(target.count(sub)) #得到结果为3
但当出现位置重叠(overlapping
)时,返回结果并不准确 如:
target = '1112345#$%114711'
sub = '11'
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:
输入:
鄂A-12345
输出
单号通行
示例2:
输入:
鄂A-5432W
输出:
双号通行
示例3:
输入:
鄂A-2345
输出:
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个车牌号的列表并输出。
车牌号规则:
- 以'鄂A-'或'鄂W-'开头
- 长度总共为8位,后5位中包含最多2个字母字符,其余为数字
- 为避免数字与字母混淆,如'1'与'I','0'与'O',车牌号中不应出现字母'I'与'O'
生成车牌号步骤:
定义一个函数完成下列步骤
随机生成0~2之间的随机整数t,代表车牌中字母个数---random.randint()
在大写字母字符串string.ascii_uppercase(需要删除'I'与'O')中随机抽取t个字母---random.choices(),权重相同
在数字字符串string.digits中随机抽取5-t个数字字符---random.choices(),权重相同
将生成的随机字母串与数字字符串连接,字母字符串在前
对连接后的列表随机打乱---random.shuffle()
将打乱后的列表中字符连接为字符串s
随机在列表['鄂A-','鄂W-']中随机抽取车牌前三位---random.choice()
将选取的车牌前三位与s连接得到车牌号并返回
为保证评测结果相同,代码中必须严格按照上述步骤顺序及使用指定随机数函数。
知识点
random.choices(pop, weights, k)
pop为样本序列
weight为从pop中随机抽取时对应的权重列表,如果省略,则默认为序列中每个样本被抽取的概率相同
k为随机抽取的样本数量
如:
random.choices([34,12,47,51,-1], k = 3)
代表从[34,12,47,51,-1]列表中,按相同权重,随机抽取三个样本数据
random.choices([34,12,47,51,-1], weights = [1,1,3,1,1], k = 3)
代表从[34,12,47,51,-1]列表中,按权重列表weight,随机抽取三个样本数据
测试说明
平台会对你编写的代码进行测试:
测试输入:
5
20
预期输出:
['鄂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)