【老版20讲内嵌函数课后题】【巧解】关于左右两边均有且只有三个大写字母密文的问题
本帖最后由 漫天疯语 于 2021-2-1 23:07 编辑[课后作业] 第020讲:函数:内嵌函数和闭包 | 课后测试题及答案中
1. 请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
a) 每位密码为单个小写字母
b) 每位密码的左右两边均有且只有三个大写字母
其实在每个字符串组左右各加一个小写‘a’就能解决问题
def 解密(x):
'''
# a) 每位密码为单个小写字母
# b) 每位密码的左右两边均有且只有三个大写字母
'''
f = open(x)# 注意读取路径时\符号需要*转义*
g= ''# 创建明文存储器
numer = 0
H = f.readlines()
for line in H:
newline ='a'+line.replace('\n','')+'a' #将每组字符串前后各加一个小写字母避免查询溢出
for each in range(4,len(newline)-4):#限制查询每组字符串字符从第4位开始查询到倒数第4位结束
if newline.islower():#如果该字符是小写
#如果该字符左右各三个都是大写 \
#and该字符左右第四位都不是大写(这就是为什么要前后加小写'a'的原因)
if (newline[(each-3):each].isupper() and newline[(each+1):(each+4)].isupper())\
and ((newline.isupper() or newline.isupper()) == False):
temp = 1#设置判断器temp 如果成立输出1
else:
temp = 0#设置判断器temp 如果不成立输出0
if temp == 1:
g += newline# 把符合条件的字符串存入g中
print(newline,newline,newline,sep='')
print('\n文件中的秘文是:',g, '\n')
return g
g = 解密("string2.txt")
print(g)
运行结果如下
mDSKiJKLk
jTJNlHZYl
zSKLoIOSc
sTUPvOCPz
qIEKeGGGw
hHIRfDBYz
wBGTiABTm
jIOKsDPOa
yJFFhCSVe
qNTLcAEIe
文件中的秘文是: ilovefishc
ilovefishc
ps:我最先开始解这道题,先把文件中所有字符去除'\n'转换为一个字符串,结果和答案会有出入,会多几个字母:P str1 = "ABSabDKSbRIHcRHGdDIFeokj"
s = "a" + str1.replace("\n", "") + "a"
M = L = 0
p = ""
for r in range(len(s)):
if s.islower():
if M - L == r - M == 4:
p += s
L, M = M, r
print(p) 本帖最后由 漫天疯语 于 2021-2-1 23:51 编辑
°蓝鲤歌蓝 发表于 2021-2-1 23:10
{:10_297:}谢谢美女大佬指点,毛色顿开啊!
只要找到‘aAAAbAAAa’形式的字符串,就能找到b!
还有间距相等传递的思路也是牛逼了~
根据大佬意思,我将程序改进如下:
def 解密(x):
'''
# a) 每位密码为单个小写字母
# b) 每位密码的左右两边均有且只有三个大写字母
'''
f = open(x)# 注意读取路径时\符号需要*转义*
g= ''# 创建明文存储器
numer = 0
H = f.readlines()
for line in H:
newline ='a'+line.replace('\n','')+'a' #将每组字符串前后各加一个小写字母避免查询溢出
L = M = 0 #设置左变量L,中变量M
for each in range(len(newline)):#限制查询每组字符串字符
if newline.islower():#如果该字符是小写
#如果中变量减去左变量等于右变量(each)减去中变量,即(三个大写字母)join(3个小写字母)成立
if M-L == each - M == 4:
g += newline# 把3个小写字母中间的小写字母存入g中
print(newline,newline,newline,sep='')
L,M = M,each #左变量指向中变量的值,中变量指向右变量的值,即完成左变量和中变量跟随右变量(each)移位,
print('\n文件中的秘文是:',g, '\n')
return g
g = 解密("string2.txt")
print(g) 漫天疯语 发表于 2021-2-1 23:49
谢谢美女大佬指点,毛色顿开啊!
只要找到‘aAAAbAAAa’形式的字符串,就能找到b!
还有间 ...
1. 我个人资料里的性别是 男
2. 从哪里看出来我是 女 的?
3. 我是 男的 本帖最后由 漫天疯语 于 2021-2-2 08:07 编辑
°蓝鲤歌蓝 发表于 2021-2-1 23:59
1. 我个人资料里的性别是 男
2. 从哪里看出来我是 女 的?
3. 我是 男的
1.哈哈帅气大佬不好意思,我没有看个人资料
2.看这个猫挺 可爱 的,就以为是个女的
3.sorry = 我 大意草率 了,抱歉{:10_277:};print(sorry) *3 #重要的事说三遍,表示强调
4.其实,看昵称也应该知道是靓仔的
5.昨晚睡觉突然发现还是有漏洞
6.只是解法中判断了间隔3个不是小写的字母
7.如果密文中混杂着除了大小写以外的其他字符,这样解就不成立了
8.严谨一点还是要判断一下间隔的三个都是大写字母为好 漫天疯语 发表于 2021-2-2 08:03
1.哈哈帅气大佬不好意思,我没有看个人资料
2.看这个猫挺 可爱 的,就以为是个女的
3.sorry = 我 大 ...
1. 没关系。我没有生气,只是有点疑惑。
2. 有其他字符的话也简单,用正则过滤一下就好了。
import re
str1 = "ABSab#$%@^DKSbRMD$#%&TIHcRHGd%#DISCUZ_CODE_0DIFeokj"
results = re.findall(r"{7,}", str1)
M = L = 0
p = ""
for result in results:
s = "a" + result.replace("\n", "") + "a"
for r in range(len(s)):
if s.islower() and M - L == r - M == 4:
p += s
if s.islower():
L, M = M, r
print(p)
°蓝鲤歌蓝 发表于 2021-2-2 10:30
1. 没关系。我没有生气,只是有点疑惑。
2. 有其他字符的话也简单,用正则过滤一下就好了。
{:10_245:}
还没学到正则。。。。
页:
[1]