头歌实践教学平台——Python编程技术
字符串
第1关:校验身份证号码并输出个人信息
任务描述
中国目前采用的是18位身份证号,其第7-10位数字是出生年,11-12位是出生月份,13-14是出生日期,第17位是性别,奇数为男性,偶数为女性,第18位是校验位。 如果身份证号码的其中一位填错了(包括最后一个校验位),则校验算法可以检测出来。如果身份证号的相邻2位填反了,则校验算法可以检测出来。校验规则如下:
将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
将这17位数字和系数相乘的结果相加。
用加出来和除以11,看余数只可能是:0-1-2-3-4-5-6-7-8-9-10 分别对应的最后一位身份证的号码为:1-0-X-9-8-7-6-5-4-3-2
通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X(大写英文字母X)。如果余数是10,身份证的最后一位号码就是2。
用户输入一个身份证号,校验其是否是合法的身份证号码:
输入长度是否合法
输入数据校验位是否合法
输入数据中年月日范围是否合法,考虑闰年。 如身份证号码不合法输出 ‘身份证校验错误’, 如身份证号码合法则分别在3行中输出’身份证号码校验为合法号码’以及该人的出生年月日和性别。
输入格式
一个18位身份证号,末位为数字或大写字母X
输出格式
如身份证号码不合法输出 ‘身份证校验错误’, 如身份证号码合法则分别在3行中输出’身份证号码校验为合法号码’以及该人的出生年月日和性别。(月份和日期均为2位数表示)
示例 1
输入:
432831196411150810
输出:
身份证号码校验为合法号码
出生:1964年11月15日
性别:男
示例 2
输入:
432831196811150810
输出:
身份证校验错误
平均代码量 43 行
代码文件
import datetime
def check_num(id):
factor1 = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
factor2 = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
f_sum,n = 0,0
if len(id) == 18:
for i in id[:-1]:
f_sum += int(i)*factor1[n]
n+=1
if id[-1] == factor2[f_sum % 11]:
return True
else:
return False
else:
return False
def check_date(id):
year,month,day = map(int,[id[6:10],id[10:12],id[12:14]])
try:
datetime.date(year,month,day)
return True
except:
return False
def main():
id = input()
if check_num(id) and check_date(id):
print('身份证号码校验为合法号码')
print('出生:{}年{}月{}日'.format(id[6:10],id[10:12],id[12:14]))
if int(id[16])%2 == 1:
print('性别:男')
else:
print('性别:女')
else:
print('身份证校验错误')
if __name__ == '__main__':
main()
第1关:个人信息提取
任务描述
用户输入自己的个人信息,格式如下:
0122923450321 王昊 法学1801 河北 2001年
数据分别表示:学号 姓名 专业班级 籍贯 出生年份,各数据间空格间隔
有些用户没有按照规则输入数据,输入自己出生年份的时候写成了类似‘1900年生’或‘出生于1985’或‘19岁生于2006年11月’的数据格式
请注意程序仍然需要正确读取该项数据,本题保证这些用户输入时一定只含有1个4位数字连续组成的年份数据。
请按照输出样式输出姓名,班级,出生年份呢
提示:
列表中的数据和字符串当中的字符一样,都具有有序的索引,且引用数据和切片方式一致。
str.isdigit()可以帮助判断字符串是否全部由数字字符组成,返回值为’True’或’False’
输入示例
0122923450321 王昊 法学1801 河北 2001年
输出示例
姓名:王昊 班级:法学1801 出生:2001年
示例
输入:
0122923450321 王昊 法学1801 河北 2001年
输出:
姓名:王昊
班级:法学1801
出生:2001年
平均代码量 9 行
代码文件
n1, n2, n3, n4, n5 = input().split()
n6 = ''
for i in range(0, len(n5)):
if n5[i:i + 4].isdigit():
n6 = n6 + n5[i:i + 4]
print(f'姓名:{n2}\n班级:{n3}\n出生:{n6}年', end='')
第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
输出:过道
平均代码量 13 行
代码文件
def seat_numbers(seat):
if not(seat[:-1].isdigit()):
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('输入错误')
第1关:加密字符串
描述
密码对照表的第一行为明码行,放置大写字母表(如下表第一行所示。)
第二行为按照以下规则生成的密码行:
给定一个单词,将单词中所有字符转为大写字母,对于单词中重复出现的字母,保留第一次出现的,删除之后重复出现的该字符。
用剩余字母组成秘钥从密码行的开始位置放置;再用未在秘钥中出现的其他大写字母按字母表顺序依次填充密码行剩余位置。
例如:给定单词“HelloPython”,删除其中重复出现字母后得到秘钥“HELOPYTN”,将秘钥依次填入密码行最开始的位置,再用未在秘钥中出现的其他大写字母按字母表顺序依次填充密码行的剩余位置,最终得到密码行(如下的第二行所示) 密码对照表
ABCDEFGHIJKLMNOPQRSTUVWXYZ
HELOPYTNABCDFGIJKMQRSUVWXZ
输入一个字符串,将其中所有字母转为大写字母,依照明码密码对照表对其做加密处理,输出加密后的密文字符串。
输入格式
输入有两个:
输入一个字符串做秘钥
输入一个需要加密的符串
输出格式
输出加密后的密文字符串
示例 1
输入:
HelloPython
GONE WITH THE WIND
输出:
TIGP VARN RNP VAGO
示例2
输入:
GonewiththeWind
Directed by Victor Fleming
输出:
TEDPWNRWE OY UDNRKP ICWFDJT
平均代码量 14 行
代码文件
upperLetter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
s = input().upper()
code = list(set(upperLetter) - set(s))
code.sort()
ls = list(set(s))
ls.sort(key=s.index)
keys = ''.join(ls + code)
decode = input().upper()
table = ''.maketrans(upperLetter, keys)
print(decode.translate(table), end='')