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)

运行结果:

 

 

 

 
 
posted @ 2020-04-24 15:47  圈er  阅读(1014)  评论(0编辑  收藏  举报