对于Cody挑战,最好的解决方案应该基于代码中使用的最少字符数吗?金宝搏官方网站

4次浏览(最近30天)
一个比通常使用更多字符的解决方案可以是Cody问题的“主要解决方案”,并且具有最小的尺寸,这是非常奇怪的。比较这两个代码,找到整数从1到2^x的和,哪一个使用更少的字符,因此应该是更好的解决方案?
函数Y = sum_int(x)
正则表达式“‘(? @y = (1:2 ^ x)总和;)”
结束
函数Ans = sum_int(x)
总和(1:2 ^ x)
结束

答案(2)

约翰D 'Errico
约翰D 'Errico 2020年8月30日
编辑:约翰D 'Errico 2020年8月30日
科迪有一些不寻常的方面。我讨厌说这个想法有缺陷,但有些方面我想改变,我完全不知道如何让它变得更好。可悲的是,至少一旦你学会了一些技巧,要想玩弄科迪评分算法是很容易的。
问题在于,您希望Cody将“最好的”代码作为最佳解决方案来奖励。但是对于任何问题来说,真正最好的代码往往取决于问题的某些特性。它甚至可能取决于用户,或者它将被解决的计算机系统。
一个用户可能不关心时间,但是内存受到严重限制。对于这种人来说,他们无法负担使用大内存来换取时间的解决方案。
另一个人可能有足够的记忆,但必须解决问题数百万次。因此,时间是我们需要的因素。
最后,解决方案的复杂性始终是一个重要的特征。通过教学生编写不可读的代码,这恰好优化了科迪评分算法,我们培养出了编写糟糕代码的程序员,他们认为这是好的,而不知道他们已经学会了坏习惯。
说了这么多,Cody本身就是一个好主意,因为它确实教会人们学习编程技能。它教会他们解决问题的创造力,这对编程来说是非常重要的。它可以教会你寻找解决问题的不同方法,认识到并非每个算法对每个问题都是最优的。
在解决Cody问题时,我的个人目标是不关心分数。我做得好就知道了。例如,假设我想解决提出的问题?因此计算从1到2^x的整数的和,其中x是一个输入参数?
抱歉,但是像这样的代码:
函数Ans = sum_int(x)
总和(1:2 ^ x)
结束
只是糟糕的编程风格,有几个原因。其中的黑客是用来给一个轻微的碰撞科迪分数是一个纯粹的黑客。但是,当有人开始编写真正的代码时,可能是为了一份工作,代码的可读性是一个重要因素,这就导致了糟糕的实践。你需要学会编写易于调试的代码,以便其他人(包括你的继任者)使用。
接下来,如果x稍微大一点,比如20或25,那么现在你可能是在对数百万个数字求和。同时,从1到N的整数的和也很简单,如
N * (N + 1) / 2
这几乎不需要花费计算时间,很少有失败,不管N的大小。
因此,计算从1到2^x的整数和的函数可以写成
函数S = sum_int(x)
X2 = 2^(x-1);
S = x2*(2*x2+1);
这总是最有效的。它甚至可以很容易地向量化。更好的代码是友好的。它会检查x是否是一个非负整数。它会检查x是否太大,导致溢出。这些错误检查会大大降低科迪分数。但这是我个人分数的升级。
上面的代码得分高吗?当然不是很高。它是可读的。2的a次方只有一次,而不是两次。它是高效的,不需要数百万次flop来计算x的某些值的结果。
我想说清楚,科迪评分算法有缺陷。它们能被纠正吗?您可以做很多事情,但您选择的任何方案仍然可能获得分数。这是否意味着Cody不应该被使用?当然不是!Cody是一个很好的工具,如果使用得当的话。
我还可以说,货币是一种坏东西,有严重的缺陷,因为它鼓励人们抢劫银行,以获得更多的钱,偷窃,侵吞等等。钱是好的,只要我们不滥用它,只要我们明白它不应该是我们存在的目的。
是的,你可以说我很虚伪。对于有很多网站代表的人来说,网站代表不重要可能看起来是这样的。但当我死后,我怀疑有人会在我的讣告中提到我的网站代表,至少我希望不会。但有些人可能还记得我提供的许多工具,我在各个层面帮助过的许多人。他们可能还记得我在这里教的数值分析或数学课程。
所以请使用cody !只用它来学习好的技能,而不是坏习惯。不要担心网站代表,网站代表是你做好工作的逐渐结果,而不是在系统中玩游戏。你可以从解决Cody问题中学到一些不错的编程技巧,一些不错的数学。不要担心评分算法。一旦你开始这样做,你就把注意力放在了错误的事情上。
8的评论
里克
里克 2020年9月11日
它还要求挑战的作者提前知道最佳解决方案,这可能是糟糕的设计。到目前为止,我很自信地宣称自己相当熟练,但“即使”我有时仍然会在其他人的解决方案中看到我一无所知的函数。金宝搏官方网站事实证明,这些函数已经成为Matlab十年(或二十年)的一部分。

登录评论。


里克
里克 2020年8月30日
我个人的观点是:不。我倾向于另一种度量:时间。
如果您使用字符计数,那只会促使使用较短的变量名,这并不能传授良好的编码实践。疯狂地寻找最佳性能可能也不是最优的,但至少您可以看到Cody之外的好处。它应该教你如何加快代码的速度,而不是教你所有可以绕过阻塞的愚蠢方法 eval regexprep

类别

了解更多策略与逻辑帮助中心而且文件交换

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!

翻译的