yulu

python3 学习(CoolShell puzzle game)

python3 趣味学习系列

前段时间写过几个python3的小例子,后来由于工作原因暂停了python3的学习,也就半个月的时间没有看python的代码,感觉又要重新学习一遍python了😓 。我是做php出身的,转做python并不是因为想放弃php。主要是为了拓展思路,让自己在思考问题的时候能够有不同的想法,然后看一下python的实现方式,再者就是感觉python挺有意思的。

好了,废话不多说,进入正题:注(系统环境:MacOS 10.12)

CoolShell puzzle game 这个东西好像和 微博:@左耳朵耗子 有关系。算了具体我也不太清楚,先不用管它和谁有关系了,目前对我们来说是学习python😁 ,另外再推荐一个类似的网站 python challenge 这个网站是为推广python做的。两个思路差不多,前者清爽,后者古典。

My brain has been fucked

当我们一开始看到这个页面的时候可能有点儿懵逼,因为我们看到的差不多都是一堆+ , - , [ , ] , < , > .。一开始我也不太清楚这是一堆什么鬼,后来才知道原来有一条重要的提示在给出的 My brain has been fucked 这句话中即:Brainfuck 大家看到这个wiki之后应该知道Brainfuck是歪果仁发明的一种语言(注定这种语言不会火,太不自然了这种语言,装逼还行,要是真要拿这种语言去写代码估计整天得烦死😡 )。
知道了Brainfuck这种语言对C语言的转化我们就可以将给出的一堆操作符转化为C语言了,然后执行C程序就知道下一关的key了
以下为代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ori_str = "#include <stdio.h> \n" + \
"#include <stdlib.h> \n" + \
"int main(){ \n" + \
"char arr[10000]; char *p = arr;"
brainfuck = "++++++++[>+>++>+++>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<>>>>>>>>>>>>+++.---<<<<<<<<<<<<>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>--.++<<<<<<>>>>>>>>>>>>>.<<<<<<<<<<<<<>>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<<>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<."
for ch in brainfuck:
if ch == ">":
ori_str += "++p;"
elif ch == "<":
ori_str += "--p;"
elif ch == "+":
ori_str += "++*p;"
elif ch == "-":
ori_str += "--*p;"
elif ch == ".":
ori_str += "putchar(*p);"
elif ch == ",":
ori_str += "*p=getchar();"
elif ch == "[":
ori_str += "while(*p){"
elif ch == "]":
ori_str += "}"
ori_str += "}"
with open("test.c", "w") as f:
f.write(ori_str)

生成test.c 只要编译运行C程序就可以了

1
2
3
gcc test.c -o test
./test

得到结果:welcome
然后替换网址中的first进入下一关

What is the meaning of life, the universe and everything?

What is the meaning of life, the universe and everything? 直击心灵的问题啊😂 。不多扯了,看给出的数就知道是一个和斐波那契数列有关的问题,那我们就求一下咯:

1
2
3
4
5
6
7
8
9
10
11
12
# -*- coding:utf-8 -*-
def fun(count):
n , a , b = 0 , 2 , 3
while n < count:
yield a
a , b = b , a * b
n = n + 1
if __name__ == "__main__":
li = fun(6)
print(list(li))

这里用python的生成器实现,得到第6个数是1944,然后我们输入1944得到的结果是我们只猜对了X还有一个Y我们不知道是什么,这时候我觉的有点玄学了😄 ,任何事情的终极答案是什么呢?后来想了很久可能是我觉的可能是万事万物都是一个循环,这个有点像我很小的时候听到的一个非主流预言:一个人的诞生往往伴随着另一个人的死亡。然后,会不会就是这一列数里面从最末尾的一个字符然后组合上第一个字符呢?这样就是一个循环了。这纯属我瞎猜的。然后我们用把Y的值赋成42,与1944相乘得到81648,然后替换welcome。进入下一关😂 。

81648.html

这一关给了一个键盘的图片和一个字符串,但是键盘上的字母的位置好像和我们现在用的键盘的位置不太一样,点击图片就会进入wiki里面看到这种键盘的介绍,有兴趣的可以自己查一下。那问题就很明显了我想应该是让我们把给出的字符串中的字符按照给出的键盘字母位置再对应现在我们常用的键盘的字母位置转化出来就应该能得到进一步的答案。我们大体对应一下前几个字符好像是main(),联想到第一节的C代码,这个也要转化为C程序。废话不多说上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf-8 -*-
n_k = "-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./_+QWERTYUIOP{}|ASDFGHJKL:\"ZXCVBNM<>?"
s_k = "[]',.pyfgcrl/=\\aoeuidhtns-;qjkxbmwvz{}\"<>PYFGCRL?+|AOEUIDHTNS_:QJKXBMWVZ"
in_str = "macb() ? lpcbyu(&gbcq/_\\021%ocq\\012\\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+"
res = ''
for key in in_str:
index = s_k.find(key)
if not index == -1:
res += n_k[index]
else:
res += key
with open("key.c","w") as f:
f.write(res)

