鱼C论坛

 找回密码
 立即注册
查看: 2140|回复: 2

[已解决]第二十课密码问题

[复制链接]
发表于 2020-1-16 23:18:22 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 yjptx121 于 2020-1-16 23:20 编辑

对代码做了分析,但发现运行结果仍然不对,请高人指点:
  1. '''请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符中的密码,密码的埋藏点符合以下规律:
  2. a)每位密码为单个小写宇母
  3. b)每位密码的左右两边均有且只有三个大写宇母'''
  4. str1='ABSsaDKSbRIHcRHGcdDIF'                           
  5. countA = 0                #用来判断左边大写字母
  6. countB = 0                #用来统计小写字母
  7. countC = 0                #用来判断右边大写字母
  8. length = len(str1)
  9. for i in range(length):
  10.     if str1[i] == '\n':     #转义字符:换行,即除非不为\n,那么程序才会往下执行(条件1)
  11.         continue
  12.     if str1[i].isupper():        #如果str1[i]为大写(条件2)
  13.         if countB == 1:     #如果小写计数  countB == 1(条件3)
  14.             
  15.             countC += 1     #此时countC 是代表右边大写字母数+1
  16.             countA = 0      #左边大写字母数清0,
  17.             
  18.         else:                                #(条件4)
  19.             
  20.             countA += 1     #执行
  21.             
  22.         continue                        #跳过后续,继续执行if str1[i].isupper()程序
  23.     if str1[i].islower() and countA == 3:  #需同时满足当前字符为小写,大写字符总共3个(条件5)
  24.         countB = 1
  25.         countA = 0
  26.         target = i                        #输出值
  27.         continue
  28.     if str1[i].islower() and countC == 3:   #(条件6)
  29.         print(str1[target],end = '')
  30.     countA = 0
  31.     countB = 0
  32.     countC = 0
  33. '''ABS均执行条件4 输出完后 A=0 B=3 C=0,到s时执行条件5 输出A=1 B=1 C=0,到a时所有条件均不满足,所以对A,B,C重新赋值
  34. 为0,同样,DKS均执行条件4,输出完成后 A=0 B=3 C=0,到b时执行条件5,输出A=1 B=1 C=0,并赋值target = 8,RIH 执行完条件3
  35. 后得到A=1 B=3 C=3 ,到c时执行条件6,因为c是小写且C=3了,此时target=8未改变,因此会打印b,程序继续执行,对A,B,C均进行
  36. 初始化赋值,开始新的一轮循环...'''
复制代码

最终输出值就只有b,c就不见了
最佳答案
2020-1-17 01:04:54
本帖最后由 jackz007 于 2020-1-17 01:09 编辑

        请注意这个条件:
        b)每位密码的左右两边均有且只有三个大写宇母。
        这个条件的意思是,密码字符前后如果有第 4 个字符,那就一定是小写字符,所以,判断的范围应该是密码字符前后各 4 个字符,显然,有且只有三个大写字符的条件针对的是 str1 的开头和结尾,这又这两个地方缺少第 4 个字符。所以,需要为 str1 的首尾各添加一个小写字符,这样,就不用单独处理字符串的首尾了。
  1. str1 = 'ABSsaDKSbRIHcRHGcdDIF'
  2. s = 'a' + '' . join(str1 . split('\n')) + 'a'
  3. p = ''
  4. for k in range(4 , len(s) - 4) :
  5.     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():
  6.         p += s[k]
  7. print(p)
复制代码

        运行实况:
  1. C:\Bin>python x.py
  2. bc

  3. C:\Bin>
复制代码

        即便用小甲鱼保存在文件中的长字符串来替换 str1 也可以得到正确的隐藏密码。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-17 01:04:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-1-17 01:09 编辑

        请注意这个条件:
        b)每位密码的左右两边均有且只有三个大写宇母。
        这个条件的意思是,密码字符前后如果有第 4 个字符,那就一定是小写字符,所以,判断的范围应该是密码字符前后各 4 个字符,显然,有且只有三个大写字符的条件针对的是 str1 的开头和结尾,这又这两个地方缺少第 4 个字符。所以,需要为 str1 的首尾各添加一个小写字符,这样,就不用单独处理字符串的首尾了。
  1. str1 = 'ABSsaDKSbRIHcRHGcdDIF'
  2. s = 'a' + '' . join(str1 . split('\n')) + 'a'
  3. p = ''
  4. for k in range(4 , len(s) - 4) :
  5.     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():
  6.         p += s[k]
  7. print(p)
复制代码

        运行实况:
  1. C:\Bin>python x.py
  2. bc

  3. C:\Bin>
复制代码

        即便用小甲鱼保存在文件中的长字符串来替换 str1 也可以得到正确的隐藏密码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-18 19:19:52 | 显示全部楼层
jackz007 发表于 2020-1-17 01:04
请注意这个条件:
        b)每位密码的左右两边均有且只有三个大写宇母。
        这个条件的 ...

多谢回答,我也知道所有的问题不可能只有一个答案,只看能否想到而已,受教了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 09:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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