(python3)1081 检查密码 (15 分) & 1082 射击比赛 (20 分) & 1083 是否存在相等的差 (20 分)

时隔一年,偶尔回来做做基础的pat题目,确实太简单了,一口气搞了五道题,如下两篇博客。

1081 检查密码 (15 分) 

题目内容如下:

本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。

输入格式:

输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。

输出格式:

对每个用户的密码,在一行中输出系统反馈信息,分以下5种:

  • 如果密码合法,输出Your password is wan mei.
  • 如果密码太短,不论合法与否,都输出Your password is tai duan le.
  • 如果密码长度合法,但存在不合法字符,则输出Your password is tai luan le.
  • 如果密码长度合法,但只有字母没有数字,则输出Your password needs shu zi.
  • 如果密码长度合法,但只有数字没有字母,则输出Your password needs zi mu.

题目解析:

题目十分简单,按照逻辑筛选即可,配上正则就行。

import re
p1 = re.compile("[^\wa-zA-Z.]")
str_pr = "Your password "

if __name__ == '__main__':
    n = input()
    for _ in range(int(n)):
        ps = str(input())
        if len(ps) < 6:
            print(str_pr + "is tai duan le.")
            continue
        elif p1.search(ps):
            print(str_pr + "is tai luan le.")
            continue
        elif not re.search("\d", ps):
            print(str_pr + "needs shu zi.")
            continue
        elif not re.search("[a-zA-Z]", ps):
            print(str_pr + "needs zi mu.")
            continue
        print(str_pr + "is wan mei.")

1082 射击比赛 (20 分)

题目赘述:

本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军;谁差得最远,谁就是菜鸟。本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟。我们假设靶心在原点(0,0)。

输入格式:

输入在第一行中给出一个正整数 N(≤ 10 000)。随后 N 行,每行按下列格式给出:

ID x y

其中 ID 是运动员的编号(由 4 位数字组成);x 和 y 是其打出的弹洞的平面坐标(x,y),均为整数,且 0 ≤ |x|, |y| ≤ 100。题目保证每个运动员的编号不重复,且每人只打 1 枪。

输出格式:

输出冠军和菜鸟的编号,中间空 1 格。题目保证他们是唯一的。

题目解析:

每条输入计算一下与原点的距离即可,只保留最大值最小值及相应编号。

if __name__ == '__main__':
    n = int(input())
    dis_max = 0
    dis_min = 100*100*2
    res = [0, 0]

    for _ in range(n):
        numb, x, y = input().split()
        dis = abs(int(x))**2 + abs(int(y))**2
        if dis < dis_min:
            dis_min = dis
            res[0] = numb
        if dis > dis_max:
            dis_max = dis
            res[1] = numb
    print(" ".join(res))

1083 是否存在相等的差 (20 分)

题目赘述:

给定 N 张卡片,正面分别写上 1、2、……、N,然后全部翻面,洗牌,在背面分别写上 1、2、……、N。将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差?

输入格式:

输入第一行给出一个正整数 N(2 ≤ N ≤ 10 000),随后一行给出 1 到 N 的一个洗牌后的排列,第 i 个数表示正面写了 i 的那张卡片背面的数字。

输出格式:

按照“差值 重复次数”的格式从大到小输出重复的差值及其重复的次数,每行输出一个结果。

输入样例:

8
3 5 8 6 2 1 4 7

输出样例:

5 2
3 3
2 2

题目解析:

看似难的一道题,关键是理解题目内容。正反两个数的范围都在 1~ N之间, 因此差的范围在0 ~ N-1,用列表res的索引表示差出现的数量即可,最后遍历res列表,值大于1的输出即可。

n = int(input())
nums = input().split()
res = [0 for _ in range(n)]

for ix, n in enumerate(nums, 1):
    sub = abs(int(n) - ix)
    res[sub] += 1
for ix in range(len(res)-1, -1, -1):
    cn = res[ix]
    if cn > 1:
        print("%d %d" % (ix, cn))

 

你可能感兴趣的:(Python3之PAT乙级)