鱼C论坛

 找回密码
 立即注册
查看: 5056|回复: 29

求解,第20讲课后练习的最后一道编程题

[复制链接]
发表于 2014-7-27 17:55:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ~风介~ 于 2014-7-29 21:53 编辑

题目:1. 请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
    a) 每位密码为单个小写字母
    b) 每位密码的左右两边均有且只有三个大写字母
做的时候只有一点点思路,然后只能看答案,结果发现答案完全看不懂啊,看了十几遍了,求解释答案
答案:
  1. str1 = '''拷贝过来的字符串'''
  2. countA = 0
  3. countB = 0
  4. countC = 0
  5. length = len(str1)
  6. for i in range(length):
  7.     if str1[i] == '\n':
  8.         continue
  9.     if str1[i].isupper():
  10.         if countB == 1:
  11.             countC += 1
  12.             countA = 0
  13.         else:
  14.             countA += 1
  15.         continue
  16.     if str1[i].islower() and countA == 3:
  17.         countB = 1
  18.         countA = 0
  19.         target = i
  20.         continue
  21.     if str1[i].islower() and countC == 3:
  22.         print(str1[target], end='')
  23.     countA = 0
  24.     countB = 0
  25.     countC = 0
复制代码





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-29 16:16:58 | 显示全部楼层
本帖最后由 bevin 于 2014-7-29 16:31 编辑

给你提供一种新的解法,善用python强大的内置函数
  1. import string

  2. up = string.uppercase
  3. str1 = input('输入字符串') #如'asSDFvagrwIFRdfDFerf''
  4. str2 = string.translate(str1,string.maketrans(up,'0'*26)) #将str1中的所有大写用0替换 得到'as000vagrw000df00erf'
  5. str3 = str2.replace('000','-') #将三个连续0用-替换 得到'as-vagrw-df00erf'
  6. result = str3.split('-') #用-分隔字符串,得到列表 ['as','vagrw','df00erf']
  7. if len(result) == 0:
  8.         print ('输入字符串得不到密码!')
  9. else:
  10.         for sub in result[1:-1]:
  11.                 if '0' not in sub:
  12.                         print(sub)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-29 00:13:42 | 显示全部楼层
先mark,晚一点回来处理!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-29 15:44:20 | 显示全部楼层
表示完全不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-29 16:20:49 | 显示全部楼层
小甲鱼的解法应该是根据状态机来解的,一般不容易看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-29 20:50:06 | 显示全部楼层
bevin 发表于 2014-7-29 16:16
给你提供一种新的解法,善用python强大的内置函数

这个不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-29 21:09:16 From FishC Mobile | 显示全部楼层
额,那怎么破
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-29 21:21:50 From FishC Mobile | 显示全部楼层
参考上面给你发的新思路看看能不能看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-29 22:42:14 | 显示全部楼层

哈哈 谢谢了。。。

点评

解释起来有点拗口,你弄明白了就好!  详情 回复 发表于 2014-7-29 22:47
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-29 22:43:43 | 显示全部楼层
bevin 发表于 2014-7-29 16:16
给你提供一种新的解法,善用python强大的内置函数

咦?看起来不错,谢谢了:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-29 22:47:22 | 显示全部楼层
醉、爱 发表于 2014-7-29 22:42
哈哈 谢谢了。。。

