第十关是一张牛的图片和一行字: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. Watchmen CodeForces - 650A

    Watchmen CodeForces - 650A Watchmen are in a danger and Doctor Manhattan together with his friend Da ...

  2. git初次建立远程仓库问题

    git "Could not read from remote repository.Please make sure you have the correct access rights. ...

  3. Codeforces Round #461 (Div. 2) A. Cloning Toys

    A. Cloning Toys time limit per test 1 second memory limit per test 256 megabytes Problem Description ...

  4. 海量数据处理算法—BitMap

    1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空 ...

  5. 自定义View/ViewGroup的步骤和实现

    1.设置属性(供XML调用) 在res目录新建attrs.xml文件 <?xml version="1.0" encoding="utf-8"?> ...

  6. mysql-copy to tmp table

    今天数据后台数据反映有些迟缓后查看链接 processlist 发下好多 锁 和磁盘写入,   参考文章 : http://bbs.chinaunix.net/forum.php?mod=viewth ...

  7. P3398 仓鼠找sugar(树链剖分)

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  8. 49、android studio 使用技巧记录

    1.删除 cmd+del 2.自动导入需要的类  option+enter 3.Option + F7 ——查找哪里引用了该方 Cmd + Option + F7 —— 列出引用的列表 4.Cmd + ...

  9. 图说不为人知的IT传奇故事-1-计算机新生

    此系列文章为“图说不为人知的IT传奇故事”,各位大忙人可以在一分钟甚至几秒内了解把握整个内容,真可谓“大忙人的福利”呀!!希望各位IT界的朋友在钻研技术的同时,也能在文学.历史上有所把握.了解这些故事 ...

  10. STW 团队项目分析

    序言 经过我们团队的详细讨论,最终确定我们的项目立意,它包含这我们每个人的观点,我相信我们可以做的很好,Believe......................................... ...