Archive for May, 2006

百度之星程序大赛

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

正式比赛是星期六、星期天,这两天在截止期限前随时都可以登录百度的网站答题。规则是,首次登录起,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百度之星程序设计大赛组委会

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

Comments (4)

关于哲学的思考

刚才还正在为“理论计算机科学”的作业抓狂,突然以外发现“网络学堂”上此项作业 deadline 向后宽限了一个星期。真是意外惊喜,喜出望外。经询问得知,是周二上午的课之前通知的。而我当时上课去晚了 1 分钟。所以借这个机会小结一下最近学到了什么,应该还是很有好处的。

最近,终于搞清了什么是“NP”问题。原来不是 non-polynomial (非多项式),而是 Non-deterministic Polynomial time 的简写。据说,学过一点计算机的人大都知道“NP”这个词(比如我就是大一的导论课时候知道的),表示一类很难解决的问题,但它的具体定义,能说清楚的就比较少了。根据 Wikipedia 上的解释,这类问题为什么甚难解决,至今仍为 open question,即迄今为止还没有人给出令人满意的解答。这些内容,属于 computational complexity theory 的范畴。这远比算法“形而上”得多。Vess 大牛开玩笑说,前几个星期的算法还比较是“科学”,现在学的完全就是“伪科学”了。我觉得,他想表达的意思是:如果说,对于算法的知识 engineers 来说还是关心的,那么复杂性理论则是纯粹是 scientists 做的事情了。而在后者的理论的最核心的地方,则是一种被称为 philosophy 的东西。

我以前有一段时间觉得,“哲学”是一种扯淡的东西。这是由多方面的因素造成的。当然,一直以来,“XXXXX哲学”给我留下了不可磨灭的坏印象,属首当其冲。其次,汉语的翻译无法把源自西方的某些思想作一准确的映射。比如,汉语里面的“哲学”一词和“物理学”有着天壤之别,难以暗示两者间的联系,事实上后者也可被解作“自然哲学”。再比如,“博士”是“Doctor of Philosophy”的译文,但没有把“philosophy”的意思体现出来。再如,“人生哲学”这个搭配,显然作“人生观”更佳,因为它和“哲学”这门学问本身没有太大的联系。总之,philosophy 这个词在汉语中的对应已经比较混乱了。为了准确起见,本文中的“哲学”应被认为是英文中“philosophy”或其其他词形的直译。第三,我看到的一些旨在向大众普及哲学的书,更多地是在谈哲学的历史,而不是对其本身的论述。也许通过一门学科的历史,可以更好地辅助学习这门学科。但是,正如你不能指望只是泛泛地了解数学史,就能学会代数和微积分一样,学好哲学的正确方法还是应该自己努力多去想,而不是了解别人曾怎么想。

通过上面对于复杂性理论的分析,哲学显然不是扯淡的东西。它里面包含了很多深刻的思想,而这些思想又贯穿于多种(乃至所有)学科之中。关于它到底是什么,我尚不能具有能力去谈论。不过,我可以从复杂性理论的角度谈谈我自己的认识。从词源上看,哲学是“爱”(philo)、“智慧”(sophy)的合成词。理科生倾向于把它理解为动宾结构,文科生倾向于把它理解为并列结构,呵呵。以下就是我的一些想法:

