在编程的世界里,一行精妙的语句可能胜过 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[
当然,上面举的这些例子不过是现代程序员们的小把戏,早在上个世纪 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|L<-M))Py^=8,u=J;J=q-1|A<7||m||!s|d|r|o
这段神奇的代码由 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 的代码:
以及下面这个模拟飞机飞行的代码:
对于技术实力过硬又充满想象力的程序员来说,一行代码可以做任何事。
“我是一名从事了10年的老程序员,最近我花了一个月整理了一份最适合2020年学习的c/c++项目实战以及基础教程干货,送给每一位编程小伙伴,这里是小白聚集地,欢迎初学和进阶中的小伙伴。工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以跟我一起学习,技术大牛、学习资料助你早日成为一名优秀的程序员,想要学习更多知识可以关注我哦!
官方企鹅群:720168573