在編程的世界裡,一行精妙的語句可能勝過 100 行贅述。
能刪庫跑路
這行指令就像是在你的所有文件上澆汽油然後一把火把他們全燒了。
sudo rm -rf /*
能讓電腦死機
:(){:|:&};:
能讓你上演黑客帝國
sudo apt-get install hollywood cmatrix
能追心儀對象
這行代碼能展示出一個心型:
print('\\n'.join([''.join([('Love'[(x-y)%len('Love')]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0else' ')forxinrange(-30,30)])foryinrange(30,-30,-1)]))
能飛速創建一個服務器
python -m http.server
能解決一道算法題
比如231.2的冪,input 是一個整形,要求判斷這個數字是否是 2 的冪,並返回布爾值。
defisPowerOfTwo(self,n:int)->bool:returnn>0andn&n-1==0
defisPowerOfTwo(self,n):returnn>0and2**int(math.log2(n))==n
n 小於等於 0 時一定為否,n 大於 0 的前提下,第二種解法就是簡單的通過數學運算比較,第一種解法則是基於二進制理論:如果一個數是 2 的冪,它的二進數最高位是 1,其它都為 0;對它減 1 後最高位為 0,其餘都是 1,做與運算會得到 0。
再比如 反轉字符串裡的單詞,也可以用一行代碼解答。
defreverseWords(self,s:str)->str:return" ".join(s.split()[::-1])
首先用 split 方法將字符串轉化成 list 並去除頭尾的空格,[::-1] 可以用 list[<start>:<stop>:<step>] 理解,即從頭到尾以每步 -1 的方式獲取元素,也就是反轉了 list,最後合併。/<step>/<stop>/<start>
當然,上面舉的這些例子不過是現代程序員們的小把戲,早在上個世紀 60 年代,one-liner program 的概念在就已經在計算機領域的上古巨佬之間流傳。在維基百科上,你可以搜索到相關詞條。
那些古老到比你年紀還大,甚至你可能根本沒聽說過的語言,像 AWK 語言,J 語言的世界裡,都出現過令人驚訝的單行程序,例如下面這個用 J 語言實現的快速排序:
quicksort=: (($:@(#[)) ({~ ?@#)) ^: (1
你可能需要求助你的爺爺,才知道怎麼運行它。
到了上世紀 70 年代,隨著家用電腦和 BASIC 的興起,單行程序也變得更受追捧,當時的電腦雜誌經常記錄一些讓人印象深刻的簡短的或者單行的程序。
發黃的紙張上,雜誌編輯以「魔法」來定義這些程序。
C 語言誕生後,隨著一個詭異編程大賽:國家 C 語言混亂大賽(IOCCC)的興起,更多的奇妙的單行程序誕生了。比如下面這個包含 1255 個字符的國際象棋程序(你可以把它當成單行程序):
B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;X(w,c,h,e,S,s){intt,o,L,E,d,O=e,N=-M*M,K=78-h<z|d){p[I]=n,O[I]=m?*g=*m,*m=0:g?*g=0:0;L-=X(s>h|d?0:p,L-N,h+1,G[1],J=q|A>1?0:p,s)_!(h||s-1|B-O|i-n|p-b|LM;O[I]=o;p[I]=r;m?*m=*g,*g=0:g?*g=9^y:0;}_L>N){*G=O_s>1){_h&&c-L<0)PL_!h)i=n,B=O,b=p;}N=L;}n+=J||(g=I+p,m=p
這段神奇的代碼由 IOCCC 的 5 屆冠軍得主經由兩屆比賽改進得來。在 2014 年,代碼作者甚至專門出了一本書解釋這段代碼,並添加了註釋。
當然,大賽也產生了一些看起來不那麼變態的單行程序,比如下面這個:
main(intc,char**v){return!m(v[1],v[2]);}m(char*s,char*t){return*t-42?*s?63==*t|*s==*t&&m(s+1,t+1):!*t:m(s,t+1)||*s&&m(s+1,t);}
你能看出來它在幹嘛嗎?
歷史的車輪滾滾向前,代碼的形狀也產生了不可思議的變化,比如下面這個算 Pi 的代碼:
以及下面這個模擬飛機飛行的代碼:
對於技術實力過硬又充滿想象力的程序員來說,一行代碼可以做任何事。
“全球最大的C/C++人員聚集地就在我這裡,企鵝裙餿直播編程學習,【14】就是我的。
不管你是什麼基礎,來了就是兄弟,是兄弟就跟我一起學習C/C++!關注我,為編程點贊,每天學點小知識!工作需要、感興趣、為了入行、轉行需要學習C/C++的夥伴可以跟我學習,技術大牛、學習資料等助你早日成為一名優秀的程序員!
閱讀更多 虎牙來了 的文章