分享到微博 分享到人人 分享到LinkedIn 分享到Email
2016编程之美挑战赛“封神榜”分享系列——孙详彦

本期嘉宾是来自复旦大学的孙详彦同学(大神是左一哟),他在14年参加了编程之美比赛,凭借优秀的个人能力加团队合作力获得了14年的总冠军。本期将独家分享他的Code Hunt平台使用方法论,以及如何用基本的方法巧妙地应对一些难题,同时他还将全面地展示他的决赛项目,最后还有对今年参赛同学的宝贵建议。

编程之路

我大概在小学的时候就开始参加一些计算机比赛,初中时参加地市的一些比赛,到了高中就开始参加全国性的比赛,后来保送到了复旦。在复旦大一大二时候参加一些比赛也拿了一些金牌,大三大四就主要是参加一些个人赛了。现在就是一个码农的生活,主要是在实验室做一些研究工作,每天码四五小时吧,其他时间看看paper资料什么的,朝九晚五的(excuse me?!),没事的时候可以去逛逛街、兜兜风、看电影、约约妹子什么的 keke:)

Code Hunt平台深度解析

1. Code Hunt平台解题思路

首先,Code Hunt平台它的左边是一个编程环境,右边是一个数据输出的界面,当你运行你的一段程序后,它会在右边显示你这个程序跑的正确的一些数据以及几个错误的数据,但是刚开始数据是不全的。

所以我拿到题后一般会先用简单的方法把我拿到的一些不对的数据做对,这样做的话在很多情况下已经完全正确了。当然有时候还不对的话,我会根据它后续提示给的一些不对的地方去修改我的算法。这样的话会比较容易做,而不是一下子就把它想得非常复杂。

第二就是发散自己的思维,在做的过程中可能会遇到很多反直觉但是特别简单的函数,比如说一些未运算的函数,或者说一个模的函数。在你没有想到这些东西的时候,你会觉得这些数据是非常反直觉的。所以我觉得在平时的时候培养一下对这些东西的敏感性是必要的,在比赛的时候也要多往这方面想一下。很多时候算法其实没有那么复杂,只是你可能没有想到关键的这一步。

2. 试错效率

第一个是要提高对这些东西的敏感度,包括对一些基本的数据函数、数列的敏感程度。

第二就是提高你的编码效率,可以尽量快的把自己脑海里的idea实现。

对于数据不敏感的同学,我给大家推荐一个网站oeis.org(真诚推荐,不收广告费 ^-^), 这个上面有各种各样的数据,如果你知道数列的前几项,你可以看到包含这几项的各种数列的通项公式或者论文啊等各种信息。这个在比赛的时候可能比较有帮助。

3. Java和c#

因为Code Hunt语言它是限制在Java和c#上的,可能有些同学不是特别熟悉,我特别推荐微软的c#语言,用起来还是比较方便的。之前没学过Java和c#也没关系,相信大家都已经学了被誉为最艰深的程序设计语言C++吧,这个都能搞定还有什么语言搞不定的呢?

语言方面的话,Code Hunt平台其实不会用到特别复杂的实现,主要还是一些基本的算法还有数学上的一些操作比如函数之类的。大家可以提前一两天去比赛平台里找一些题目练练手,把一些基本的算法都练习一下,这样做过之后比赛中基本就够用了。

组队决赛进行时

最后的比赛大概是一天的时间,我们的题目是预测空气的质量,当时拿到的数据是北京市几个监测站一个月的监测数据,要做到的是给定一天的天气状况,然后要你预测第二天的每个小时的空气质量的情况。

我们的比赛过程可以用由繁至简来形容吧,我当时的队友是清华大学的王珊同学,我们的分工特别好,我主要负责算法这一块,搭档负责调试。由于时间限制的问题,在比赛中我们需要一个完整的解决方案流程,必须在实现和更好的想法之间折衷。

在决赛中,我遇到的最大的困难就是时间不够,最后只能简化思路。面对棘手的问题时,要先有信心自己肯定能搞定,然后具体问题具体分析,把问题拆细一步一步来。刚开始我们设计出了一个特别高大上的算法,但是一直到中午我们才发现这个东西真的太复杂了,我们根本没办法实现。后来我们决定换个思路:在我们对数据对问题有感觉之前,不用搞那么多复杂的东西,先一点点把基础给做好。就像刚刚说Code Hunt一样的思路,先从最简单的入手。按照这个步骤我们先是从一个最简单svm模型出发,不断优化我们使用的一些特征、数据的采样方式,时间序列的处理。

