鱼C论坛

 找回密码
 立即注册
查看: 2498|回复: 6

[技术交流] 【老版20讲内嵌函数课后题】【巧解】关于左右两边均有且只有三个大写字母密文的问题

[复制链接]
发表于 2021-2-1 23:00:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 漫天疯语 于 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[each].islower():  #如果该字符是小写
                #  如果该字符左右各三个都是大写 \
                #  and  该字符左右第四位都不是大写(这就是为什么要前后加小写'a'的原因)
                if (newline[(each-3):each].isupper() and newline[(each+1):(each+4)].isupper())\
                    and ((newline[each-4].isupper() or newline[each+4].isupper()) == False):
                    temp = 1  #设置判断器temp 如果成立输出1
                else:
                    temp = 0  #设置判断器temp 如果不成立输出0
                if temp == 1:
                    g += newline[each]  # 把符合条件的字符串存入g中
                    print(newline[each-4:each],newline[each],newline[each+1:each+5],sep='  ')
    print('\n文件中的秘文是:',g, '\n')
    return g

g = 解密("string2.txt")
print(g)

运行结果如下
mDSK  i  JKLk
jTJN  l  HZYl
zSKL  o  IOSc
sTUP  v  OCPz
qIEK  e  GGGw
hHIR  f  DBYz
wBGT  i  ABTm
jIOK  s  DPOa
yJFF  h  CSVe
qNTL  c  AEIe

文件中的秘文是: ilovefishc

ilovefishc


ps:我最先开始解这道题,先把文件中所有字符去除'\n'转换为一个字符串,结果和答案会有出入,会多几个字母:P
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[r].islower():
        if M - L == r - M == 4:
            p += s[M]
        L, M = M, r

print(p)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-2-1 23:49:33 | 显示全部楼层
本帖最后由 漫天疯语 于 2021-2-1 23:51 编辑


谢谢美女大佬指点,毛色顿开啊!
只要找到‘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[each].islower():  #如果该字符是小写
                #  如果中变量减去左变量等于右变量(each)减去中变量,即(三个大写字母)join(3个小写字母)成立
                if M-L == each - M == 4:
                    g += newline[M]  # 把3个小写字母中间的小写字母存入g中
                    print(newline[L:M],newline[M],newline[M+1:each+1],sep='  ')
                L,M = M,each #左变量指向中变量的值,中变量指向右变量的值,即完成左变量和中变量跟随右变量(each)移位,
    print('\n文件中的秘文是:',g, '\n')
    return g

g = 解密("string2.txt")
print(g)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


1. 我个人资料里的性别是 男
2. 从哪里看出来我是 女 的?
3. 我是 男的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-2 08:03:04 | 显示全部楼层
本帖最后由 漫天疯语 于 2021-2-2 08:07 编辑
°蓝鲤歌蓝 发表于 2021-2-1 23:59
1. 我个人资料里的性别是 男
2. 从哪里看出来我是 女 的?
3. 我是 男的


1.哈哈帅气大佬不好意思,我没有看个人资料
2.看这个猫挺 可爱 的,就以为是个女的
3.sorry = 我 大意草率 了,抱歉;print(sorry) *3   #重要的事说三遍,表示强调
4.其实,看昵称也应该知道是靓仔的
5.昨晚睡觉突然发现还是有漏洞
6.只是解法中判断了间隔3个不是小写的字母
7.如果密文中混杂着除了大小写以外的其他字符,这样解就不成立了
8.严谨一点还是要判断一下间隔的三个都是大写字母为好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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"[a-zA-Z]{7,}", str1)

M = L = 0
p = ""

for result in results:
    s = "a" + result.replace("\n", "") + "a"
    for r in range(len(s)):
        if s[r].islower() and M - L == r - M == 4:
            p += s[M]
        if s[r].islower():
            L, M = M, r

print(p)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


还没学到正则。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 16:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表