绝技!开发人员的花边程式设计插图

社会公众号申明”1″,拉你进开发人员沟通交流群

300本程式设计经典之作书刊浏览

83份A轮、魔鬼轮股权融资建议书等你浏览

1000G程式设计课堂教学音频完全免费浏览,范建会经典之作

开发人员必不可少!!整套QQ小软件开发讲义

100套QQ小流程源代码浏览

【编者按】:说到 C/C++ 标识符基本功,或许会有TX说define true false,这是归属于 C/C++ 开发人员离任前嘲讽等等的抖乖巧。即使想,也无法干。雷西县有这种句程式设计名句:「在撰写标识符的这时候,你要时常想著,那个终保护你标识符的人可能将将是两个有暴力行为偏激的傻子,因此他还晓得你住在这儿。」

责任编辑重新整理了三位chan网民对《你见过什么样令你叹为观止的C/C++标识符基本功?》的申明撷取。

二、Shiky Chang 提问,1225 顶

在我看来「叹为观止」不然,IOCCC 上就行了拿一则得奖标识符出不足以让人鼻子破冰了。

两个较为经典之作的范例是 1988 年得奖的标识符,那个流程间接估计字符串占地面积求近似值,时效性称得上较为亲善的:

•westley.c•

define _ F–>00||-F-OO–;  int F=00,OO=00;main(){F_OO();printf(“%1.3f\n”,4.*-F/OO/OO);}F_OO()  {              _-_-_-_         _-_-_-_-_-_-_-_-_      _-_-_-_-_-_-_-_-_-_-_-_    _-_-_-_-_-_-_-_-_-_-_-_-_-_   _-_-_-_-_-_-_-_-_-_-_-_-_-_-_   _-_-_-_-_-_-_-_-_-_-_-_-_-_-_  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_   _-_-_-_-_-_-_-_-_-_-_-_-_-_-_   _-_-_-_-_-_-_-_-_-_-_-_-_-_-_    _-_-_-_-_-_-_-_-_-_-_-_-_-_      _-_-_-_-_-_-_-_-_-_-_-_          _-_-_-_-_-_-_-_              _-_-_-_  }

注:这段流程实际上是 1989 年修正过的,由于 88 年原来流程标识符没有考虑到 ANSI C 的编译标准,导致在处理例如

define_ -i  -_

的这时候,老旧的 K&R 框架和 ANSI C 结果不一样:K&R 是间接的

i

而 ANSI C 编译结果实际上等同于

(i)

因此之前的流程现在运行不然出的结果是 0.250,而不是 3.141。修正过的流程没有那个问题了。

又比如 13 年有个只有一行的流程,可以判断从 Franklin Pierce 往后的 31 位美国总统是民主党还是共和党,那个有点不知所云了:

•cable1.c•

main(int riguing,char**acters){puts(1[acters-~!(*(int*)1[acters]%4796%275%riguing)]);}

使用方法:

make cable1

./cable1 obama republican democrat

./cable1 bush republican democrat

总统名要小写,republican 和 democrat 顺序无法颠倒。

经 @chua zier 提醒,历史上的确有重名的美国总统,除了 Johnson 之外,还有 Theodore Roosevelt / Franklin D. Roosevelt,流程原作者注明用

./cable1 roosevelt republican democrat

表示 Theodore Roosevelt,而用

./cable1 fdr republican democrat

表示 Franklin D. Roosevelt。

这一行标识符做了这么多事:首先查询输入的总统的名字,然后在两个 look-up table 里面找出对应的政治阵营,再输出出。问题在于这 31 位总统名字存放在这儿?而那个 look-up table 又存放在这儿?

有趣的是,IOCCC 的评委还提到,你甚至可以用那个流程检测一些 IT 大佬的 Mac / PC 阵营:

./cable1 Cooper Mac PC

./cable1 Noll Mac PC

./cable1 Broukhis Mac PC

./cable1 Jobs Mac PC

./cable1 Gates Mac PC

