随笔分类 -  Programming Exercise

一些很有意思的编程练习
摘要:Code Jam的Round 1已经结束了,水平太菜,已经被淘汰了。开始整理做过的题。就从Qualification Round开始吧。http://code.google.com/codejam/contest/1460488/dashboard#s=p0Problem A.Speaking in Tongues 这道题比较简单,题目大概意思就是一种方言,也是使用英语的26个字母,但与正常英语里面的26个字母有一个固定的映射关系,题目要求使用这种映射关系,把给定的语句翻译成另一种语句。 需要注意的是,题目是出了示例,而且有提示的3个字母的映射关系,那么如果示例里面有剩下的映射关系,问... 阅读全文
posted @ 2012-05-10 23:29 Frandy.CH 阅读(407) 评论(0) 推荐(0) 编辑
摘要:习惯在Matlab里面计算,不太喜欢系统自带的计算器,但Matlab每次启动都比较慢。对于简单的计算,用不着Matlab,一直希望有一个简单版本的Matlab。一次看到OSChina上有分享一个简单的命令行计算器,觉得这个不错,不过功能仅限于数字的四则运算,于是想着可不可以写一个功能在稍微强一点的命令行计算器。于是就有了这个项目,称之为Command Line Calculator(CLC)。希望实现的功能,1. 数值运算,整数和浮点数;2. 变量赋值,表达式运算;3. 数学函数;4. 其他。网上已经有些计算器或者是数学表达式运算的程序了,上面的功能也有人实现了的。所以我在做一边,一是练习一下 阅读全文
posted @ 2012-05-03 22:55 Frandy.CH 阅读(1262) 评论(0) 推荐(0) 编辑
摘要:昨天Google Code Jam 2012 Round 1A。由于没有注意到它只进行两个半小时,而不是从你开始做开始计时,直接错过了参加比赛。后来看了一下题目,新题目还是比较有意思的,下面就给出各题的参考和实现。A. Password Problem 第一道题,跟概率有些关系。先理解一下题目意思。 一个人在输入一个很长的密码,输到一半时觉得前面可能有地方错了,那么他有三种选择, 1、继续输入,提交,如果没有错,ok。如果有错误,那么重新输入,这一次一定不会输错; 2、按退格键若干格,然后完成输入并提交。新输入的部分是不会出错的。如果错误被空格键清除,那么提交通过,否则需要重新... 阅读全文
posted @ 2012-04-29 18:41 Frandy.CH 阅读(611) 评论(2) 推荐(0) 编辑
摘要:这道题是Round 1B 2010的第二道题,第一次看的时候,没看懂题目意思,这一次总算是把题目看懂了。看懂之后,才发现,原来如此简单。 先说一下题目意思,在一条非常narrow的路上,有一群chicks,以各自的速度朝Barn前进。如果后面一只撞上前面的一只,就要以前面一只的速度前进。现在有一个arm ofcrane,机械臂,可以瞬间交换两只chick的位置,如果一只速度比较快的A被前面一只B挡住了,就可以交换一下,那么A到B的前面去了,而不用以B的速度前进。要求在一定时间T内,有K只到达barn。问是否可能,如果可能,需要交换的次数最少是多少。 在题目意思理解清楚之后,就会发现,如... 阅读全文
posted @ 2012-04-24 20:30 Frandy.CH 阅读(259) 评论(0) 推荐(0) 编辑
摘要:继续Round 1C 2009第二道题,多个物体的质心到原点最小距离。最后并且给出了质心的公式,x=sum(xi+xvi*t),...每个物体的质量都一样,就不用考虑x=sum(mi*(xi+xvi*t))。最后距离的平方d=x^2+y^2+z^2=at^2+bt+c,一个关于t的二次多项式,求t>=0时的最小值。应该不难的,只是数值计算过程中会出现一些奇怪的问题。比如已经判断b^2-4ac>=0,sqrt(c-b^2/4a)的时候却提示出错。另外,需要分情况讨论求最小值。b>=0的时候,如果a很小,看作一次式,那么d是增加的,在t=0时取最小值,如果a不算小,那么是二次式, 阅读全文
posted @ 2012-04-16 10:23 Frandy.CH 阅读(379) 评论(0) 推荐(0) 编辑
摘要:连续碰到几道题搞不定,想找一道简单一点的,来增加一点成就感。于是看了这道题,第一道题,虽然是C轮的,应该不会太难吧?但看完题就知道自己错了,为什么连题都看不懂呢?无奈,求助答案吧。答案好简单,连Python代码都给了。还是简单分析一下吧。先来解释题目意思,题目给出一个字符串,包含a-z0-9,表示一个数字,这个数字的基数base可以是任意的,要求选一个基数,使字符串表示的数最小,并且第一位不为0。怎样可以使基数最小呢?base=10,即十进制,有0-9种表示0-9,也可以用a-j表示0-9,反正就是要10个不同的字符。那么字符串的基数最小就可以是字符串中不同字符的个数。而且要使表示的数最小,那 阅读全文
posted @ 2012-04-15 21:15 Frandy.CH 阅读(350) 评论(0) 推荐(0) 编辑
摘要:之前没搞定的几道题先跳过了,来做做简单的吧。Round 1A 2010,第一道题,Rotate,join-K的游戏,不太了解,略过。按照题目意思,将数据先顺时针转90度,然后由于重力作用,有空白的地方会被上面的棋子落下来填上。然后如果出现一定数目的同一种颜色的棋子在一条线上,那么该颜色的一方获胜。与五子棋类似,只是它这里添加了旋转和重力的问题。其实旋转和重力不是大问题,顺时针旋转90度,然后重力填补空白,将相当于水平方向上棋子向右落来填补空白。是否旋转了90度与最后谁获胜没有关系。那么如何填补右方的空白呢?strip(".")可以去掉字符串中的".",但 阅读全文
posted @ 2012-04-14 11:19 Frandy.CH 阅读(354) 评论(0) 推荐(0) 编辑
摘要:继续Round 1B 2010。第二道题没理解题目,第三道题题目可以理解,但是算法又折腾了好久。还是先看第三道题吧。给定一个集合S={2,3,...n},它的子集S' 满足性质:n在S'中是第k个元素,那么k应该也在S'中,同样地,k是第k'个元素,那么k'应该也在S'中,经过有限步,k=1,不在S'中,称n对于S'是Pure Rank。那么给定一个n,求S'的个数。在Content Analysis中,给除了动态规划算法的算法。我怎么觉得好多题都是动态规划,我正好不太懂态规划。看看具体算法如下,如果n是一个集合S' 阅读全文
posted @ 2012-04-13 12:16 Frandy.CH 阅读(337) 评论(0) 推荐(0) 编辑
摘要:前几天一直卡在Making Chess Board那道题上,目前还没有完全解决,打算先跳过。这次是Round 1B 2010的第一道题,还算比较简单,具体如下。在Linux系统中,创建文件夹需要使用mkdir,如果父文件夹不存在则需要先创建父文件夹,题目先给出一组已经创建的文件路径,然后给出一组需要创建的文件路径,计算最少的mkdir的次数。当然,没有使用mkdir -p。直接的想法就是,对已经创建的路径进行hash,放入dict,所以读取一个已经创建的路径的时候,先查看整个路径是否已经在dict中,如果不在,将其添加到dict中,剥掉最后一层,继续检查路径是否在dict中,如果在,则结束。同 阅读全文
posted @ 2012-04-12 21:52 Frandy.CH 阅读(268) 评论(0) 推荐(0) 编辑
摘要:Round 1C 2010的最后一题。C轮果然还是有些难度的,虽然我觉得第一题比较简单。这题是给定一大块板子,上面有黑块和白块,跟Chess Board上面的方格类似。要求将上面存在的Chess Board剪下来,从大到小。直接的方法,size从最大到最小,扫描整个板子,选取size大小的块进行匹配,如果满足,那么将这一块剪下来。存在的几个问题,1. 数据的读取给定的是16进制数据,每一位表示一个块,0和1表示是黑块还是白块。需要将其转化为一位一位的形式。这里采用的方法是bin(ord(s)-ord("A")+10),先把A~F转化成数字,然后转化成二进制数,再把二进制数的 阅读全文
posted @ 2012-04-09 14:52 Frandy.CH 阅读(274) 评论(0) 推荐(0) 编辑
摘要:Round 1C 2010,C轮的测试题了。本以为难度会加大,不过第一题还是比较简单的。Rope Intranet,统计绳子的交点个数。算法很直接,遍历所有的绳子,累计它与剩下的绳子的交点的个数。代码如下:#!/usr/bin/python#encoding:UTF-8#Filename:RopeIntranet.pyimport sysdef compareWire(a,b): if (a[0]<b[0] and a[1]>b[1]) or (a[0]>b[0] and a[1]<b[1]): return 1 else: return 0inname... 阅读全文
posted @ 2012-04-09 09:51 Frandy.CH 阅读(239) 评论(0) 推荐(0) 编辑
摘要:Welcome to code jam,Qualification Round 2009的第三道题。题目的大概意思是,给定一个字符串,要求找出里面welcome to code jam的次数,给出最后四位数字。只要这19个字符按顺序出现了,就可以算作一次,不管是否被其它字符隔开。在Contest Analysis中,给的方法是动态规划。在思考了一小会没有想到解法之后又直接看答案了。。。动态规划的思想是,cnt[i,j]表示在给定的字符串的前i个字符中,出现welcome to code jam的前j个字符的个数,那么处理i+1个字符时,如果第i+1个字符是对应的第j个字符,那么cnt[i+1] 阅读全文
posted @ 2012-04-08 23:15 Frandy.CH 阅读(267) 评论(0) 推荐(0) 编辑
摘要:Water Sheds,这是Qualification Round 2009的第二道题,还没有想到好的解决办法的时候,直接看了参考解答。参考解答研究了好久才看明白,看来还需要加强练习。先来看看题目意思,给定一个mxn的矩阵,每个位置是一个海拔值,相当于是一份地图,要求根据水流给这份地图进行标注,水流动的规则是,1. 对任一个位置,至多流向它的四个邻居中的一个,邻居就是东南西北方向的四个位置;2. 如果相比于四个邻居,它本身的海拔最低,那么水不流动,这个位置称为sink,盆地;3. 否则,水流向海拔最低的一个邻居;4. 选择海拔最低的邻居的顺序是,North,West,East,South,即北 阅读全文
posted @ 2012-04-08 20:52 Frandy.CH 阅读(303) 评论(0) 推荐(0) 编辑
摘要:进入Qualification Round 2009的试题,第一道题Alien Language,模式匹配的问题,既然选择了Python,可以使用Regular Expression正则表达式,那就是太简单了。主要问题就在于把给定的pattern转换为regular expression,把"("和")"换成"["和"]"就可以了,代码如下:#!/usr/bin/python#encoding:UTF-8#Filename:AlienLanguage.pyimport sysimport reinname = &q 阅读全文
posted @ 2012-04-07 21:08 Frandy.CH 阅读(280) 评论(0) 推荐(0) 编辑
摘要:Numbers,这道题是Round 1A 2008的最后一道题,给定n,要求计算(3 + √5)^n整数部分的最后三位数字,如n= 5, (3 + √5)5= 3935.73982,那么结果就应该是935,不足三位数字,则补零。(3 + √5)n+1与(3 + √5)n有递推关系,用an+bn√5表示(3 + √5)n,那么α(n + 1)= (3 + √5)(an+ bn√5) = (3an+ 5bn) + (3bn+ an)√5,可以写成矩阵形式,在contest analysis里面也给出了Python的解题代码,如下,#!/usr/bin/python#encoding:UTF-8#F 阅读全文
posted @ 2012-04-07 19:39 Frandy.CH 阅读(332) 评论(0) 推荐(0) 编辑
摘要:还是MilkShakes的问题。今天看了一下Contest Analysis,按照提示总算得到了较好的结果。在Contest Analysis中,给出了算法的描述,如下:1. 初始化flavor choice全为0,检查customer的满意情况;2. 对于不满意的customer,如果他只喜欢unmalted的,但是所有的已经malted,那么该customer不可能被满足,给出IMPOSSIBLE;3. 对于不满意的customer,如果他只有一种喜欢的malted,那么将对应的malted,回到步骤2;4. 如果没有不满意的customer,那么就是得到了解。在用Python实现的时候, 阅读全文
posted @ 2012-04-07 17:08 Frandy.CH 阅读(360) 评论(0) 推荐(0) 编辑
摘要:继续MilkShakes问题。之前是使用穷举搜索的方法,能保证结果的准确,但是效率较低,对于large case无法完成测试。后来想用贪心算法来实现。贪心策略是,统计flavor处于malted或unmalted出现的次数,取unmalted出现次数最多的flavor,这样被迫出现的malted的flavor次数会少;取malted出现次数最多的flavor,使得被迫出现malted的次数减少。在使用贪心算法之前,可以对只有一种选择的customer进行满足,确定一部分flavor。如果不能满足,则直接得到结果。代码如下:#!/usr/bin/python#encoding:UTF-8#Fil 阅读全文
posted @ 2012-04-06 21:18 Frandy.CH 阅读(322) 评论(0) 推荐(0) 编辑
摘要:MilkShakes,这道题有些难度,自己水平太差,还没有找到好的方法来解决。对于small case,得到了正确的答案。先来看看题。题目的大概意思是,给一些不同flavor(风味)牛奶(1,..N),可以是malted(1),也可以是unmalted(0),但是每一种牛奶只能是malted或者unmalted;有很多顾客,每个顾客喜欢的不一样,也可能喜欢多种。要求给出各种牛奶是否malted,能够满足所有顾客都有自己喜欢的flavor,并且malted的数量尽可能少。具体内容参考http://code.google.com/codejam/contest/32016/dashboard#s= 阅读全文
posted @ 2012-04-06 17:59 Frandy.CH 阅读(343) 评论(0) 推荐(0) 编辑
摘要:继续Python练习。这次的题很简单的。这次的题是Minimum Scalar Product,大概意思是给你两个数组va和vb,两个数组的元素对应相乘,然后求和,要求和最小,在数组元素顺序可以调整的时候。这里主要用到一个不等式,x和y两个升序的数组,那么sum(x[i]*y[i])>=sum(x[i]*y[n-i]),这个不等式在元素中有负数时也是成立的,所以问题的解法就很直接了。Python里面可以直接调用sort和reverse函数,先将两个数组va和vb排序,然后将其中一个reverse一下,在把元素对应相乘,就得到最小值了。代码如下:#!/usr/bin/python#enco 阅读全文
posted @ 2012-04-01 12:31 Frandy.CH 阅读(544) 评论(0) 推荐(0) 编辑
摘要:与Store Credit和Reverse Words同一组的另一道题,T9 Spelling也解决了。题目大概意思就是,手机的9格键盘,上面有26个字母,0表示空格。a字母只需要按一个2,b字母需要连续按2两次,就是22,要输入ab时,2和22之间需要有一段间隔,用空格表示,而要输入的空格是0,例如 i am ok,对应的是4026065。具体的可以看http://code.google.com/codejam/contest/351101/dashboard#s=p2由于7和9对应的是4个字母,其它的是3个字母,字母与数字之间的映射表需要手动写了。这里主要问题就是映射怎么写?如果是' 阅读全文
posted @ 2012-03-31 22:02 Frandy.CH 阅读(479) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示