一行代码可以做什么

在编程的世界里,一行精妙的语句可能胜过 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 <= 0 else ' ') for x in range(-30, 30)]) for y in range(30, -30, -1)]))

一行代码可以做什么_第1张图片
能飞速创建一个服务器

python -m http.server

能解决一道算法题
比如 力扣 231. 2 的幂,input 是一个整形,要求判断这个数字是否是 2 的幂,并返回布尔值。

def isPowerOfTwo(self, n: int) -> bool:
    return n > 0 and n & n - 1 == 0
def isPowerOfTwo(self, n):
	return n > 0 and 2**int(math.log2(n)) == n

n 小于等于 0 时一定为否,n 大于 0 的前提下,第二种解法就是简单的通过数学运算比较,第一种解法则是基于二进制理论:如果一个数是 2 的幂,它的二进数最高位是 1,其它都为 0;对它减 1 后最高位为 0,其余都是 1,做与运算会得到 0。
再比如 力扣 151. 反转字符串里的单词,也可以用一行代码解答。

def reverseWords(self, s: str) -> str:
    return " ".join(s.split()[::-1])

首先用 split 方法将字符串转化成 list 并去除头尾的空格,[::-1] 可以用 list[: :] 理解,即从头到尾以每步 -1 的方式获取元素,也就是反转了 list,最后合并。当然,上面举的这些例子不过是现代程序员们的小把戏,早在上个世纪 60 年代,one-liner program 的概念在就已经在计算机领域的上古巨佬之间流传。在维基百科上,你可以搜索到相关词条。


那些古老到比你年纪还大,甚至你可能根本没听说过的语言,像 AWK 语言,J 语言的世界里,都出现过令人惊讶的单行程序,例如下面这个用 J 语言实现的快速排序:

quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#)

你可能需要求助你的爷爷,才知道怎么运行它。

到了上世纪 70 年代,随着家用电脑和 BASIC 的兴起,单行程序也变得更受追捧,当时的电脑杂志经常记录一些让人印象深刻的简短的或者单行的程序。

发黄的纸张上,杂志编辑以「魔法」来定义这些程序。
C 语言诞生后,随着一个诡异编程大赛:国家 C 语言混乱大赛(IOCCC)的兴起,更多的奇妙的单行程序诞生了。比如下面这个包含 1255 个字符的国际象棋程序(你可以把它当成单行程序):

作者:力扣(LeetCode)
链接:https://www.zhihu.com/question/285586045/answer/754139603
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;X(w,c,h,e,S,s){int t,o,L,E,d,O=e,N=-M*M,K
=78-h<=h&&v 0,0)>M;do{_ o=I[
p=O]){q=o&z^y _ q<7){A=q--&2?8:4;C=o-9&z?q["& .$  "]:42;do{r=I[p+=C[l]-64]_!w|p
==w){g=q|p+a-S?0:I+S _!r&(q|A<3||g)||(r+1&z^y)>9&&q|A>2){_ m=!(r-2&7))P G[1]=O,
K;J=n=o&z;E=I[p-a]&z;t=q|E-7?n:(n+=2,6^y);Z n<=t){L=r?l[r&7]*9-189-h-q:0 _ s)L
+=(1-q?l[p/x+5]-l[O/x+5]+l[p%x+6]*-~!q-l[O%x+6]+o/16*8:!!m*9)+(q?0:!(I[p-1]^n)+
!(I[p+1]^n)+l[n&7]*9-386+!!g*99+(A<2))+!(E^y^9)_ s>h||1z|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))P y^=8,u=J;J=q-1|A<7||m||!s|d|r|oM;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)P L _!h)i=n,B=O,b=p;}N=L;}
n+=J||(g=I+p,m=p2||(p=O,q|A>2|o>z&
!r&&++C*--A));}}}Z++O>98?O=20:e-O);P N+M*M&&N>-K+1924|d?N:0;}main(){Z++B<121)*G
++=B/x%x<2|B%x<2?7:B/x&4?0:*l++&31;Z B=19){Z B++<99)putchar(B%x?l[B[I]|16]:x)_
x-(B=F)){i=I[B+=(x-F)*x]&z;b=F;b+=(x-F)*x;Z x-(*G=F))i=*G^8^y;}else v u,5);v u,
1);}}

这段神奇的代码由 IOCCC 的 5 届冠军得主经由两届比赛改进得来。在 2014 年,代码作者甚至专门出了一本书解释这段代码,并添加了注释。

当然,大赛也产生了一些看起来不那么变态的单行程序,比如下面这个:

main(int c,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 的代码
一行代码可以做什么_第2张图片
以及下面这个模拟飞机飞行的代码:
一行代码可以做什么_第3张图片

对于技术实力过硬又充满想象力的程序员来说,一行代码可以做任何事。

作者:力扣(LeetCode)
链接:https://www.zhihu.com/question/285586045/answer/754139603
来源:知乎

你可能感兴趣的:(闲言碎语)