求解,第20讲课后练习的最后一道编程题
本帖最后由 ~风介~ 于 2014-7-29 21:53 编辑题目:1. 请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
a) 每位密码为单个小写字母
b) 每位密码的左右两边均有且只有三个大写字母
做的时候只有一点点思路,然后只能看答案,结果发现答案完全看不懂啊,看了十几遍了,求解释答案
答案:
str1 = '''拷贝过来的字符串'''
countA = 0
countB = 0
countC = 0
length = len(str1)
for i in range(length):
if str1 == '\n':
continue
if str1.isupper():
if countB == 1:
countC += 1
countA = 0
else:
countA += 1
continue
if str1.islower() and countA == 3:
countB = 1
countA = 0
target = i
continue
if str1.islower() and countC == 3:
print(str1, end='')
countA = 0
countB = 0
countC = 0
本帖最后由 bevin 于 2014-7-29 16:31 编辑
给你提供一种新的解法,善用python强大的内置函数
import string
up = string.uppercase
str1 = input('输入字符串') #如'asSDFvagrwIFRdfDFerf''
str2 = string.translate(str1,string.maketrans(up,'0'*26)) #将str1中的所有大写用0替换 得到'as000vagrw000df00erf'
str3 = str2.replace('000','-') #将三个连续0用-替换 得到'as-vagrw-df00erf'
result = str3.split('-') #用-分隔字符串,得到列表 ['as','vagrw','df00erf']
if len(result) == 0:
print ('输入字符串得不到密码!')
else:
for sub in result:
if '0' not in sub:
print(sub)
先mark,晚一点回来处理! 表示完全不懂 小甲鱼的解法应该是根据状态机来解的,一般不容易看懂 bevin 发表于 2014-7-29 16:16
给你提供一种新的解法,善用python强大的内置函数
这个不错 额,那怎么破 参考上面给你发的新思路看看能不能看懂 ~风介~ 发表于 2014-7-29 22:38
哈哈 谢谢了。。。 bevin 发表于 2014-7-29 16:16
给你提供一种新的解法,善用python强大的内置函数
咦?看起来不错,谢谢了:lol: 醉、爱 发表于 2014-7-29 22:42
哈哈 谢谢了。。。
解释起来有点拗口,你弄明白了就好!{:7_181:} ~风介~ 发表于 2014-7-29 22:47
解释起来有点拗口,你弄明白了就好!
这题纠结了好久,你一解释,有种恍然大悟的感觉。。。:lol: 。。靠 ~风介~ 发表于 2014-7-29 22:38
牛人!这个一下就明白怎么回事了,漂亮 ~风介~ 发表于 2014-7-29 22:38
前辈,这道题目没看懂countA,countB,countC的作用机制.....能再解释一下吗? 前面解释的很清楚啊{:10_279:} 内置函数加判断句步骤少,x为给的文件中的字符串:
def fun(x):
temp = []
lenght = len(x)
for each in range(3,lenght-3):
if x.islower():
if x.swapcase().islower() and x.swapcase().islower() and x.swapcase().islower() and x.islower() and x.swapcase().islower() and x.swapcase().islower() and x.swapcase().islower() and x.islower():
temp.append(x)
str1 = ''
for each in temp:
str1 += each
print(str1) 正则,密文字符串在9楼
str1 = '' # 密文字符串在9楼
import re
ptnMi=re.compile(r'(?<={3})(?={3})')
pos=
MiMa = ''
for p in pos :
if str1.isupper() or str1.isupper() :
continue
MiMa += str1
print(MiMa)
密文字符串在9楼
正则 + 集合 ,进一步简化程序~
str1 = '' # 密文字符串在9楼
import re
ptnMi3=re.compile(r'(?<={3})(?={3})')
pos3={m.start() for m in ptnMi3.finditer(str1)}
ptnMi4=re.compile(r'(?<={4})|(?={4})')
pos4={m.start() for m in ptnMi4.finditer(str1)}
MiMa =''.join( for p in sorted(pos3-pos4)])
print(MiMa) 这是我理解后列的一个过程: 数为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
第一次写这么多,这是我理解的过程, 应该说的通, 逐个去看的话 应该能理解吧..
页:
[1]
2