实验04-字符串与正则表达式

首先给个正则表达式学习的网站:Python3 正则表达式

1014 福尔摩斯的约会

问题描述:

大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示);后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。

输入说明:

输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。

输出说明:

在一行中输出约会的时间,格式为 DAY HH:MM,其中 DAY 是某星期的 3 字符缩写,即 MON 表示星期一,TUE 表示星期二,WED 表示星期三,THU 表示星期四,FRI 表示星期五,SAT 表示星期六,SUN 表示星期日。题目输入保证每个测试存在唯一解。

输入样列:

3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm

输出样列:

THU 14:04

代码:

day = {'A': 'MON', 'B': 'TUE', 'C': 'WED', 'D': 'THU', 'E': 'FRI', 'F': 'SAT', 'G': 'SUN'}
hour = {'0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9', 'A': '10',
        'B': '11', 'C': '12', 'D': '13', 'E': '14', 'F': '15', 'G': '16', 'H': '17', 'I': '18', 'J': '19', 'K': '20',
        'L': '21', 'M': '22', 'N': '23'}
s1 = list(input())
s2 = list(input())
s3 = list(input())
s4 = list(input())
l = []
flag = 0
for i in range(min(len(s1), len(s2))):
    if s1[i] == s2[i] and str(s1[i]).isupper() and ('A' <= s1[i] <= 'G') and flag == 0:
        l.append(s1[i])
        flag = 1
        continue
    elif s1[i] == s2[i] and str(s1[i]).isupper() and ('A' <= s1[i] <= 'N') and flag == 1:
        l.append(s1[i])
        break
    elif s1[i] == s2[i] and str(s1[i]).isdigit() and flag == 1:
        l.append(s1[i])
        break
for i in range(min(len(s3), len(s4))):
    if s3[i] == s4[i] and s3[i].isalpha():
        l.append(str(i).rjust(2, '0'))
s = day.get(l[0], "nothing") + " " + hour.get(l[1], "nothing").rjust(2, '0') + ":" + l[2]
print(s)

1029 旧键盘

问题描述:

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入说明:

输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。

输出说明:

按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。

输入样列:

7_This_is_a_test
_hs_s_a_es

输出样列:

7TI

代码:

s1 = input().upper()
s2 = input().upper()
result = []
for i in s1:
    if s2.find(i) == -1:
        if i not in result:
            result.append(i)
print("".join(result))

1033 旧键盘打字

问题描述:

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

输入说明:

输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串。可用的字符包括字母 [a-z, A-Z]、数字 0-9、以及下划线 _(代表空格)、,、.、-、+(代表上档键)。题目保证第 2 行输入的文字串非空。

注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出说明:

在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。

输入样列:

7+IE.
7_This_is_a_test.

输出样列:

_hs_s_a_tst

代码:

s1 = input()
s2 = input()
for i in s2:
    if i.islower():
        s = i.upper()
    else:
        s = i
    if s not in s1:
        if '+' not in s1 or (not i.isupper()):
            print(i, end="")

1042 字符统计

问题描述:

请编写程序,找出一段给定文字中出现最频繁的那个英文字母。

输入说明:

输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。

输出说明:

在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。

输入样列:

This is a simple TEST. There ARE numbers and other symbols 1&2&3…

输出样列:

e 7

代码:

频率最高并且字典序最小,两个关键词即可

str1 = input().lower()
dict1 = {}
for i in str1:
    if i.islower():
        dict1[i] = dict1.get(i, 0) + 1
list1 = sorted(dict1.items(), key=lambda a: (-a[1], a[0]))
print(list1[0][0], list1[0][1])

1057 数零壹

问题描述:

给定一串长度不超过 10^5 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0、多少 1。例如给定字符串 PAT (Basic),其字母序号之和为:16+1+20+2+1+19+9+3=71,而 71 的二进制是 1000111,即有 3 个 0、4 个 1。

输入说明:

输入在一行中给出长度不超过 10^5、以回车结束的字符串。

输出说明:

在一行中先后输出 0 的个数和 1 的个数,其间以空格分隔。

输入样列:

PAT (Basic)

输出样列:

3 4

代码:

bin(x)会先输出 0 b 0b 然后才是二进制,所以要统计 0 0 的个数要求第3个下标开始

s = input().lower()
sum = 0
for i in s:
    if i.islower():
        sum += ord(i) - ord('a') + 1
s1 = bin(sum)[2:]
x = str(s1).count('0')
y = str(s1).count('1')
if y == 0:
    print(0, 0)
else:
    print(x, y)

1074 宇宙无敌加法器

问题描述:

地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”。每个 PAT 星人都必须熟记各位数字的进制表,例如“……0527”就表示最低位是 7 进制数、第 2 位是 2 进制数、第 3 位是 5 进制数、第 4 位是 10 进制数,等等。每一位的进制 d 或者是 0(表示十进制)、或者是 [2,9] 区间内的整数。理论上这个进制表应该包含无穷多位数字,但从实际应用出发,PAT 星人通常只需要记住前 20 位就够用了,以后各位默认为 10 进制。
在这样的数字系统中,即使是简单的加法运算也变得不简单。例如对应进制表“0527”,该如何计算“6203 + 415”呢?我们得首先计算最低位:3 + 5 = 8;因为最低位是 7 进制的,所以我们得到 1 和 1 个进位。第 2 位是:0 + 1 + 1(进位)= 2;因为此位是 2 进制的,所以我们得到 0 和 1 个进位。第 3 位是:2 + 4 + 1(进位)= 7;因为此位是 5 进制的,所以我们得到 2 和 1 个进位。第 4 位是:6 + 1(进位)= 7;因为此位是 10 进制的,所以我们就得到 7。最后我们得到:6203 + 415 = 7201。
三、输入说明:
输入首先在第一行给出一个 N 位的进制表(0 < N ≤ 20),以回车结束。 随后两行,每行给出一个不超过 N 位的非负的 PAT 数。