人的智慧,或思维,是个很奇怪的东西。它有个比较大的问题,就是跳跃性。跳跃性思维赋予了人们想象的能力,这是创造的源泉。但不幸的是,这种跳跃性的思维人人不同,如不将其规范,人们将难以进行思想上的交流。于是,这种思维的规范应运而生,它就是逻辑(btw, 这个词的翻译也很诡异,音译其实什么都没传达,以后有机会再说)。人们在逻辑的基础上不断发展,建立起数学的宏伟的大厦(关于数学起源说法的一种流派)。利用已经建立起的逻辑和数学体系,加上物理等学科取得的成果,人们成功地研制出了“电子计算机”这种神奇的仪器。它的模型其实早就由图灵建立起来了,称为“图灵机”,听上去像个玩具。现在的电子计算机与“图灵机”结构迥异,但计算能力却等价。当前的计算机技术的不断发展,只不过是使运行速度上不断提高,但是计算能力却一直没有突破最早的“图灵机”。或者说,仍然有些东西是无法计算的。或者说,仍然有些东西是无法在有限的时间内算出来的。为什么?是思维本身的局限还是我们思维所依赖的逻辑的局限?不能不说,在我们规范的思维得以取得巨大的成功的时候,恰恰是跳跃性思维赋予我们思考这一问题的能力。既然有些东西是无法计算的,那么它们还是不是确定性的?或者,这些无法计算的东西的确定与否对我们来说是否还存在区别?这些问题有些得到了解决,有些还没有得到解决。而对这些问题的探讨过程本身,既有意义,又有意思。

Comments

WordPress 中右侧 sidebar 下沉至页面底部的解决办法

用了 WordPress 有一段时间,也自己摸索解决了一些奇怪的问题。今天在 WordPress 的 Google Group 中发现有人同样遇到了我曾经同样遇到过的问题:IE 浏览 Wordpress blog 时,右侧 sidebar 下沉。(在 Firefox 浏览器中不存在这个问题。)

WordPress 右侧 sidebar 下沉到页面底部的症结在于:由 WordPress 程序自动生成链接的 HTML 代码中,sidebar 中 links 的分类名称处,多了一组冗余的标签 <h2> ,从 CSS 的角度讲,使得 sidebar 所在的盒子宽度增大。多出的这组标签在 Firefox 浏览器中没有造成严重的影响,只是浏览器底部多出了个水平滚动条,将其向右拖动则会看到空白区域。但是在 IE 中(因为 IE 对 CSS 的解释有些问题),页面右边排放不下,自然会“换行”下沉到页面底部。

现在解释一下我是怎么解决的。找到生成 links 的函数 get_links_list(),在文件 wp-includes/links.php 中。找到第548行:

echo '  <li id="linkcat-' . $cat['link_category'] . '"><h2>‘ . $cat[’cat_name’] . “</h2>nt<ul>n”;

将其改为:

echo '  <li id="linkcat-' . $cat['link_category'] . '">' . $cat['cat_name'] . "nt<ul>n";

保存后,即正常。

Comments (9)

学生信用卡

近年来,国内很多银行纷纷开始了“圈地运动”,为争取到更多更好的信用卡(贷记卡)客户而摩拳擦掌。现在,在校大学生(特别是名牌大学的大学生)也被认为是未来的潜在的优良客户。于是,精明的银行已经开始向他们推销信用卡了。据我所知,招商银行、中国建设银行、广东发展银行(?)就是这样“先下手为强”的银行中的三家。为了获得向国外付款的便利,我申请了前两家银行的信用卡,并获得批准。现在我将这两家银行的卡片的一些参数列在这里,供大家参考。总体说来,两家银行的信用卡各有千秋。

招商银行目前针对学生推出的信用卡称为“Young 卡”。本科生信用额度为 3000 元人民币(且在本科阶段不可增加)。此卡不按月邮寄账单,而是通过 E-mail 发送电子帐单。单笔消费超过 500 元有短信提醒。可以和招商银行一卡通关联自动还款、自动购汇。消费时不能凭借密码。此卡目前的年费政策是:免首年年费;刷卡 6 次免下一年年费。Young 卡分 Master / VISA 两种,每人至多只能获得一张。此外,招行还推出了一项意外失卡的风险防范服务,不过我没有详细考察。

中国建设银行并没有针对学生推出特别款式的贷记卡,只是将普通卡申请标准作了适当降低,使得就读于一部分名校的本科生可以顺利通过审核。本科生申请到的信用卡额度也是 3000 元,且信用记录良好日后可增加。此卡按月通过邮政函件寄送账单,无 Email 通知。消费超过 500 元有短信提醒。可以和建设银行的存折或龙卡借记卡自动关联还款、购汇。境内人民币消费可以选择消费凭借密码与否,或者设定超过一定阈值的消费才需要密码确认。此卡目前是刷卡 3 次免当年年费,从第二年起的政策尚不清楚。建行的龙卡(贷记卡)分为 Master / VISA 两种,可以只申请一张,也可以两张都申请。如果获得两张,则两张卡片共享同一信用额度。

另外,两家银行的信用卡(贷记卡)都提供电话银行和网上银行功能。招行的网上银行界面和功能均明显优于建行的。两家银行都设有 800 免费服务电话(招行800-820-5555;建行800-820-0588),态度都很好,问题解决也很及时。申请这两家银行的信用卡,手续很简单。如需咨询,只要拨打相应的电话转人工服务就可以了。

以上说了这么多,大家是不是跃跃欲试呢?使用信用卡之前一定要多了解一些信用卡的使用规则,以免造成不必要的麻烦(毕竟它和普通借记卡有很大的不同)。关于这个问题,我会继续跟进的,请保持关注。

Comments (5)

新东方托福班

在过去的 7 个星期中,我参加了新东方的托福周末强化班。每周末的 2 天,每天上午 8 点半到下午 2 点半(中间有休息)。结果这个班,连同平日 5 天的课程,把我的日程填得满满的。

从这个课中,我得到不少东西。首先,对托福的考试有了个宏观的了解,比如明确了托福考试各部分分别要考什么、怎么考。其次,获得了很多复习资料,这也要比我自己在网上 google 有效得多。当然,这都不是最重要的。新东方的老师很和蔼(包括班主任),批评人的时候都很讲究“策略”。管理严格而富于人性化。在新东方,每天的课都会检查听课证,并在其上作记号。学生与座位一一对应,一切显得井井有条。有一次我忘带了听课证,在确认了我带着课堂讲义等资料的事实的情况下,负责看门的老师也让我进去听课了,我很感激。

在上新东方的课之前,我听说,在新东方能学到的充其量是一些应试的技巧,而不是能力。而上过新东方的课之后,我感到这种提法并不准确。首先,每一位准备参加托福考试的学生,其实英语都受过了中学 6 年甚至更多的英语教育,不可谓没有实力,缺少的往往是在考场上把自己真实水平发挥出来的能力。而在新东方,恰恰可以获得这种能力。第二,通过研究并掌握以往命题的规律,有的放矢地提高自己的弱项(如学术单词),也会提高自己不同分项目的英语能力。

重要的是,找到了一种感觉。我所在的教室共有 400 多人。老师在前面拿个无线麦克开讲,教室内均匀分布的 7 个大电视同步直播,坐在哪里都可以清晰地看见电子黑板上的内容。这样规模的大课在清华也很寻常,但感觉不一样。防止学生出现大面积打瞌睡的现象,新东方老师会时不时地讲笑话(新东方老师的幽默是有“传统”的),“寓教于乐”,雅俗共赏。新东方老师上课充满了激情,这也和学校一般大课的填鸭式教学形成鲜明对比。每个老师都有不同的方法(比如戴云的语法体系),但是思维快速、缜密,见多识广、经历丰富,善于表达,是他们的共同特征。

在课程进行到一半左右的时候,新东方不失时机地发给每一位学生一本《新东方精神》。有点像某些机构出的《我眼中的XXXX》这类广告性质的自我贴金式宣传册子。不过看过几篇文章之后,会感到眼前一亮,心中为之一振。比如我读到一句话,觉得写的不错:

假如我们民族的教育培养出来的全是陈景润式的失去独立性格和精神自由的三好学生的话,我们民族也许可以解开歌德巴赫猜想,但却永远出不了歌德和巴赫这类照亮了人类文明的伟人——甚至就连歌德巴赫这样原创性的数学家也诞生不了啊!(p.50)

而这样的“妙语”,在书中比比皆是。

建议每一位在校大学生,不管是不是打算出国,条件允许的情况下,都去上一期新东方课程。会有收获的。

Comments (3)