IOCCC — 国际看不懂的C程序大赛

谁说我们编程序一定要遵循一定的编码规则?你是否使用过“匈牙利命名法”,“GNU coding style”,“Linux kernel coding style”。它们都说自己的方式好,别人的不好。但是看看 IOCCC 大赛的程序,你就知道最糟糕的编码规则也能写出很好的程序 :)

大赛网址

http://www.ioccc.org

IOCCC 的大赛忠旨

IOCCC 的比赛忠旨就是:

  1. 在遵守下面规则的前提下,写出最混乱,最让人看不明白的C程序。
  2. 用讽刺的手法显示编程风格的重要性。
  3. 用反常的代码加重编译器的负担。
  4. 演示C语言的不让人注意的地方。
  5. 为糟糕的C代码提供避难所。

大赛程序下载

这里可以下载历年 IOCCC 程序大赛的所有代码源程序:[下载].

推荐程序

那些程序很多。你可能不知道有些程序怎么用。仔细看看就会发现,每个程序都是那样的精巧!以至于他们的输出结果会让你大吃一惊!

  1. 2000年thadgavin.c

    这个程序的代码使用了 ascii-art,看起来像一个风车。你猜它运行起来是什么呢?答案是一个旋转的风车?漩涡?黑洞?

  2. 1996年eldby.c
    float s=1944,x[5],y[5],z[5],r[5],j,h,a,b,d,e;int i=33,c,l,f=1;int g(){return f=
    (f*6478+1)%65346;}m(){x[i]=g()-l;y[i]=(g()-l)/4;r[i]=g()>>4;}main(){char t[1948
    ]=" `MYmtw%FFlj%Jqig~%`jqig~Etsqnsj3stb",*p=t+3,*k="3tjlq9TX";l=s*20;while(i<s)
    p[i++]='\n'+5;for(i=0;i<5;i++)z[i]=(i?z[i-1]:0)+l/3+!m();while(1){for(c=33;c<s;
    c++){c+=!((c+1)%81);j=c/s-.5;h=c%81/40.0-1;p[c]=37;for(i=4;i+1;i--)if((b=(a=h*x
    [i]+j*y[i]+z[i])*a-(d=1+j*j+h*h)*(-r[i]*r[i]+x[i]*x[i]+y[i]*y[i]+z[i]*z[i]))>0)
    {for(e=b;e*e>b*1.01||e*e<b*.99;e-=.5*(e*e-b)/e);p[c]=k[(int)(8*e/d/r[i])];}}for
    (i=4;i+1;z[i]-=s/2,i--)z[i]=z[i]<0?l*2+!m():z[i];while(i<s)putchar(t[i++]-5);}}
    

    你能看懂吗?运行后就像远处在向你不断发射连珠炮一样的东西!

  3. 2000 年 bmeyer.c

    你想不到这段代码是2000世界上压缩灰度图像压缩比最大的程序吧? 它速度很慢,为了防止用户不耐烦, 它在压缩的时候可以在屏幕上显示图像的ascii版本作为进度条:

    编译方法:保存为 bmeyer.c

    cc -DY= -O6 bmeyer.c -o bmeyer -lm
    

    它只能处理 PGM raw 格式的图片.如果你的是 gif, jpeg 图片,先要把它转成 PGM 得到 pgm 图像的办法,用 ImageMagic 里的 convert 程序: 比如:

    convert -size 400x300 cat_01.jpg ok.pgm
    
    然后运行这个程序(名字叫 bmeyer) 压缩:
    ./bmeyer <ok.pgm >ok.glic              
    
    程序会在在屏幕画出 ASCII …… 爽啊! 得到压缩的 ok.glic 文件,这个文件用普通图像浏览程序不能直接预览

    解压缩:

    ./bmeyer <ok.glic >ok.pgm
    

    bmeyer -2 可以增加压缩比。


    返回