./cable1 Ballmer Mac PC

难道那个流程暴露了 Ballmer 离开微软的真相?

近几届比赛的标识符为了增加混乱程度,标识符越来越长,时效性也越来越差(不过话说回来,让时效性变得越来越差其实原本是那个比赛的宗旨吧),不少标识符甚至本身是个 ASCII artwork……比如 11 年有一只阿卡林:

•akari.c•

绝技!开发人员的花边程式设计插图1

为了保持美观我间接上图了。源标识符见此:http://www.ioccc.org/2011/akari/akari.c

–––––––––– !!! 前方阿卡林军团高能预警 !!!––––––––––

那个阿卡林流程实际上是两个图像 down-sampler,可以接受符合条件的 PGM / PPM 灰度图像或者 LF 换行(不支持 CR-LF)的 ASCII art 为输入,然后转换输出两个处理后的图像 / ASCII art。不过那个阿卡林逆天的地方在于,它可以用自身的源标识符文本作为输入,输出生成另两个可以编译运行的流程的标识符!而且把那个生成的流程文本继续作为输入做进一步 down-sample,又可以生成一段可以编译的标识符,如此反复,可以套多达4层

详细的食用方法如下:

make akari

./akari akari.c akari2.c

然后生成的阿卡林·2号是那个样子的:

•akari2.c•

绝技!开发人员的花边程式设计插图2

看不清?请摘下眼镜或者退远了看。

注意,阿卡林·2号也是可以编译运行的,她的功能是把输入的 ACSII 文本的每个字符串中间插入空格以及每行之间插入空行,生成一段疏松了的文本。我们用阿卡林·2号自己做实验品

make akari2.c

./akari2  akari2fat.txt

成功了!生成了一只阿卡林·2号·舒松

•akari2fat.txt•

绝技!开发人员的花边程式设计插图3

阿卡林·2号还能干别的,她支持两个 rot13 参数:

./akari2 rot13 akari2fat.txt

生成的是经过 ROT13 仿射变换的文本,我们称之为阿卡林·2号·舒松·加蜜吧!

但是还没完……如果我们把原版阿卡林放进去再来一层呢?

./akari<akari.c|./akari>akari3.c

于是阿卡林·3号诞生:

•akari3.c•

