[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 官方文档
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值