1
2
gcc key.c - key
./key

得到结果是unix, 替换81648到下一关

unix.html

首先映入眼帘的是一个二维码图片,然后二维码下面一个字符串,相信大家见到二维码图片应该很自然的就想到要扫码吧😂 ,扫出来的结果是这样的:

1
2
[abcdefghijklmnopqrstuvwxyz] <=>
[pvwdgazxubqfsnrhocitlkeymj]

很明显了又是一个字符互换,不过这个和上一个还是有区别的,这个字符互换应该是位置的互换,啥?你问我咋知道的,你要是试试给出的乱序字符串前几个字符转化一下看看能不能组成正常的单词你也知道😄 。好了废话不多说看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding:utf-8 -*-
ori_str = "abcdefghijklmnopqrstuvwxyz"
tar_str = "pvwdgazxubqfsnrhocitlkeymj"
input_str = 'Wxgcg txgcg ui p ixgff, txgcg ui p epm. I gyhgwt mrl lig txg ixgff wrsspnd tr irfkg txui hcrvfgs, nre, hfgpig tcm liunz txg crt13 ra "ixgff" tr gntgc ngyt fgkgf.'
trim_str = input_str.lower()
ori_dic = dict(zip(tar_str,ori_str))
print(ori_dic)
#print(trim_str)
res = ''
for ch in trim_str:
if ch in ori_dic.keys():
res += ori_dic[ch]
else:
res += ch
print(res)

得到的结果是一句话:chere there is a shell, there is a way. s expect you use the shell command to solve this problem, now, please try using the rot13 of "shell" to enter next level. 简单翻译就是有一种rot13规则,有兴趣的自行google,然后shell中执行以下代码:

1
echo 'shell' | tr '[A-Za-z]' '[N-ZA-Mn-za-m]'

得到结果furyy,替换unix进入下一关。

Palindrome

给出的提示应该是在网页源代码中找提示,提示需满足是一个回文字符串的中间位置的字符,这个回文字符串需要满足条件

  • 第一个或者第二个字符一个是字母一个是数字
  • 中间的字符必须是小写字母

看一下网页源代码可以看到最后的一大段字符串,和python challenge一样的套路。
可以用正则表达式来匹配字符,这里引用了python的re模块,当然正则还是要自己写的😓 ,所以又大体上看了一遍正则表达式教程😓 ,顺便感概以下有网络真好😂 ,什么不会直接搜就好了😂 ,这里用到了正则分组,后向引用的概念,分组是”()”,向后引用类似于”/2”,就是一个反斜杠一个数字。下面上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
# -*- coding:utf-8 -*-
import string
import re
def my_solution(str1):
p = re.compile(r"([A-Z])([0-9])[a-z](\2)(\1)|([0-9])([A-Z])[a-z](\6)(\5)")
s = p.finditer(str1)
print(list(s))
if __name__ == '__main__':
str1 = open("test.txt",'r').read()
my_solution(str1)

test.txt 是用来存网页源代码中的那个长字符串,得到的结果match就是对应的几个符合要求的字符串即:

1
2
3
4
5
6
7
8
9
E1v1E
4FaF4
9XrX9
O3i3O
0MaM0
4GbG4
M5l5M
0WeW0
Y0s0Y

即单词variables

Keep going, you will find the result…

同样一幅图+一句话
文字的意思很清楚了,不断的前进就会得到结果,点击图片然后跳转到一个页面,页面上除了一个数字啥都没有,做过python challenge的简直秒懂了。拿给出的数字不断的替换url中最后一部分,当然中间可能会有一点小插曲。上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# -*- coding:utf-8 -*-
from urllib import request , parse
#import re
default_url = "http://fun.coolshell.cn/n/"
default_number = 2014
url = default_url + str(default_number)
tmp_res = request.urlopen(url)
res = tmp_res.read()
while res.isdigit():
url = default_url + str(int(res))
print(url)
tmp_res = request.urlopen(url)
res = tmp_res.read()
print(res)

最后输出一句:Cool! the next level is “tree”
感觉有点比python challenge 简单,python challenge在循环找页面的时候还会不定时的出现字符串。有兴趣的可以去试试

Binary Tree

未完待续…