wm_aoi(n)    /*ity,,[2*/{}char*y=   (“)M{lpduKtjsa(v””YY”   “*yuruyuri”) ;main(/*  /”,U/  R)U*  Y0U= =”/\  */){puts    (y+ 17/*   “NR{I=”       ){/=*     =*         */);/*     **/{      ;;}}

可怜的阿卡林·3号,由于马赛克(down-sample)次数太多,摘了眼镜也只能模糊看到一点点……我们来问问阿卡林·3号对于诞生的感受吧:

make akari3./akari3

于是她提问:

yuruyuri

居然会说ゆるゆり!

后,我们尝试生产一下阿卡林·4号

./akari<akari.c|./akari|./akari>akari4.c

•akari4.c•

main(){puts(“Y”“U RU YU “\“RI”)/*   */;}

顺利生产!虽然内容已经直截了当了,不过我们还是采访一下她吧:

make akari4./akari4

她的答复是:

YU RU YU RI

至此,阿卡林军团全部诞生!

绝技!开发人员的花边程式设计插图4

不得不佩服作者构建标识符的精妙程度。他的个人主页在这里:uguu…(这位作者其实已经是这比赛的常客了,先后一共拿过 6 次不同的奖项。)

经 @马琦明 提醒,我又把上面这位作者的另两个作品搬出了,13 年的 Most Catty——炮姐流程。这流程的标识符长那个样子:

•misaka.c•

绝技!开发人员的花边程式设计插图5

源标识符:http://www.ioccc.org/2013/misaka/misaka.c

对的,当你看到原来是那个御坂的这时候,你晓得,我们要开始造(kè)人(lóng)了……

make misaka

那个御坂的作用是把输入的 ASCII横向连接起来。首先连接两个自己试试:

./misaka misaka.c misaka.c>misaka2.c

把两个御坂输入两个御坂,会生成什么?两个御坂。

•misaka2.c•

绝技!开发人员的花边程式设计插图6

听起来很不可思议但是在这位作者的构建下完全不出意外地,上面那个御坂-2居然也是可以编译运行的:

make misaka2.c

御坂-2 的功能是把输入的 ASCII纵向连接起来。那我们试着纵向连接两个御坂:

./misaka2 misaka.c misaka.c>misaka3.c

于是御坂-3诞生了:

•misaka3.c•

绝技!开发人员的花边程式设计插图7

我们来运行一下那个御坂-3。你此时脑中的景象可能将是这种的:

绝技!开发人员的花边程式设计插图8

但是你错了,御坂-3 会给你造出更加精神污染的那只 long cat:

make misaka3./misaka3

绝技!开发人员的花边程式设计插图9

没错是这只喵:

绝技!开发人员的花边程式设计插图10

这里其实有 Unix 的 cat 指令的梗……如果之前你在执行御坂-2 的这时候,用了更多的御坂作为输入,例如 4 个:

./misaka2 misaka.c misaka.c misaka.c misaka.c > misaka4.c

make misaka4.c

./misaka4

那么御坂-4会给你造一只更长的 looooong cat:

绝技!开发人员的花边程式设计插图11

按作者的意思,你可以多叠加 31 个御坂来生成一只 looo….ooong cat(具体上限由编译器的 sizeof(int) 决定)。

13 年还有浙大教授侯启明写的 ray tracer 流程,虽然标识符本身存在争议是否符合比赛规则,例如为避免长度超限制而使用了一些压缩方法、流程是个死循环。如果这段流程时效性不是这么恶心不然其实还是非常值得钻研的,里面用到了很多有趣的数据结构和着色体系。

食用方法也很简单,把流程挂在那儿跑一晚上,强制退出,可以看结果了。由于是无穷尽的递归,流程跑的时间越长,图像越精致。

这里有个示例图:

绝技!开发人员的花边程式设计插图12

侯老师还有另外三个作品上榜,两个是极其酷炫的 syntax highlightener,还有两个(源标识符本身是 GUI 的)科学计算器,后面那个已经有人 @paintsnow 提问过了。新两个是上个月刚刚公布的新一届得奖作品 MD5 without integers,但是那个的源代码还没有公布,估计要等到明年了。

找不到地方查找QQ群?找不到地方发布你的专属QQ群?

这里有你想要的:

QQ群查找:

http://qrcode.jonlan.com/QRCodeList

QQ群撷取:

http://qrcode.jonlan.com/UploadQRCode

社会公众号申明”1″,拉你进开发人员沟通交流群

300本程式设计经典之作书刊浏览

83份A轮、魔鬼轮股权融资建议书等你浏览

1000G程式设计课堂教学音频完全免费浏览,范建会经典之作

开发人员必不可少!!整套QQ小软件开发讲义

100套QQ小流程源代码浏览

绝技!开发人员的花边程式设计插图13

猜猜你喜欢

绝技!开发人员的花边程式设计插图14

火爆整个中国!!小学生作文《我爸爸是个开发人员》

绝技!开发人员的花边程式设计插图15

刚刚…大洗牌!百万快递员或将全面失业?

绝技!开发人员的花边程式设计插图16

鹿晗如何猜对女友关晓彤的手机密码

绝技!开发人员的花边程式设计插图17

这一份新的互联网行业薪资报告,你敢看吗?

绝技!开发人员的花边程式设计插图18

开发人员打假!左右脑测试是个骗局

绝技!开发人员的花边程式设计插图19

广州月薪1W的开发人员如何活得像月薪5W

作者 nasiapp

在线客服
官方客服
我们将24小时内回复。
12:01
您好,有任何疑问请与我们联系!

选择聊天工具: