第十关是一张牛的图片和一行字:len(a[30])=?。图片中的牛是一个链接,点开后进入一个新页面,只有一行字:

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

看来要知道第31个数多长,首先得算出第31个数是多少。

我开始以为只是简单的找规律,各种方法试了个遍,怎么都算不出来,无奈只好搜索之,一搜搜到一个维基百科:Look-and-say sequence。看完才明白自己完全走错了路。

这个数列的规律是,后一个数用来描述前一个数,比如第一个数是1,第二个数描述1就是1个1,也就是11,第三个数描述11就是2个1也就是21,第四个数描述21就是1个2和1个1也就是1211,以此类推。

维基百科页面给了一段 Python 代码,用来生成这个数列:

def look_and_say(member):
while True:
yield member
breakpoints = ([0] + [i for i in range(1, len(member)) if member[i - 1] != member[i]] + [len(member)])
groups = [member[breakpoints[i - 1]:breakpoints[i]] for i in range(1, len(breakpoints))]
member = ''.join(str(len(group)) + group[0] for group in groups) # Print the 10-element sequence beginning with "1"
sequence = look_and_say("")
for i in range(10):
print sequence.next()

这段代码是把数列中的每个数当做一个字符串来求解。首先求的不相同数字间的起始位置的一个列表:

breakpoints = ([0] + [i for i in range(1, len(member)) if member[i - 1] != member[i]] + [len(member)])

这里,列表的第一个数为0,也就是起始位置。后面存储的断点为相邻两个数不相等的位置。最后加上一个前一个数的长度。比如输入的数为 ‘1211’,得到的 breakpoints 就是 [0, 1, 2, 4]。第一个数为0,第二个数为2和1不相等的位置也就是1,第三个数为1和2不相等的位置就是2,后面两个1相等,就直接加上数字的长度4。

求得断点后,根据断点,把前一个数字分为不同部分组成的列表:

groups = [member[breakpoints[i - 1]:breakpoints[i]] for i in range(1, len(breakpoints))]

仍然以 ‘1211’ 作为输入例子,这里 i 是 [1, 2, 3],i=1时,列表的第一项为 member[0:1] = '1',i=2时,列表第二项为 member[1:2] = '2',i=3时,列表第三项为 member[2:4] = '11'。也就是说,groups 为 ['1', '2', '11']。

最后一步,根据 groups,算出下一个数:

member = ''.join(str(len(group)) + group[0] for group in groups)

join()方法的参数中是一个列表解析,对 groups 中的每一项,算出长度,并转换为字符串,然后加上每一项的第一个字符也就是这个数组成一组,然后把整个列表 join 成一个字符串,得到下一个数。对于上一步得出的 groups = ['1', '2', '11'],列表解析 [str(len(group)) + group[0] for group in groups] 得出的结果为:['11', '12', '21'],连接起来就是 ‘111221’,也就是下一个数。

这个代码使用生成器写的,输入是数列中的一个数,可以稍微修改一下,输入为数列的索引,输出为该位置的数:

def look_and_say(index):
if index == 0:
return ''
member = ''
for i in xrange(index):
breakpoints = ([0] + [i for i in range(1, len(member)) if member[i - 1] != member[i]] + [len(member)])
groups = [member[breakpoints[i - 1]:breakpoints[i]] for i in range(1, len(breakpoints))]
member = ''.join(str(len(group)) + group[0] for group in groups)
return member

这样我们直接输入 print len(look_and_say(30)) 就可以得到答案:5808,修改 url,就可以进入下一关:http://www.pythonchallenge.com/pc/return/5808.html

