漫天疯语 发表于 2021-2-1 23:00:52

【老版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

°蓝鲤歌蓝 发表于 2021-2-1 23:10:26

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:49:33

本帖最后由 漫天疯语 于 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:59:25

漫天疯语 发表于 2021-2-1 23:49
谢谢美女大佬指点,毛色顿开啊!
只要找到‘aAAAbAAAa’形式的字符串,就能找到b!
还有间 ...

1. 我个人资料里的性别是 男
2. 从哪里看出来我是 女 的?
3. 我是 男的

漫天疯语 发表于 2021-2-2 08:03:04

本帖最后由 漫天疯语 于 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 10:30:42

漫天疯语 发表于 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 22:54:04

°蓝鲤歌蓝 发表于 2021-2-2 10:30
1. 没关系。我没有生气,只是有点疑惑。
2. 有其他字符的话也简单,用正则过滤一下就好了。

{:10_245:}
还没学到正则。。。。
页: [1]
查看完整版本: 【老版20讲内嵌函数课后题】【巧解】关于左右两边均有且只有三个大写字母密文的问题