[Python Challenge通关]第10关 what are you looking at

《[Python Challenge通关]第10关 what are you looking at》 bull

len(a[30]) = ?

挑战地址,点我

分析

图片上的牛是可以点击的,点击牛打开新的页面 http://www.pythonchallenge.com/pc/return/sequence.txt,显示如下内容:

a = [1, 11, 21, 1211, 111221,

联系原来页面上的提示 len(a[30]) = ?,应该是需要找到规律,推到出第 31a[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))

参考资源:

  1. groupby 官方文档
    原文作者:jianggushi
    原文地址: https://www.jianshu.com/p/f3c4a655752a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