Python Challenge 第十关的更多相关文章

  1. python challenge第1关--NoteBook上的“乱码”

    在 python challenge第0关中已经得到第1关的地址了: http://www.pythonchallenge.com/pc/def/map.html 一.观察地址栏和标签: What a ...

  2. Python Challenge 第十五关

    第15关,题目是 whom? 有一张图片,是个日历.日历的年份是 1XX6,中间是被挖去的洞.然后图中1月26日被画了个圈,当天是星期一.右下角的二月小图中有29号,可以得知这是闰年.然后查看源代码. ...

  3. Python Challenge 第十四关

    14关页面上是两张图,一张是一个卷面包,一张类似条形码的东西.没任何提示,就看源代码,果然,有一行注释: <!-- remember: 100*100 = (100+99+99+98) + (. ...

  4. Python Challenge 第十二关

    这一关依旧只有一张图,右键源代码也没有任何注释,也用PIL处理过那张图但没任何头绪,没办法只有上网搜答案. 别人的博客里说,源代码里面图片的名字是 evil1.jpg,那肯定会有 evil2.jpg. ...

  5. Python Challenge 第十三关

    第13关.一张电话的图片,一句话:phone that evil.看到电话,加上之前关卡有些图片有链接,我就在电话按键上都点点试试,果然 5 是个链接,就点了进去.出来一个XML文件,第一句写着:Th ...

  6. Python Challenge 第十一关

    第十一关,一张模糊的图,题目为 odd even,源代码中也没任何提示,看来又是图像处理. 这张模糊的图看起来没什么头绪,但是题目给了个奇数和偶数,就先试试坐标吧,根据原图来生成一个新图.我第一次尝试 ...

  7. Python Challenge 第八关

    这一关有一个蜜蜂的图片和一句提示:Where is the missing link? 这页面上乱点,在图片中蜜蜂身上还真点出一个链接,让输入用户名和密码,于是就去看源代码.果然,最下面有两行注释: ...

  8. Python Challenge 第七关

    第七关,只有一张图片,右键源代码也什么都没有,只是这图片上有一行类似马赛克一样的部分.看来答案只有在这张图上找了.下载了图片,去网上搜一下有什么库可以处理图像.搜到了一个PIL,发现安装的python ...

  9. Python Challenge 第六关

    第六关只有一张图和一个 PayPal 的链接,右键源代码注释中写着 PayPal 是作者要赞助的,跟题目没关系,其他的提示只有注释中写的个 zip.试过下图片,改图片扩展名等等都失败了,最后乱试改了下 ...

随机推荐

  1. 时间转换,django的时间设置,re模块简单校验密码和手机号

    时间转换和密码,手机的re模块简单校验 import re,time def check_userinfo(request): pwd = request.POST.get("pwd&quo ...

  2. 菜鸟学Linux - Linux文件属性

    在Linux中,文件的属性是一个很重要的概念,用户或者用户组对一个文件所拥有的权限,都可以从文件的属性得知. 我们可以通过ls -al命令,列出某个文件夹下面的所有文件(包括以.开头的隐藏文件).下面 ...

  3. 【小程序入门集锦】19,微信小程序个人帐号申请

    个人账号与企业帐号相比,缺少支付等功能,与个人订阅号类似.   小程序开放个人开发者申请注册,个人用户可访问微信公众平台,扫码验证个人身份后即可完成小程序帐号申请并进行代码开发.   下面我们就来说说 ...

  4. BZOJ 4971: [Lydsy1708月赛]记忆中的背包

    神仙构造 分成x个1和一堆>=w-x的大物品 (x<=20 w>=50) 则拼成w的方案中有且仅有一个大物品 若最终序列中有x个1,有一个大物品为w-k,可以提供C(x,k)种方案 ...

  5. SQLAlchemy Script

    SQLAlchemy: 1.由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 from sqlalchemy_utils impo ...

  6. 【Luogu P2781】 传教

    这题是可以用线段树做的. 虽然$n\leq 10^9$ 可以发现,真正需要用到的节点很少,故动态开点,只有需要用到的时候才新建节点. 这里我在下放标记的时候新建节点,因为每操作/查询一个节点都需要先下 ...

  7. @SpringBootApplication的扫描范围

    在公共类自定义一个全局异常类,实现全局捕获异常,在另一个服务中调用的时候,发现没有生效 因此我添加了一个@ComponentScan("com.wuhen.jwt.common") ...

  8. 解决This application failed to start because it could not find or load the Qt platform plugin "windows

    解决方案:所在环境python根目录下qt.conf,重新设置path即可,此类问题通常在目录转移之后出现.

  9. PAT——乙级1012

    1012 数字分类 (20 point(s)) 给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A​1​​ = 能被 5 整除的数字中所有偶数的和: A​2​​ = 将被 5 除后 ...

  10. c#每循环100次提交一次数据,最后一次不足100次提交一次

    StringBuilder sb=new StringBuilder(); string strId=dataGridView1.Rows[dataGridView1.CurrentRow.Index ...