鱼C论坛

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

[已解决]第20讲 课后作业 寻找隐藏在长字符串中的密码

[复制链接]
发表于 2019-12-18 23:43:05 | 显示全部楼层 |阅读模式

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

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

x
请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
a) 每位密码为单个小写字母
b) 每位密码的左右两边均有且只有三个大写字母
能不能帮忙看看我写的代码有什么问题啊?可以在这个基础上改进嘛?
  1. str1='ABCaABCaabcABCaABCa'
  2. a=0
  3. b=0
  4. for i in range(0,len(str1)-7):
  5.     for j in range(i,1+3):
  6.         if str1[j].isupper():
  7.             a+=1
  8.             if a!=3:
  9.                 a=0
  10.     if a==3 and str1[i+3].islower():
  11.         for k in range(i+4,i+7):
  12.             if str1[k].isupper():
  13.                 b+=1
  14.                 if b!=3:
  15.                     b=0
  16.     if a==3 and b==3 and str1[i+7].islower():
  17.         print(str1[i+3])
  18.         a=0
  19.         b=0
复制代码
最佳答案
2019-12-21 00:02:54
本帖最后由 jackz007 于 2019-12-21 00:08 编辑
zzong2019 发表于 2019-12-20 19:37
这个代码的意思是把多行的长字符串以换行符作为分隔符进行切片,然后再重新拼接成一个不带换行符的长字符 ...


      因为原题中的 str1 是一段被三引号括起来的跨多行的字符串,所以,需要去掉其中的换行符 '\n' 然后重新拼接;字符串首尾各添加一个 'a',就是解决字符串首尾缺少第 4 个字符的问题,使密码字符的判断条件自始至终一致起来。不然的话,在字符串内部是左、右各 4 个字符的判断条件,在字符串首尾,就得另写代码单独判断处理,使代码逻辑复杂化。  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-19 00:26:48 | 显示全部楼层
本帖最后由 jackz007 于 2019-12-19 00:32 编辑

        注意这个条件:
b) 每位密码的左右两边均有且只有三个大写字母
        这个条件告诉我们,如果密码字符两边有第四的字符,那就一定是小写字母,那么,什么时候没有这第四个字符呢?显然,在字符串开头没有左边第四个字符,在字符串的结尾没有右边第四个字符,除此以外,这第四个字符随处存在。所以,判断密码字符的范围不应该只是左、右各 3 个,而必须是各 4 个字符!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-19 09:29:00 | 显示全部楼层
你这里面用了三个for循环,还是先理清一下思路,写一个新的Demo
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-19 21:17:03 | 显示全部楼层
jackz007 发表于 2019-12-19 00:26
注意这个条件:
b) 每位密码的左右两边均有且只有三个大写字母
        这个条件告诉我们,如果 ...

谢谢您的指导,我按照您的提示对代码进行了改进,现在有输出结果了,但好像还是不太对,推测是把a或者b的值清零这个步骤代码写错了???
  1. str1='ABCaABCaabcABCaABCa'
  2. a=0
  3. b=0
  4. for i in range(0,len(str1)-8):
  5.     if str1[i].islower():
  6.         for j in range(i+1,i+4):
  7.             if str1[j].isupper():
  8.                 a+=1
  9.         if a!=3:
  10.             a=0
  11.     if (a==3) and (str1[i+4].islower()):
  12.         for k in range(i+5,i+8):
  13.             if str1[k].isupper():
  14.                 b+=1
  15.         if b!=3:
  16.             b=0
  17.     if (a==3) and (b==3) and (str1[i+8].islower()):
  18.         print(str1[i+4])
  19.         a=0
  20.         b=0
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-19 21:51:24 | 显示全部楼层
zzong2019 发表于 2019-12-19 21:17
谢谢您的指导,我按照您的提示对代码进行了改进,现在有输出结果了,但好像还是不太对,推测是把a或者b的 ...

        没有那么多复杂逻辑,直来直去就 ok!
  1. s = 'a' + '' . join(str1 . split('\n')) + 'a'
  2. pwd = ''
  3. for k in range(4 , len(s) - 4):
  4.     if s[k - 4] . islower() and s[k - 3 : k] . isupper() and s[k] . islower() and s[k + 1 : k + 4] . isupper() and s[k + 4] . islower():
  5.         pwd += s[k]
  6. print(pwd)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-12-20 19:37:40 | 显示全部楼层
jackz007 发表于 2019-12-19 21:51
没有那么多复杂逻辑,直来直去就 ok!
  1. '' . join(str1 . split('\n'))
复制代码
这个代码的意思是把多行的长字符串以换行符作为分隔符进行切片,然后再重新拼接成一个不带换行符的长字符串?s=‘a’+...+'a',这两个字符串添加的意义是什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-21 00:02:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-12-21 00:08 编辑
zzong2019 发表于 2019-12-20 19:37
这个代码的意思是把多行的长字符串以换行符作为分隔符进行切片,然后再重新拼接成一个不带换行符的长字符 ...


      因为原题中的 str1 是一段被三引号括起来的跨多行的字符串,所以,需要去掉其中的换行符 '\n' 然后重新拼接;字符串首尾各添加一个 'a',就是解决字符串首尾缺少第 4 个字符的问题,使密码字符的判断条件自始至终一致起来。不然的话,在字符串内部是左、右各 4 个字符的判断条件,在字符串首尾,就得另写代码单独判断处理,使代码逻辑复杂化。  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-9 10:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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