偶爾在python.cn上看到一篇《誰說使用 python 你就寫不出混亂的**?》,位址在這裡。覺得非常有意思,記得使用perl的時候,因為其靈活的語法,可以有很優美的**書寫方式,也可以寫出非常混亂的**。而python,從一開始就致力於消除這種混亂,縮排的結構使得python**相對其他語言整齊了許多,剛開始用python的時候雖然也想過能不能寫出亂糟糟的**,但是一開始就敗在縮排上,也就慢慢忘記了。
分析這次看到,自然是興致盎然,稍微研究一下,發現它是把一些看似亂糟糟的字串重新編碼了,然後交給exec執行了。關鍵就在這一句:
exec(reduce(lambda x,i:x.replace(chr(i),"n "[34-i:]), range(35), long_long_str)
exec(reduce(lambdax,i:x.replace(chr(i),"n "[34-i:]), range(35),long_long_str)
用了python的幾個函式式程式設計的函式。lambda非常常用,reduce相對來說少用一些,但是需要使用的時候非常好用!
可能有人不是非常熟悉這個reduce函式,因為其他的語言裡未必有這個東西,其實reduce的含義是摺疊(我知道這麼說還是很抽象),舉乙個小例子,讓你計算0~100所有數字的和(ok,我知道你知道答案,但請程式設計實現),一般的話,就會這麼寫(這裡不考慮等差數列的公式):
python
sum = 0
for i in range(101):
sum += i
print sum
sum=0
foriinrange(101):
sum+=i
printsum
很簡單,但是使用reduce會更簡單:
python
print reduce(lambda x,y:x+y, range(101))
printreduce(lambdax,y:x+y,range(101))
沒有迴圈,沒有中間變數,一句搞定!
它的執行過程如下圖所示
reduce接受兩個或三個引數,第乙個為要執行的函式,第二個為乙個序列,第三個這裡先無視。
在我們這個例子的執行過程中,reduce從序列中取出兩個值(0和1),相加計算出乙個結果(1),然後再從序列中取出乙個值(2),和剛剛得到結果(1)相加再得到乙個結果(3),然後重複這個過程直到結束。
上面的混亂**中,reduce對字串不停的修正,把空白(空格和回車)刪除,把!替換為空格,」替換為回車空格。然後得到乙個格式完好的**。換句話說,通過這個運算方法,我們把原先的**中的空格和回車先用」或!替換以後,可以在**中隨意增加空格和換行了,的樣子就是這麼出來的。
生命遊戲
我把這個東西再公升級了一下,字元全都混淆(ascii值加1),基本就成亂碼了,然後再用這個方法調整空白。
**完成後是這個樣子的:
******************************************x=r'''
jnqpsu!sboepn"m>\
sboepn.d ipjdf((
0,2) )!gp
s!j !jo
!sb ohf
(59) ^!gp
s!j! jo!s
bohf ( 5 9)^"
l>\ 0!g ps! j!jo!
sbohf (59)^! gps!j! jo!sb
ohf(59 )^"jn qpsu! qzhbnf
"qzhbn f.jo ju()" t>qzhb
nf.ejt qmbz.t
fu`npe f((5 90,59
0),0,43)" p>usv f"efg!{(y,
z);"!n>0" !gps! j!jo!(y-2,
y,y+2);" !!gps !k!jo!(z
-2, z , z +2);"!!
!jg! j > > y ! b o e !z>>k
;"!!!!d poujo v f"!!!jg!(j= 0!ps !j?58!ps!
k=0!ps!k? 58);"!!!!dp oujovf" !!!jg!(mj ^k^);
"!! ! !n+>2"!sfuv s o ! n " jnqpsu!dpqz"xijmf!
p;" !t.gjmm((36 6,366,36 6))"!
gps !f!jo!qzhb nf.fwfo u.hfu
(); "!!jg!f.uz qf>>23 ;"!!!p
>gbmtf" !gps!y!jo!y s bohf(59 );"!!g
ps!z!jo!ysbo hf(59);"!!!n>{(y ,!z)"!!!jg!n>
>3;"!!!!l y^z^>my^ z^"!!!fmjg!
n>>4;"!!! !ly^z ^>2"!!!f
mtf;"!!!!ly^z ^>0"!!!
jg!ly^z^;"!!! !t.gjmm((0,0,3
66),(z*20,y*20,20, 20))"!!!!qzhbnf.esbx.sfd
u(t ,(0,0,0),( z*20,y*2 0,20,20),2)"!m
>d pqz.effqdpqz (l )" !q
zhb nf .ej t qmbz.vqebuf()"!q z h b nf
.ujn f .xbju(200)"'''; exec( ''.join(
map( lambda x:chr(ord(x)-1) if ord(
x) > 49 else x, reduce( lambda x, i : x.
replace( chr(i), "n "[34-i:35-i] ), range(35),
******************************************x))))
******************************************x=r'''
jnqpsu!sboepn"m>\
sboepn.d ipjdf((
0,2) )!gp
s!j !jo
!sb ohf
(59) ^!gp
s!j! jo!s
bohf ( 5 9)^"
l>\ 0!g ps! j!jo!
sbohf (59)^! gps!j! jo!sb
ohf(59 )^"jn qpsu! qzhbnf
"qzhbn f.jo ju()" t>qzhb
nf.ejt qmbz.t
fu`npe f((5 90,59
0),0,43)" p>usv f"efg!{(y,
z);"!n>0" !gps! j!jo!(y-2,
y,y+2);" !!gps !k!jo!(z
-2, z , z +2);"!!
!jg! j > > y ! b o e !z>>k
;"!!!!d poujo v f"!!!jg!(j= 0!ps !j?58!ps!
k=0!ps!k? 58);"!!!!dp oujovf" !!!jg!(mj ^k^);
"!! ! !n+>2"!sfuv s o ! n " jnqpsu!dpqz"xijmf!
p;" !t.gjmm((36 6,366,36 6))"!
gps !f!jo!qzhb nf.fwfo u.hfu
(); "!!jg!f.uz qf>>23 ;"!!!p
>gbmtf" !gps!y!jo!y s bohf(59 );"!!g
ps!z!jo!ysbo hf(59);"!!!n>{(y ,!z)"!!!jg!n>
>3;"!!!!l y^z^>my^ z^"!!!fmjg!
n>>4;"!!! !ly^z ^>2"!!!f
mtf;"!!!!ly^z ^>0"!!!
jg!ly^z^;"!!! !t.gjmm((0,0,3
66),(z*20,y*20,20, 20))"!!!!qzhbnf.esbx.sfd
u(t ,(0,0,0),( z*20,y*2 0,20,20),2)"!m
>d pqz.effqdpqz (l )" !q
zhb nf .ej t qmbz.vqebuf()"!q z h b nf
.ujn f .xbju(200)"''';exec(''.join(
map(lambdax:chr(ord(x)-1)iford(
x)>49el***,reduce(lambdax,i:x.
replace(chr(i),"n "[34-i:35-i]),range(35),
******************************************x))))
為了「清晰」起見,解碼的**就寫在了最後沒有混雜在裡面了,稍微有些明白的就能打出原始**來。
執行需要安裝pygame庫,執行效果如下(示意圖,非連續):
希望能有「玩心」的朋友繼續研究,讓python再混沌一些吧~~
混亂的「文學」
好奇怪的現象。現在興起很多網路寫手,他們的作品追隨者很多,可是批評的人也不少,有人說他們的作品有著青春的疼痛,卻帶著 的力量 也有人說他們的作品不過是心靈雞湯罷了。孰是孰非?我們再看看現代 當代作家,如魯迅 莫言 陳忠實等,他們的作品通過故事引人深思,這種深思與上類作家有不同之處,如果說上類作家的作...
今天的混亂
首先看到springmvc配置有乙個 org.springframework.web.context.contextloaderlistener public class contextloaderlistener extends contextloader implements servletco...
C TreeView控制項的混亂命名
treeview的成員 label edit before lebel edit after label edit treenode的成員 name text treenode的建構函式 new treenode string text treeview新增節點的方法 tv.nodes.add st...