比比谁的代码短:TLE测试赛结束
icon2 Program Impossible | icon4 2009-02-10 4:03| icon323 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com

    上次提到,我非常关注一个即将举办的另类编程挑战赛Time Limit Exceeded,这个比赛的得分算法很另类,它将根据你代码的总长度和特定字符的多少而定。在刚刚结束的测试赛中,有几个题目非常具有挑战性,参赛者提交的代码也是牛气冲天。

 
Power of 2
问题:
    输入数据含有多行,每行一个正整数。对每个数,检查看它是否是2的幂,是则输出yes,不是则输出no。
    你的程序不允许使用分号。
    规定0也是2的幂。

得分:
    S= length of code + number of whitespaces;
    score = (250000)/(S^2);


样例输入:
2
3
4
5
0

样例输出:
yes
no
yes
no
yes

目前的最好结果为76分:
main(t){while(~scanf("%d",&t)&&puts(t&t-1?"no":"yes")){}}

 
Count 1 2 3
问题:
    写一个程序,该程序运行后打印出从1到50 000的整数。
    你不允许使用循环语句和跳转语句(for、while、goto)。
    你不允许使用#define 。

得分:
    S= length of code - number of whitespaces;
    score = 11 + (500*400)/(S^2);

目前的最好结果为124分,仔细体会这段代码,非常的牛:
n;main(){n<5e4&&main(printf("%d\n",++n));}

 
Segmentation Fault
问题:
    写一个程序,该程序运行后打印出从1到5 000 000的整数。
    你不允许使用循环语句和跳转语句(for、while、goto)。
    你不允许使用#define 。

得分:
    S= length of code - numer of whitespaces;
    score = 51 + (500*1600)/(S^2);

这道题和上道题的区别就是:不加改进的递归会导致堆栈溢出。
目前的最好结果为234分,仔细观察这段代码,看他是怎样避免堆栈溢出的:
j;main(i){i>1e5||printf("%d\n",++j)+main(i+1);i<2&j<5e6&&main(1);}

23 条回复

  • 楼层: 沙发 | | 小精灵 说:

    很强大。牛人是多阿。。

  • 楼层: 板凳 | | digiter 说:

    第一个是树状数组的典型代码吧,还可以t&-t

  • 楼层: 地毯 | | LOLO 说:

    33333333333333333

  • 楼层: 地板 | | oldherl 说:

    我的就逊色多了,因为不知道可以这么声明变量……

  • 楼层: 地下室 | | oldherl 说:

    大牛顺便说一下APOS和CATH这两道题吧,我没看到solutions

  • 楼层: 地基 | | expl0its 说:

    比比谁的JJ短:JJ测试赛结束

  • 楼层: 地壳 | | deepblue 说:

    最后一段代码里的i>1e5是用来控制嵌套层次的吧,相当于控制了堆栈的大小。学习了,thanks!

  • 楼层: 地幔 | | Zx.MYS 说:

    最后一个巨牛!!!

  • 楼层: 地核 | | 汗 说:

    原来变量还可以这样定义??
    在mian函数前写变量名就行了?
    哪里有这方面的资料啊?另外,怎么确定变量的初值是多少?

  • 楼层: 10楼 | | Recover 说:

    貌似这样的代码事实上应该算垃圾代码的吧
    貌似这样的编程习惯并不是好习惯的说

  • 楼层: 11楼 | | flex 说:

    的确比较强的说~~
    ps:在main函数前定义变量就是全局变量啊,全局变量会自动初始化为0。

  • 楼层: 12楼 | | 凌晨海风 说:

    很多编译器认为默认类型是int吧!
    不过这玩意儿倒是可以用来测试自己写的编译器是否在极端条件下也能正常解析代码,哈哈。

  • 楼层: 12a楼 | | 滚动数组 说:

    http://blog.sina.com.cn/s/blog_5e912a2e0100bsu6.html
    希望大牛支持一下!

  • 楼层: 14楼 | | ted 说:

    K&R C的风格??

  • 楼层: 15楼 | | cuckoo 说:

    j;main(i){i>1e5||printf("%d\n",++j)+main(i+1);i<2&j<5e6&&main(1);}

    这个代码对吗?我在VC.net 2003下编译测试,debug版输出到4702,release版输出到51723.

  • 楼层: 16楼 | | cuckoo 说:

    关于最后一个题目,我给一个我的代码吧:
    i=1;main(i){printf("%d\n",i++);if(i<=5e2)*(&i-1)-=5;}
    共54个字符。

  • 楼层: 17楼 | | cuckoo 说:

    sorry, 5e2 => 5e6

  • 楼层: 18楼 | | cuckoo 说:

    再减少几个字符:
    main(i){printf("%d\n",i);if(i++<5e1)*(&i-1)-=5;}
    计49个字符。

  • 楼层: 19楼 | | Qin 说:

    matrixl老大过来看看这个魔方:http://www.netnoease.com/200809/tintin-gogogo.html

  • 楼层: 20楼 | | Skywalker 说:

    居然还会有这种比赛,我faint~

  • 楼层: 21楼 | | debug_fan 说:

    掌握得不够深入 确实做不到这种程度 :)

  • 楼层: 22楼 | | Satily 说:

    这些程序都不符合C99标准嘛~~~~-.=
    话说最后一个"number of whitespaces"打成"numer of whitespaces"了~~~

  • 楼层: 23楼 | | theforgot 说:

    Key to C那題
    將程式碼縮成一行,後面補//可以加入反轉的程式碼。(有加分)
    ex: abc//cba

您也随便说几句吧:

您可以在 Gravatar 设置您的头像。