百度之星程序大赛

说来也巧。去年第一届的百度之星程序比赛,我注册了个账号,比赛的时候看了看题,没做就离开了——当时对自己的水平也没什么自信。后来也就不了了之。前几天,突然收到百度发来的邮件,告诉我今年又有比赛了,是第二届。我挺高兴,也挺感激,毕竟人家系统一年过去了还在惦记着我,于是就注册了,同时收到了注册成功的确认信。然而,就在注册成功的当晚,我再一次收到百度发来邀请我参加比赛的邮件,内容和先前的一模一样。我有种不祥的预感。

正式比赛是星期六、星期天,这两天在截止期限前随时都可以登录百度的网站答题。规则是,首次登录起,8个小时的时间内答题有效。上午10点左右,刚一登入,计时器就开始跳动,却给人一点喘息的机会都没有——而我原本设想的是,登录后,先显示比赛规则,按下一个按钮之后,才开始抽题、计时——心中有些不爽。不管它了,反正8个小时,也不在乎那1~2分钟。看题。

一共6题:4道20分,2到10分,穿插在一起。浏览了一下,发现20分的第一题不难,只是个字符串替换的问题。有几个隐含的“陷阱”也被我发现了。努力做了20分钟,得到了我认为正确的结果。把程序传上去,居然编译错误。再仔细一看,这个错误不是我的原因,而是百度服务器的问题。错误信息如下:

In file included from /usr/include/c++/3.2/i386-redhat-linux/bits/c++io.h:35,
                 from /usr/include/c++/3.2/bits/fpos.h:44,
                 from /usr/include/c++/3.2/iosfwd:46,
                 from /usr/include/c++/3.2/ios:44,
                 from /usr/include/c++/3.2/ostream:45,
                 from /usr/include/c++/3.2/iostream:45,
                 from ../user/2/2489_LEFsFaoZra1TgQJG/code1.c++:1:
/usr/include/c++/3.2/cstdio:112: `fputc' not declared
/usr/include/c++/3.2/cstdio:113: `fputs' not declared
/usr/include/c++/3.2/cstdio:114: `fread' not declared
/usr/include/c++/3.2/cstdio:115: `freopen' not declared
/usr/include/c++/3.2/cstdio:120: `fwrite' not declared
/usr/include/c++/3.2/cstdio:121: `getc' not declared
/usr/include/c++/3.2/cstdio:126: `putc' not declared
/usr/include/c++/3.2/cstdio:129: `remove' not declared
/usr/include/c++/3.2/cstdio:130: `rename' not declared
/usr/include/c++/3.2/cstdio:139: `ungetc' not declared
In file included from /usr/include/c++/3.2/cstdlib:52,
                 from /usr/include/c++/3.2/bits/stl_algobase.h:67,
                 from /usr/include/c++/3.2/memory:54,
                 from /usr/include/c++/3.2/string:48,
                 from /usr/include/c++/3.2/bits/localefwd.h:49,
                 from /usr/include/c++/3.2/ios:48,
                 from /usr/include/c++/3.2/ostream:45,
                 from /usr/include/c++/3.2/iostream:45,
                 from ../user/2/2489_LEFsFaoZra1TgQJG/code1.c++:1:
/usr/include/stdlib.h:642: parse error before `throw'
In file included from /usr/include/c++/3.2/bits/stl_algobase.h:67,
                 from /usr/include/c++/3.2/memory:54,
                 from /usr/include/c++/3.2/string:48,
                 from /usr/include/c++/3.2/bits/localefwd.h:49,
                 from /usr/include/c++/3.2/ios:48,
                 from /usr/include/c++/3.2/ostream:45,
                 from /usr/include/c++/3.2/iostream:45,
                 from ../user/2/2489_LEFsFaoZra1TgQJG/code1.c++:1:
/usr/include/c++/3.2/cstdlib:100: `getenv' not declared
/usr/include/c++/3.2/cstdlib:114: `system' not declared

我很诧异。返回来,查详细比赛规则,发现如下说法:

为了保证系统和所有参赛选手代码安全,本次比赛禁止了某些函数的调用,包括以下几类:

  • 文件写入(fwrite, fputc, fputs…)
  • 目录操作
  • 帐号口令
  • 网络有关
  • 环境有关
  • 执行系统命令
  • 汇编代码

如果你的代码在在编译中报告函数没有声明的错误,请检查是否在以上列出的范围之内,并修改相应的代码。

我的程序中使用了 STL,这是 C++ 中的重要特性之一。尽管比赛中允许使用 C++,而且规定可以用 STL(参见百度工作人员的回答),但上面的规则等于变相不让调用 STL。因为 STL 的很多标准容器都依赖这些函数实现。有人甚至试过只写一个“#include <string>”,主函数中直接return 0的程序,都会出错。

这些不让使用函数的规则,百度方面是通过将上述函数的声明从标准库文件中删除实现的。然而,百度他们不知道,C/C++ 的库文件是多少年来多少人的智慧的结晶,岂能如此轻易地拿掉,而不至于牵一发而动全身?当然,适当地禁止这类可能造成比赛结果不公平的函数还是必要的。但绝不是通过如此简单的方法,比如,可以把 STL 剪裁一下。

百度虽然去年搞过一次比赛,但不是用的 Online Judge 形式。这是第一次采用这种先进的形式判卷,也算是一种尝试,值得鼓励。不过,通过我的遭遇,也证明了一点:百度的工程师在赛前根本没有测试 C++ 的程序——否则,连 cout 都出错,还如何让使用 C++ 的选手输出结果??

反正,经过这么一折腾,一个多小时过去了。我是没有心思继续答题了。把编译错误日志往百度比赛专用的邮箱中扔了一份,下线吃饭去了。晚上,收到了百度工程师的回复:

现在C++可以了通过了,多谢你的建议

—————————————————————————

AStar2006百度之星程序设计大赛组委会

不过,我提交的先前编译通不过的参赛程序,估计早就被他们给弄丢了。

4 Comments »

  1. Zihona Said,

    June 1, 2006 @ 12:30 am

    祝林爽小朋友节日爽快!
    今天紫荆发糖吃哦!

  2. Zihona Said,

    June 6, 2006 @ 12:50 pm

    最近太辛苦了吧,林爽同学请注意身体。
    好好吃饭,好好睡觉。

  3. Zihona Said,

    June 7, 2006 @ 1:55 pm

    祝林爽实现理想,考入清华大学!
    别紧张!

  4. Zihona Said,

    June 12, 2006 @ 11:19 am

    请照顾好自己
    早日康复
    为祖国人民做出更大贡献

RSS feed for comments on this post · TrackBack URI

Leave a Comment