对于Cody的挑战,最好的解决方案应该基于代码中使用的最少字符数吗?万博 尤文图斯

4个视图(过去30天)
明吉陈
明吉陈 2020年8月30日
评论: Rik 5 .卡特彼勒
它非常奇怪的是如何使用比往常更多的字符的解决方案可以是Cody问题的“领先解决方案”,并且具有最小的尺寸。比较这两个代码,该代码从1到2 ^ x找到整数的总和,其中一个人使用较少的字符,因此应该是更好的解决方案?
函数y = sum_int (x)
正则表达式''(?@y=sum(1:2^x);)'
终止
函数ans = sum_int (x)
总和(1:2 ^ x)
终止

答案(2)

约翰·德雷科
约翰·德雷科 2020年8月30日
编辑:约翰·德雷科 2020年8月30日
科迪有一些不同寻常的方面。我不想说这个想法有缺陷,但有些方面我想改变,完全不知道如何让它变得更好。可悲的是,玩Cody评分算法很容易,至少在你学会了一些技巧之后。
问题在于,您希望Cody将“最佳”代码作为最佳解决方案予以奖励。但是对于任何问题来说,真正最好的代码往往依赖于问题的某些特性。它甚至可能取决于用户,或者它将被解决的计算机系统。
一个用户可能不关心时间,但是内存非常有限。对于这个人来说,他们无法负担使用大内存来权衡时间的解决方案。
另一个人可能有很多记忆,但必须解决数百万次问题。因此时间是我们需要的因素。
最后,解决方案的复杂性总是一个重要的特性。通过教学生写不可读的代码,这恰好优化了Cody评分算法,我们创造了编写糟糕代码的程序员,他们认为这是好的,却不知道他们已经养成的坏习惯。
说到这里,Cody本身就是一个好主意,因为它确实教会人们学习编程技能。它教会他们解决问题的创造力,这对于编程来说是一件非常重要的事情。它可以教会你寻找不同的方法来解决一个问题,认识到不是每个算法对每个问题都是最优的。
解决科迪问题时,我个人的目标是不在乎分数。我知道我什么时候做得好。例如,假设我想解决提出的问题?因此,计算从1到2^x的整数之和,其中x是输入参数?
抱歉,但代码是这样的:
函数ans = sum_int (x)
总和(1:2 ^ x)
终止
只是糟糕的编程风格,有几个原因。使用ans给Cody分数一个轻微的碰撞的hack是一个纯粹的hack。但是,当有人开始编写真正的代码时(可能是为了工作),代码的可读性是一个重要的因素,这就造成了糟糕的实践。您需要学习编写易于调试、便于他人(包括您的后继者)使用的代码。
接下来,如果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的幂只有一次,不是两次。它是有效的,不需要数百万次失败来计算某个x值的结果。
我想说得非常清楚——Cody评分算法有缺陷。可以纠正吗?你可以做很多事情,但是你选择的任何方案都有可能赢得比赛。这是否意味着不应该使用科迪?当然不是!科迪是一个伟大的工具,如果使用得当。
我不妨说,金钱是一件坏事,有着严重的缺陷,因为它鼓励人们抢劫银行以获取更多的金钱、偷窃、挪用等等。只要我们不滥用金钱,只要我们明白金钱不应该是我们存在的目的,金钱是好的。
是的,你可以说我很虚伪。对于一个有很多网站代表的人来说,网站代表并不重要,这看起来可能是这样的。但我死后,我怀疑会有人在我的讣告中提到我的网站代表,至少我希望不会。但有些人可能会记得我提供的许多工具,我在各个层面帮助过的许多人。他们可能还记得我在这里教的数值分析或数学课程。
所以请使用cody !只是用它来学习好的技能,而不是坏习惯。不要担心站点代表,站点代表是你做好工作的一个渐进结果,而不是从系统中钻出来的。你可以从解决Cody问题中学到一些很好的编程技巧,一些很好的数学知识。不要担心评分算法。一旦你开始这样做,你就会把注意力放在错误的事情上。
8评论
Rik
Rik 5 .卡特彼勒
它还要求挑战作者提前了解最好的解决方案,这可能是糟糕的设计。到目前为止,我有信心声称我很熟练,但“甚至”我仍然看到其他人在解决方案中的功能,我从未知道任何事情。万博 尤文图斯然后,它结果,这些功能已经成为DeDade(或两种)的MATLAB的一部分。

登录以发表评论。


Rik
Rik 2020年8月30日
我个人的看法是:不。我倾向于另一种衡量标准:时间。
如果您参加角色计数,那将仅推动使用短变量名称,这不会教授良好的编码实践。一个疯狂的狩猎最好的性能可能也不是最佳,但至少你可以看到外面的福利。它应该教你加速你的代码的方法,而不是教你所有愚蠢的方式,你可以封锁 评估 具有 regexprep

类别

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始狩猎!