解释起来有点拗口,你弄明白了就好!{:7_181:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-29 22:56:51 | 显示全部楼层
~风介~ 发表于 2014-7-29 22:47
解释起来有点拗口,你弄明白了就好!

这题纠结了好久,你一解释,有种恍然大悟的感觉。。。:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-30 02:45:03 | 显示全部楼层
。。靠
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-31 10:59:59 | 显示全部楼层

牛人!这个一下就明白怎么回事了,漂亮
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-12 16:57:44 | 显示全部楼层

前辈,这道题目没看懂countA,countB,countC的作用机制.....能再解释一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-13 01:21:57 | 显示全部楼层
前面解释的很清楚啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-23 19:05:03 | 显示全部楼层
内置函数加判断句步骤少,x为给的文件中的字符串:
def fun(x):
    temp = []
    lenght = len(x)
    for each in range(3,lenght-3):
        
        if x[each].islower():
            
            if x[each-1].swapcase().islower() and x[each-2].swapcase().islower() and x[each-3].swapcase().islower() and x[each-4].islower() and x[each+1].swapcase().islower() and x[each+2].swapcase().islower() and x[each+3].swapcase().islower() and x[each+4].islower():

               
                temp.append(x[each])

               
    str1 = ''
    for each in temp:
        str1 += each
    print(str1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-23 22:05:22 | 显示全部楼层
正则,密文字符串在9楼
  1. str1 = '' # 密文字符串在9楼
  2. import re
  3. ptnMi=re.compile(r'(?<=[A-Z]{3})[a-z](?=[A-Z]{3})')
  4. pos=[m.start() for m in ptnMi.finditer(str1)]
  5. MiMa = ''
  6. for p in pos :
  7.     if str1[p-4].isupper() or str1[p+4].isupper() :
  8.         continue
  9.     MiMa += str1[p]

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

使用道具 举报

发表于 2016-7-24 07:03:40 | 显示全部楼层
密文字符串在  9楼  
正则 + 集合 ,进一步简化程序~
  1. str1 = '' # 密文字符串在9楼
  2. import re

  3. ptnMi3=re.compile(r'(?<=[A-Z]{3})[a-z](?=[A-Z]{3})')
  4. pos3={m.start() for m in ptnMi3.finditer(str1)}

  5. ptnMi4=re.compile(r'(?<=[A-Z]{4})[a-z]|[a-z](?=[A-Z]{4})')
  6. pos4={m.start() for m in ptnMi4.finditer(str1)}

  7. MiMa =''.join([str1[p] for p in sorted(pos3-pos4)])
  8. print(MiMa)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-6 15:22:27 | 显示全部楼层
这是我理解后列的一个过程: 数为ABcdEFHgMNQrSTVGmOPQzJACd    可以看简单看出 只有g,z 满足条件
下面是每个字母的过程, 用的是小甲鱼的方法。 count A B C 我就用 前 中 后 代替 方便理解!!!!
->的 意思是变为 前->0  就是 前变为1   len 就是整个字符的长度!
                                                  首先            前=0     中=0     后=0
A:  (大写,此时的中为0)                               前->1     中=0     后=0
B:  (大写,此时的中为0)                               前->2     中=0     后=0
c:  (是小写但此时前!=3,所以清空)            前->0     中->0    后->0
d:  (是小写但此时前!=3,所以清空)           前->0     中->0    后->0
E:  (大写,此时的中为0)                                 前->1     中=0      后=0
F:  (大写,此时的中为0)                                 前->2     中=0     后=0
H:  (大写,此时的中为0)                                前->3     中=0     后=0
g:  (是小写 此时 前=3)                                    前=3      中->1    后->0   traget=g
M:  (大写,此时的中为1)                                前=3     中=1     后->1
N:  (大写,此时的中为1)                                前=3      中=1      后->2
Q:  (大写,此时的中为1)                                前=3       中=1     后->3  此时 前 后 都为3了 执行最后一个IF 第四个(也就是Q后面的那个) r的索引+1!=len (r不是最后一个)且  r  不是大写,所以打印出g    然后重新定义前中后!! 前->3     中->0    后->0

r:  (是小写 此时 前=3)                                    前=3      中->1    后->0    traget=r
S:  (大写,此时的中为1)                                前=3     中=1      后->1
T:  (大写,此时的中为1)                                前=3     中=1      后->2
V:  (大写,此时的中为1)                                前=3     中=1     后->3   此时 前 后 都为3了 执行最后一个IF 第四个(也就是V后面的那个) G的 索引+1=len (G是最后一个)且  G 是大写,所以舍弃r      并清空  中  和 后              前=3     中->0    后->0

G:  (大写,此时的中为0)                                 前=4     中=0      后=0
m:(是小写但此时前!=3,所以清空)             前->0     中->0    后->0
O:(大写,此时的中为0)                                 前->1     中=0      后=0
P:(大写,此时的中为0)                                 前->2     中=0      后=0
Q:(大写,此时的中为0)                                 前->3     中=0      后=0
z: (是小写 此时 前=3)                                   前=3      中->1    后->0   traget=z
J:(大写,此时的中为1)                                前=3     中=1       后->1
A:(大写,此时的中为1)                                前=3     中=1      后->2
C:(大写,此时的中为1)                                前=3     中=1      后->3  此时 前 后 都为3了 执行最后一个IF 第四个(也就是C后面的那个)d的索引+1!=len (r不是最后一个)且  d  不是大写,所以打印出z    前->3     中->0    后->0

d:(是小写 此时 前=3)                                   前=3      中->1    后->0   traget=d

第一次写这么多,这是我理解的过程, 应该说的通, 逐个去看的话 应该能理解吧..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 00:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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