Tips

简单的东西也许没有很多高大上的算法在里面,但它够简单很稳定,一定可以被使用。在比赛这样特殊的环境下,你又没有特别多的时间,那你最高效的做法就是先用比较容易的算法,做出来一些图形,当然你最重要的是看一下数据本身有没有一些内在的规律。与其把时间用在研究那些说不清道不明的算法上,还不如把时间尽可能多的时间花在对数据本质的研究上去,当你了解了数据的本质后你可能用很简单的算法就可以解决问题。编程之美是比较偏应用的,我认为主要应该把自己掌握的算法合理地用起来,不一定要限制在什么范围。

创意赛

1. 背景介绍

今年的编程之美复赛就开始团队赛模式,然后决赛时我们的编程队还会遇到创意赛选手,他们会组成一个team,去解决一些更系统化的问题。

2. 当创意达人遇到技术流

我觉得这样的话比赛对我们的考察更全面了,你不仅是要会一个算法还要把它和实际问题相结合,并且最后还得做出一个完整的系统。说到创意赛我还是很好奇的,以前很少在编程类的比赛里见到创意赛这种,据我了解,这个比赛可能更多的是为非计算机系的同学设计的,创意赛的同学们可以很好弥补我们这种整天对着代码做事的同学的局限性,形成一个良性互补。我们可能比较擅长一些技术性问题的判断,抽象与实现,而创意赛同学可能表达更流畅,善于发现一些生活中的问题,想出一些好的idea来解决这些困难。包括我们的产品做出来后,最重要的是更好的让人去使用它,并且让每个人都真的去想用它,那么如何去展示这样一个作品可能是创意赛同学的强项。

有些同学会担心,组队后提出的创意命中自己的技术盲区该怎么办?这不是什么大问题,换个自己熟悉且可以实现的创意就好啦。或者说我认为创意赛的同学应该能够根据自己团队的实际情况设计比较符合的idea吧。

3. 创意赛选手特质

创意赛其实是给了我们不同学科的同学一次交流机会,我们计算机系的同学可能更擅长做技术,其他同学可以做一些事物本身的idea或者是怎样把我们的产品present出去,得到大家的认同啊之类的事情。我期待的创意赛选手需要具备的素质主要有三个:

首先他应该善于观察身边的事物,以及发觉这些事物中可以做的更好的地方。

然后就是希望创意赛的同学有可以跟我们的技术性选手比较畅通的交流能力,因为我们做技术的人的思维可能和创意赛同学们的思维不大一样,而沟通是团体比赛中非常重要的方面。

最后就是希望选手可以有比较好的发掘事物闪光点的能力。比如我们开发出了一个产品,那我们如何向别人推广我们的产品,如何让别人喜欢上我们的产品并且愿意去用我们的产品。这个是非常重要的一种能力,但恰恰可能是我们做技术的人所欠缺的,所以我特别希望创意赛的同学可以具备这方面的能力。

冠军的西雅图之旅

我觉得很荣幸能够拿到冠军并且可以赴美交流,在西雅图微软总部进行参观。首先西雅图真的是个美丽的城市,我在那里呆了大概两三天,然后也跟微软的工程师做了一些交流,试用了微软一些比较新的产品,我觉得这个经历很有意义。

当然如果我没有过来参加比赛这些都是不可能的,所以我非常真诚的希望大家可以踊跃报名,参加编程之美的比赛。

首先你肯定会获得一些技术上的收获,包括设计算法、实现系统的能力。

其次在这个大环境下你可以见到很多不同背景的同学,提高自己的合作、沟通能力。我们今年增加了创意赛后你还可以认识更多的朋友。

最后就是编程之美的比赛也不是一个纯粹算法比赛,大家也是会需要解决一些生活中的实际问题,不管怎么说你最后做出的系统都是非常有意义的,对你自己而言也是会有不一样的收获,所以大家快来参加比赛吧。