Posts Tagged ‘ pychallenge

New Challenge

今日入职新工作,工作机是一台WinXP,来得时候没带其他OS的安装介质,只好挂着代理下Python的安装包。

想起老大吩咐准备Python培训时说:实在不行就每天一道Python Challenge

于是等待下载的时候就捡起了Python Challenge(http://www.pythonchallenge.com/)。话说上次(四年前?)被第五关那个伪装成”Pack Hell”的”pickle”给恶心到了,当时心中隐隐懊恼自己的E文水平,顺便也认为在计算机编程题中以谐音作为难点很无趣,于是就木有继续做下去。
没想到会又一次面对这站。

因为安装包还在下载中,所以解题时自然无法使用本机的Python。

于是突发奇想,反正从前也用Python切过这站,今次何不换门语言?

把Python Challenge 玩成New Challenge好了 : P

第一关,直接在地址栏里敲入

?View Code JAVASCRIPT
javascript: alert(Math.pow(2, 38));

……貌似算得还挺快?

第二关, 移位密码……脑子里立刻浮现出一堆 map 和 lambda ……
这就不麻烦 js 了吧~
打开 TryHaskell(http://www.tryhaskell.org),敲了几句代码,正确性没问题,不过 tryhaskell 的shell不能粘贴代码,整段密文好长……
只好老老实实的在vps的terminal里启一个hugs,幸好tryhaskell里头输入的代码还是可以拷贝下来的。

?View Code HASKELL
let s="……lmu ynnjw ml rfc spj. " 
in map (\w -> inter­sperse "" $ map (\c -> [chr $ 97 + mod (ord c - 97 + 2) 26]) w) $ words­ s

写得很快,读着有点恶心的一坨代码 : P

此处的 intersperse 在 Data.List 中定义(tryhaskell 很体贴,默认就导入了这个函数,而且在tryHaskell中使用ord和chr等函数也无需import Data.Char, 很方便吧?……不过话说tryhaskell里头貌似无法导入任何模块,所以提供的函数全一些也是为了大家玩得开心。),用途和 Python 中的字符串方法 join 近似,只不过 intersperse 定义在泛型的列表上,可用的范围更广罢了。另外intersperse返回值类型仍然一个列表,如果在处理字符串的时候希望达到和Python中join函数相同的效果,需要对结果 concat 一下 : )

Python中的

?View Code PYTHON
",".join(["hello", "world"])

在Haskell中可以写为

?View Code HASKELL
concat $ intersperse  ","  ["hello", "world"]

其实 concat 和 intersperse 的组合与 Data.List 中的 intercalate 函数是等价的。
写成这样就行了:

?View Code HASKELL
intercalate  ","  ["hello", "world"]

好吧,既然Haskell里头实现Python的join函数很容易,那么split函数呢?
……这个,貌似除了Hackage中的那个正则split,并没有特别简单的方法。
前些天山寨了一个,简单用用,性能没测,不知在特别大的字符串上效率如何。
正确性是没问题的 : P

?View Code HASKELL
> module MySplit (split) where
 
> split :: String -> String -> [String]
 
> split s tkn | l == 0 = [s]
>             | otherwise = _split s
 
>     where
>         l = length tkn
>         _split x | tkn == take l x =
>                         "": (_split $ drop l x)
 
>                  | null x =
>                         "":[]
 
>                  | otherwise =
>                         (head x : head sp) : tail sp
>                             where
>                                 sp = _split $ tail x

这个实现采取逐位匹配的方法搜寻作为分割符的串,好处是清晰易懂,坏处是会做许多无用功,如果使用BM算法的跳转匹配,效率会提升许多。

呃,貌似跑题了……

本帖主题是New Challenge来着……嗯

虽说学习新语言时,应该避免”用Pascal语法写出BASIC风格的程序”(《十年学会编程》http://daiyuwen.freeshell.org/gb/misc/21-days-cn.html),

但是,使用新语言尝试过去已经完成的任务,确实是一个学习语言的好方法。
著名的编程语言联系练习项目PLEAC(http://pleac.sourceforge.net/),就是如此。

PLEAC中使用接近30种不同的语言来重复完成Perl CookBook中的练习。其中既包括Python,Ruby,C++等热门语言,也包括Haskell,OCaml,Guile,R等小众语言,甚至还有汇编语言。

看来学习就是一个”重复”的过程,
不断挑战自己,用旧瓶酿出新酒来吧~!
: D