输出说明:

在一行中输出两个 PAT 数之和。

输入样列:

30527
06203
415

输出样列:

7201

代码:

decimal = input()
n1 = input()
n2 = input()
idx1 = len(n1) - 1
idx2 = len(n2) - 1
idx3 = len(decimal) - 1
mod = 0
ans = []
while idx1 >= 0 or idx2 >= 0 or mod > 0:
    if idx1 < 0:
        a = 0
    else:
        a = int(n1[idx1])
        idx1 -= 1
    
    if idx2 < 0:
        b = 0
    else:
        b = int(n2[idx2])
        idx2 -= 1
    
    if decimal[idx3] == '0':
        d = 10
    else:
        d = int(decimal[idx3])
    idx3 -= 1
    
    sum = a + b + mod
    mod = sum // d
    ans.append(sum % d)

result = ''.join(([str(x) for x in ans[::-1]]))
if int(result) == 0:
    print('0')
else:
    print(result.lstrip('0'))

1076 Wifi密码

问题描述:

下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1;B-2;C-3;D-4;请同学们自己作答,每两日一换。谢谢合作!!~”—— 老师们为了促进学生学习也是拼了…… 本题就要求你写程序把一系列题目的答案按照卷子上给出的对应关系翻译成 wifi 的密码。这里简单假设每道选择题都有 4 个选项,有且只有 1 个正确答案。

输入说明:

输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行按照 编号-答案 的格式给出一道题的 4 个选项,T 表示正确选项,F 表示错误选项。选项间用空格分隔。

输出说明:

在一行中输出 wifi 密码。

输入样列:

8
A-T B-F C-F D-F
C-T B-F A-F D-F
A-F D-F C-F B-T
B-T A-F C-F D-F
B-F D-T A-F C-F
A-T C-F B-F D-F
D-T B-F C-F A-F
C-T A-F B-F D-F

输出样列:

13224143

代码:

import re
n = int(input())
wifi = [" ABCD".index(re.search(r'[A-D]-T', input()).group()[0]) for i in range(n)]
print("".join(list(map(str, wifi))))

1078 字符串压缩与解压

问题描述:

文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。
解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。
本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。

输入说明:

输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过 1000 个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过 1MB。

输出说明:

根据要求压缩或解压字符串,并在一行中输出结果。

输入样列1:

C
TTTTThhiiiis isssss a tesssst CAaaa as

输出样列1:

5T2h4is i5s a3 te4st CA3a as

输入样列2:

D
5T2h4is i5s a3 te4st CA3a as10Z

输出样列2:

TTTTThhiiiis isssss a tesssst CAaaa asZZZZZZZZZZ

代码:

op = input()
s = input()
n = len(s)
ans = ""
if op == "C":
    i = 0
    while i < n:
        j = i + 1
        cnt = 1
        while j < n and s[j] == s[i]:
            cnt += 1
            j += 1
        if cnt == 1:
            ans += s[i]
        else:
            ans += str(cnt) + s[i]
        i = j
else:
    i = 0
    while i < n:
        j = i + 1
        if s[i].isdigit():
            while s[j].isdigit():
                j += 1
            ans += s[j] * int(s[i:j])
            i = j + 1
        else:
            ans += s[i]
            i = j
print(ans)

1081 检查密码

问题描述:

本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于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.。

输入样列:

5
123s
zheshi.wodepw
1234.5678
WanMei23333
pass*word.6

输出样列:

Your password is tai duan le.
Your password needs shu zi.
Your password needs zi mu.
Your password is wan mei.
Your password is tai luan le.

代码:

\w匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'

import re

for i in range(int(input())):
    s = str(input())
    if len(s) < 6:
        print("Your password is tai duan le.")
        continue
    elif re.search("[^\w.]", s):
        print("Your password is tai luan le.")
        continue
    elif not re.search("\d", s):
        print("Your password needs shu zi.")
        continue
    elif not re.search("[a-zA-Z]", s):
        print("Your password needs zi mu.")
        continue
    print("Your password is wan mei.")

1086 就不告诉你

问题描述:

做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。

输入说明:

输入在第一行给出两个不超过 1000 的正整数 A 和 B,其间以空格分隔。

输出说明:

在一行中倒着输出 A 和 B 的乘积。

输入样列:

5 7

输出样列:

53

代码:

注意倒序要先将先导0去掉,用lstrip('0')即可

a, b = map(int, input().split())
ans = str(a * b)
print(ans[::-1].lstrip('0'))
发布了28 篇原创文章 · 获赞 0 · 访问量 855

猜你喜欢

转载自blog.csdn.net/weixin_43866408/article/details/105223539
今日推荐