鱼C论坛

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

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

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

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

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

x
本帖最后由 漫天疯语 于 2021-2-1 23:07 编辑

[课后作业] 第020讲:函数:内嵌函数和闭包 | 课后测试题及答案
1. 请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
a) 每位密码为单个小写字母
b) 每位密码的左右两边均有且只有三个大写字母

其实在每个字符串组左右各加一个小写‘a’就能解决问题

  1. def 解密(x):
  2.     '''
  3.     # a) 每位密码为单个小写字母
  4.     # b) 每位密码的左右两边均有且只有三个大写字母
  5.     '''

  6.     f = open(x)  # 注意读取路径时\符号需要*转义*
  7.     g= ''  # 创建明文存储器
  8.     numer = 0
  9.     H = f.readlines()
  10.     for line in H:
  11.         newline ='a'+line.replace('\n','')+'a' #将每组字符串前后各加一个小写字母避免查询溢出
  12.         for each in range(4,len(newline)-4):  #限制查询每组字符串字符从第4位开始查询到倒数第4位结束
  13.             if newline[each].islower():  #如果该字符是小写
  14.                 #  如果该字符左右各三个都是大写 \
  15.                 #  and  该字符左右第四位都不是大写(这就是为什么要前后加小写'a'的原因)
  16.                 if (newline[(each-3):each].isupper() and newline[(each+1):(each+4)].isupper())\
  17.                     and ((newline[each-4].isupper() or newline[each+4].isupper()) == False):
  18.                     temp = 1  #设置判断器temp 如果成立输出1
  19.                 else:
  20.                     temp = 0  #设置判断器temp 如果不成立输出0
  21.                 if temp == 1:
  22.                     g += newline[each]  # 把符合条件的字符串存入g中
  23.                     print(newline[each-4:each],newline[each],newline[each+1:each+5],sep='  ')
  24.     print('\n文件中的秘文是:',g, '\n')
  25.     return g

  26. g = 解密("string2.txt")
  27. 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 | 显示全部楼层
  1. str1 = "ABSabDKSbRIHcRHGdDIFeokj"

  2. s = "a" + str1.replace("\n", "") + "a"
  3. M = L = 0
  4. p = ""

  5. for r in range(len(s)):
  6.     if s[r].islower():
  7.         if M - L == r - M == 4:
  8.             p += s[M]
  9.         L, M = M, r

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

使用道具 举报

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


谢谢美女大佬指点,毛色顿开啊!
只要找到‘aAAAbAAAa’形式的字符串,就能找到b!
还有间距相等传递的思路也是牛逼了~
根据大佬意思,我将程序改进如下:
  1. def 解密(x):
  2.     '''
  3.     # a) 每位密码为单个小写字母
  4.     # b) 每位密码的左右两边均有且只有三个大写字母
  5.     '''

  6.     f = open(x)  # 注意读取路径时\符号需要*转义*
  7.     g= ''  # 创建明文存储器
  8.     numer = 0
  9.     H = f.readlines()
  10.     for line in H:
  11.         newline ='a'+line.replace('\n','')+'a' #将每组字符串前后各加一个小写字母避免查询溢出
  12.         L = M = 0 #设置左变量L,中变量M
  13.         for each in range(len(newline)):  #限制查询每组字符串字符
  14.             if newline[each].islower():  #如果该字符是小写
  15.                 #  如果中变量减去左变量等于右变量(each)减去中变量,即(三个大写字母)join(3个小写字母)成立
  16.                 if M-L == each - M == 4:
  17.                     g += newline[M]  # 把3个小写字母中间的小写字母存入g中
  18.                     print(newline[L:M],newline[M],newline[M+1:each+1],sep='  ')
  19.                 L,M = M,each #左变量指向中变量的值,中变量指向右变量的值,即完成左变量和中变量跟随右变量(each)移位,
  20.     print('\n文件中的秘文是:',g, '\n')
  21.     return g

  22. g = 解密("string2.txt")
  23. 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. 有其他字符的话也简单,用正则过滤一下就好了。
  1. import re

  2. str1 = "ABSab#$%@^DKSbRMD$#%&TIHcRHGd%#DISCUZ_CODE_0DIFeokj"

  3. results = re.findall(r"[a-zA-Z]{7,}", str1)

  4. M = L = 0
  5. p = ""

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

  13. 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, 2024-5-7 20:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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