题目:找出藏在字符串中的“密码”
(1) 描述
1) 题源1
- 鱼 C 论坛中“小甲鱼”老师出的题
- 链接地址:第020讲:函数:内嵌函数和闭包 | 课后测试题及答案
2) 题源2
- 这几日挺巧的
- 在鱼 C 论坛上找 Python 习题,点开第 20 节,看到两道操作题
- 又想起一个网站 Python Challenge ,久闻其名,未曾拜访,遂一探究竟
- 原来小甲鱼老师第 20 节的两道操作题改编自 Python Challenge 的 level2 与 level 3
2) 修改
- 题中仍带有一条极长的字符串,不方便写在此随笔中
- 我自己又心血来潮,将此题改了改(其实降低难度)
- 具体见下方要求
(2) 要求
- 有一字符串,仅含大小写英文字母(回车、空格等均不在其列)
- 若 1 个小写字母左右两边均有且仅有 3 个大写字母,则将其挑出
- 将所有挑出的小写字母按顺序输出
- 例如
- AAAAjBBBpCCCrDDmEEEyFFFqqGGG
- 输出 py
(3) 程序
- 解法 1:一一检测(像是暴力破解)
def decrypt(string):
len_str = len(string)
target = 4
if \ # 检测 3 号位
string[0].isupper() and string[1].isupper() and string[2].isupper() and string[3].islower() and string[4].isupper() and string[5].isupper() and string[6].isupper() and string[7].islower():
print(string[3], end=‘‘)
while target < len_str-4:
if \# 检测中间各位
string[target-4].islower() and \ # 若有多种字符,可用 not string[i].isupper()
string[target-3].isupper() and string[target-2].isupper() and string[target-1].isupper() and string[target ].islower() and string[target+1].isupper() and string[target+2].isupper() and string[target+3].isupper() and string[target+4].islower():
print(string[target], end=‘‘)
target += 4
else:
target += 1
if \ # 检测倒数第 4 位
string[len_str-7].islower() and string[len_str-6].isupper() and string[len_str-5].isupper() and string[len_str-4].islower() and string[len_str-3].islower() and string[len_str-2].isupper() and string[len_str-1].isupper() and string[len_str ].isupper():
print(string[len_str-3], end=‘‘)
- 解法 2:利用编号
因为字符串中只有大小写英文字母,所以先找出所有小写英文字母的编号,再检查编号的间距。
若左右相邻的编号大小均相差 4,则该编号对应的字母即为所求之一。
(若有回车符,可用 if 语句将非回车符依次写入列表中,再用以下程序。)
def decrypt(string):
len_str = len(string)
list0 = []
for i in range(len_str): # 找出所有小写字母在 string 中的编号,并写入 list0
if string[i].islower():
list0.append(i)
len_list0 = len(list0)
list1 = []
if list0[0] == 3 and list0[1] == 7: # 检测 3 号位
list1.append(3)
for i in range(1, len_list0-1): # 找出 list0 中符合要求的小写字母的编号
if (list0[i]-4) == list0[i-1] and (list0[i]+4) == list0[i+1]:
list1.append(list0[i])
if list0[-1] == len_str-4 and list0[-2] == len_str-8: # 检测倒数第 4 位
list1.append(list0[-1])
len_list1 = len(list1)
for i in range(len_list1): # 输出
print(string[list1[i]], end=‘‘)
- 解法 3:利用 3 个变量,统计大小写字母的个数(详见下方 countA、countB、countC)
def decrypt(string):
countA = 0 # 统计小写字母左侧的大写字母
countB = 0 # 统计小写字母
countC = 0 # 统计小写字母右侧的大写字母
len_str = len(string)
for i in range(len_str):
if string[i].isupper():
if countB: # AAAaA AAAaAA AAAaAAA
countC += 1
else: # A AA AAA AAAA ...
countC = 0
countA += 1
if string[i].islower():
if countA != 3: # a Aa AAa AAAAa ...
countA = 0
countB = 0
countC = 0
else:
if countB: # AAAaa
countA = 0
countB = 0
countC = 0
else: # AAAa
countB = 1
countC = 0
target = i
if countC == 3:
if i+1 != len_str and \ # 若 i 未迭代到最后一位
string[i+1].isupper(): # AAAaAAAA
countB = 0
countC = 0
else: # AAAaAAAb 总算找到了一个 a
print(string[target], end=‘‘)
countA = 3 # AAAb
countB = 0
countC = 0
原文地址:https://www.cnblogs.com/yorkyu/p/10386418.html
时间: 2024-10-13 22:05:01