Python Challenge 之 BASH 解法
环境:windows7 cygwin
第零关
网址: http://www.pythonchallenge.com/pc/def/0.html
解法: 首先我看到了"Hint: try to change the URL address.",然后进入到了http://www.pythonchallenge.com/pc/def/1.html得到提示"2**38 is much much larger. ",得知这个数字应该是上页图片上显示的2的38次方而不是1.
$ bc <<< 2^38 274877906944
第一关
网址: http://www.pythonchallenge.com/pc/def/274877906944.html
解法: 从标题的明显提示"What about making trans?",结合图片里的三组转换得到这个凯撒密码的转换规则,被转换的显然是下面的几行红字,转换得到提示后知道最终应该转换map这个单词.
$ echo "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj." | tr "[a-z]" "[c-zab]" i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url. $ echo map | tr "[a-z]" "[c-zab]" ocr
第二关
网址: http://www.pythonchallenge.com/pc/def/ocr.html
解法: 由页面上的提示"MAYBE they are in the page source.",进入源代码,注释"find rare characters in the mess below:"告诉我们,这关的任务就是从这些标点符号中提取仅存的几个字母出来,我没有把这些乱码另存为文件,而是复制到剪切板里,使用getclip命令直接获取,这样更方便点.
$ getclip | grep -o "[a-z]" | tr -d "\n" equality
第三关
网址: http://www.pythonchallenge.com/pc/def/equality.html
解法: 由页面上的提示"两边各被三个大写字母包围的小写字母"以及图片中形象的比喻,得知这关又是一个提取操作,grep最适合不过了.同样复制源代码中的注释到剪切板.
$ getclip | grep -oP '(?<=[a-z][A-Z]{3})[a-z](?=[A-Z]{3}[a-z])' | tr -d "\n" linkedlist
第四关
网址: http://www.pythonchallenge.com/pc/def/linkedlist.html
解法: 跳到linkedlist.php,点击图片链接进入,发现这是一个不少于400次(源代码注释)的链接跳跃游戏.wget和curl都可以胜任这样任务,这里使用纯awk脚本.
#!/usr/bin/awk -f BEGIN{ num=12345; while(num=m[!!match(($0=getHtml("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="num)),"is ([0-9]+)",m)]){ } num/=2; while(num=m[!!match(($0=getHtml("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="num)),"is ([0-9]+)",m)]){ } print $NF; } function getHtml(url){ host=gensub("^http://|/.*","","g",url); path=gensub("^http://[^/]*/?","/","g",url); socket="/inet/tcp/0/"host"/80"; print "GET "path" HTTP/1.0\r\nHost: "host"\r\n\r" |& socket; html=""; while((socket |& getline) > 0){ html=html$0"\n"; } close(socket); return html; }