- [Python Challenge通关]第10关 what ar
- [Python Challenge通关]第1关 what abo
- [Python Challenge通关]第9关 connect
- [Python Challenge通关]第8关 working
- [Python Challenge通关]第7关 smarty
- [Python Challenge通关]第0关 warming
- [Python Challenge通关]第3关 re
- [Python Challenge通关]第2关 ocr
- [Python Challenge通关]第12关 dealing
- [Python Challenge通关]第11关 odd eve
len(a[30]) = ?
挑战地址,点我
分析
图片上的牛是可以点击的,点击牛打开新的页面 http://www.pythonchallenge.com/pc/return/sequence.txt,显示如下内容:
a = [1, 11, 21, 1211, 111221,
联系原来页面上的提示 len(a[30]) = ?
,应该是需要找到规律,推到出第 31
项 a[30]
。
想了一种规律:
假设前三项先不用管,第四项 1211
是第三项翻转一下 12
拼接上第二项翻转 11
,
第五项 111221
是第四项翻转后每两个分组 [11, 21]
,第三项翻转 12
,第三项插入第四项分组后中间 [11, 12, 21]
,拼接起来。
按照这样的规律,计算得到的 len(a[30]) = 1664080
,替换 url,发现不正确。
搜索了一下,正确的规律应该如下:
a[0] = 1
由 1 个 1 组成,那么
a[1] = 11
由 2 个 1 组成,那么
a[2] = 21
由 1 个 2,1 个 1 组成,那么
a[3] = 1211
由 1 个 1,1 个 2,2 个 1 组成,那么
a[4] = 111221
...省略
python 中的 itertools
包中的 groupby 可以用来方便的解决。
测试一下:
#!/usr/bin/env/ python3
from itertools import groupby
a='111221'
for k, v in groupby(a):
print(k, list(v))
输出结果:
1 ['1', '1', '1']
2 ['2', '2']
1 ['1']
可以看到 groupby
可以用来把相邻的相同的字符进行分组。
实现代码:
#!/usr/bin/env/ python3
from itertools import groupby
a='1'
for i in range(30):
a = ''.join(str(len(list(v))) + k for k, v in groupby(a))
print(len(a))
输出结果:
5808
替换 url 就可以进入下一关 http://www.pythonchallenge.com/pc/return/5808.html
补充
也可以使用正则表达式来实现:
#!/usr/bin/env/ python3
import re
a='1'
for i in range(30):
a = "".join([str(len(m.group(0))) + m.group(1) for m in re.finditer(r"(\d)\1*", a)])
print(len(a))
参考资源:
网友评论