Python真题练习:1027-打印沙漏、1029-旧键盘、1031-查验身份证、1033-旧键盘打字
1027——打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N (<=1000) 和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
代码实现:
import math
def hourglass(s):
# 2*n**2-1+b=s[0]#打印出的*总数与行数n的规律
if int(s[0])>0:
#获取应打印的行数n,考虑有没用完的*的情况,n向下取整
n=math.floor(math.sqrt((int(s[0])+1)/2))
#打印沙漏上半部
for i in range(n):
print(' '*i,end='')
print(s[1]*(2*(n-i)-1))
#打印沙漏下半部
for i in range(2,n+1):
print(' '*(n-i),end='')
print(s[1]*(2*i-1))
#没用完的符号数*
b=int(s[0])-2*n**2+1
print(b)
s=input().split()
hourglass(s)
运行结果:
1029——旧键盘
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _
(代表空格)组成。题目保证 2 个字符串均非空。
输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
代码实现:
def BrokenKey(l):
bk=[]
#找出坏键
for i in l[0]:
if i not in l[1]:
bk.append(i)
#将所有字母转为大写
bk_up=' '.join(bk).upper()
#列表去重,不改变排列顺序
bk_up1=list(set(bk_up.split()))
bk_up1.sort(key=bk_up.index)
print(''.join(bk_up1))
l=[]
for i in range(2):
n=list(input())
l.append(n)
BrokenKey(l)
运行结果:
1031——查验身份证
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入第一行给出正整数N (<=100) 是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed
代码实现:
def ID(l):
global ll
s=0
#z值与校验码M一一对应的字典
Z=[0,1,2,3,4,5,6,7,8,9,10]
M=[1,0,'X',9,8,7,6,5,4,3,2]
ZM=zip(Z,M)
ZM_dict=dict((ZZ,MM) for ZZ,MM in ZM)
w=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
for i,j in enumerate(l[:-1]):
if j.isdigit():
s += w[i] * int(j)
else:
ll.append(l)
#避免存在X而X不在最后一位的情况下,下面重复添加l
return
z=s%11
last=ZM_dict.get(z)
#检验最后1位校验码是否计算正确
if str(last)!=l[-1]:
ll.append(l)
# print(ll)
n=input()
#声明全局变量,用于存放不正确的号码
global ll
ll=[]
for i in range(int(n)):
l=input()
ID(l)
if ll==[]:
print('All passed')
else:
for i in ll:
print(i)
运行结果:
1033——旧键盘打字
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过1个字符的串。可用的字符包括字母[a-z,A-Z]、数字0-9、以及下划线_ (代表空格)、,、. 、-、+ (代表上档键)。题目保证第2行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst
代码实现:
def KeyTyping(bad,word):
bad1=bad.lower()
b=set(bad+bad1)#包含坏键大小写的集合
good=[]
#找出好键
if '+' in b:#判断坏键集合中是否存在上档键+
for i in word:
if i in b or 'A'<=i<='Z':#遇到坏键及大写字母,不添加
continue
else:
good.append(i)
else:
for i in word:
if i not in b:
good.append(i)
print(''.join(good))
bad=input()
word=input()
KeyTyping(bad,word)
运行结果: