标签档案:国际象棋

编程++:建立在以前的基础上

在学习编程时,最早的困难往往是生成有效代码的机制。这可能会让新手非常沮丧,因为编程语言翻译人员(编译器)在他们准备接受的东西上是坚定不移的,并将拒绝一切不符合他们要求的东西。但是,一旦掌握了这些语法基础知识,就可以创建以前从未有人编写过的令人兴奋的新程序。

程序员创建新程序的方法之一是注意别人过去写的东西。通过建立在别人已经写好的基础上,他们通常可以节省很多时间,从而将他们的创造性精力集中在他们自己特定程序中新颖的部分。作为一名教师,我很早就鼓励这种方法,例如,当我建议我的学生利用图书馆课程来存储数据集合时。虽然理解这些库类的工作方式当然很重要,但这并不意味着每次需要使用集合时都必须从头编写代码。关键是利用现有的东西,要么围绕它编写代码,要么调整它以适应您的需要。

最近,当我被要求向一个程序添加一些新功能时,我就应用了这个原则。过去20年里,我一直在断断续续地维护这个程序。这是一个用C语言编写的开源项目pgn-extract.它允许国际象棋玩家根据各种不同的标准搜索国际象棋游戏文件,如特定的玩家、开头、结尾等。该程序的一个用户(JS)问我是否有可能让它在游戏中寻找特定的棋盘位置。例如,寻找专家玩家在特定配置下如何玩出棘手的终局游戏的例子可能会很有趣。复杂的部分是JS不希望用户必须指定棋盘上每个棋子的确切位置。相反,他们只会对几件作品感兴趣,而其他的都不重要。

据我所知,还没有这样的东西存在,但这个任务让我想起了熟悉的计算机科学主题模式匹配.在这里,您需要寻找与模糊模式匹配的东西,而不是精确的东西,通常使用正则表达式符号。例如,使用模式"(cC)在*”匹配以“猫”或“猫”开头的单词,如“牛”和“捕手”。这种表示法在Unix命令的计算中很有名grep.虽然这种表示法通常用于匹配普通文本,但我认为它可能适用于匹配国际象棋棋盘——特别是如果棋盘可以用类似文本的形式表示的话。

我的出发点是一个很好的描述由Rob Pike编写的grep的实现(Brian Kernighan记录)。从文本上表示棋盘其实相当简单,国际象棋玩家经常这么做。例如P6r意思是:“白卒,六个空方格,然后一个黑车”。我修改了熟悉的grep符号,以更好地适应国际象棋上下文,以便能够区分黑白棋子,然后将其添加到我的程序中——当然,这承认了对Rob Pike的依赖!

令人高兴的是,最初的请求者JS对结果很满意,但随后他继续演示了我从未想到的新功能的一个很好的偶然使用。他给我发了一张前世界冠军米哈伊尔·塔尔(Mikhail Tal)盯着一个看不见的对手的照片。这张照片大家都知道了,但是Tal凶狠的眼神下的对手是谁呢?JS编码了在图片中可见的板的部分使用新的符号(*/*/*/*/???? b ? ? q / * / ? ? N ? ? P / R ? ?Q1BR1),让程序运行了米哈伊尔·塔尔玩过的所有游戏!结果就是1960年在莱比锡对阵尼古拉·帕德夫斯基的比赛。

编程不仅仅是关于编写正确代码的机制,它是关于采用和适应现有的想法来创建一些新的东西,有时是一些有趣的东西!

依靠技术

上周末我做了一件不寻常的事,参加了国际棋联候选人国际象棋锦标赛在伦敦,八名参赛者正在相互竞争,争夺与现任世界象棋冠军争夺冠军头衔的权利。尽管大约15年前我在写我的第一本编程教科书时放弃了严肃的竞争性国际象棋,但从我的青少年时代起,国际象棋就已经成为我生活的一部分,比计算机的时间长了几年。我的朋友兼同事胡里奥邀请我一起去的,虽然我对当代国际象棋场景相当不了解,但当我们晚上回家的路上在街上经过他时,他很容易就能指出坐在星巴克角落里的两位大师,或者是锦标赛最受欢迎的“第二个”。

虽然看别人下国际象棋被认为就像看着油漆变干一样有趣,但我必须承认,尽管我在一个几乎没有交谈的黑暗房间里度过了六个小时的大部分时间,但我发现这一天非常愉快!但从计算机科学家的角度来看,这一天也是发人深省的,因为我再次意识到,在我们生活的几乎每个领域,我们是多么依赖基于计算机的技术。

在我年轻、自信地下国际象棋的那些年里,我曾对拥有一台能下国际象棋的电脑感到好笑,并认为买一台是浪费钱。当时的技术非常简陋,功能也非常有限,普通的俱乐部玩家很容易就能从开局就获得更好的位置,然后通过超越程序有限视野的适时进攻,或者更好的战略打法赢得胜利。然而,正如每个人现在都知道的那样,自从“深蓝”击败加里·卡斯帕罗夫后,局势发生了逆转,如果可以的话,会笑的是那些程序!任何一个真心想成为优秀棋手的人,如果不在学习中使用计算机分析和竞赛来提高自己,那他就是傻瓜。

但这其中存在一个问题。这与在玩“谁想成为百万富翁?”,国际象棋界现在正在努力应对这样一个事实,即棋手们可能不会把电脑支持留在训练室,而是在比赛中带着它,在比赛中依靠它.我们担心观众中有人可能会接触到计算机分析,并能够将其传达给球员,我们在候选赛场的观众不允许携带任何电子设备进入比赛大厅,必须通过机场安检门,并被手持魔杖进行全身搜查。这相当于国际象棋世界的兴奋剂管制;有趣的是,不是参与者,而是观众!

对科技的依赖已经让人上瘾;这些电脑太强大了,不受限制地使用它们被认为是有害的。

幸运的是,在游戏厅里有被认为是无害的技术。为了帮助观众跟上比赛进度,每块棋盘上都有一个大屏幕,上面显示着当前的比赛状态,并显示出每位选手还剩多少时间。游戏板和棋子包含电子传感器,以保持最新的显示。此外,比赛赞助商之一三星公司提供的Galaxy平板电脑显示了同样的董事会信息,并提供了视频解说。

假设你不是在油漆干燥阵营-从一开始就很明显,事情将变得相当令人兴奋,因为四名玩家对他们的对手有巨大的时间优势,他们可能很难在两个小时内完成所需的40步。

最绝望的情况是瓦西里·伊凡丘克,他只有20秒的时间来完成15步!但就在这时,技术故障出现了,主板停止更新,我的Galaxy平板电脑也死机了。尽管反复重启,它还是没有给我视频反馈,我只能看到Ivanchuk驼背遮住了板子。

现在我是一个依赖技术的人,当它失败时,我彻底完蛋了。我还不如坐在黑暗中呢。

当然,这种技术让你失望的情况再熟悉不过了——你的手机电池没电了,你感觉完全被孤立了。然而,这两种情况都不是完全的灾难。失败在这里真的只是一种不便。

但是,当依赖科技对生命至关重要时——比如在医疗状况或飞行中——会发生什么呢?随着技术控制进入我们生活中越来越多的领域(汽车、电子钱包等),单纯的不便变得更加严重的可能性急剧增加。

当我坐在技术的黑暗中,看着伊凡丘克拔着眉毛试图找到自己的出路时,我想起了我们这些教授计算机科学的人的责任,我们需要向我们的学生灌输一种强烈的责任感,对那些有一天可能会依赖于他们编写的程序质量的人。