醉、爱 发表于 2014-7-27 17:55:20

求解,第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:16:58

本帖最后由 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)

~风介~ 发表于 2014-7-29 00:13:42

先mark,晚一点回来处理!

sunny989129 发表于 2014-7-29 15:44:20

表示完全不懂

bevin 发表于 2014-7-29 16:20:49

小甲鱼的解法应该是根据状态机来解的,一般不容易看懂

wangerwanger 发表于 2014-7-29 20:50:06

bevin 发表于 2014-7-29 16:16
给你提供一种新的解法,善用python强大的内置函数

这个不错

醉、爱 发表于 2014-7-29 21:09:16

额,那怎么破

bevin 发表于 2014-7-29 21:21:50

参考上面给你发的新思路看看能不能看懂

醉、爱 发表于 2014-7-29 22:42:14

~风介~ 发表于 2014-7-29 22:38


哈哈 谢谢了。。。

醉、爱 发表于 2014-7-29 22:43:43

bevin 发表于 2014-7-29 16:16
给你提供一种新的解法,善用python强大的内置函数

咦?看起来不错,谢谢了:lol:

~风介~ 发表于 2014-7-29 22:47:22

醉、爱 发表于 2014-7-29 22:42
哈哈 谢谢了。。。

解释起来有点拗口,你弄明白了就好!{:7_181:}

醉、爱 发表于 2014-7-29 22:56:51

~风介~ 发表于 2014-7-29 22:47
解释起来有点拗口,你弄明白了就好!

这题纠结了好久,你一解释,有种恍然大悟的感觉。。。:lol:

墙角君 发表于 2014-7-30 02:45:03

。。靠

wangerwanger 发表于 2014-7-31 10:59:59

~风介~ 发表于 2014-7-29 22:38


牛人!这个一下就明白怎么回事了,漂亮

NoDinner 发表于 2016-7-12 16:57:44

~风介~ 发表于 2014-7-29 22:38


前辈,这道题目没看懂countA,countB,countC的作用机制.....能再解释一下吗?

MrFiona 发表于 2016-7-13 01:21:57

前面解释的很清楚啊{:10_279:}

就是下雨了 发表于 2016-7-23 19:05:03

内置函数加判断句步骤少,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)

SixPy 发表于 2016-7-23 22:05:22

正则,密文字符串在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)

SixPy 发表于 2016-7-24 07:03:40

密文字符串在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)

waw1228@qq.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

第一次写这么多,这是我理解的过程, 应该说的通, 逐个去看的话 应该能理解吧..
页: [1] 2
查看完整版本: 求解,第20讲课后练习的最后一道编程题