摘自“Chris 困惑了太久,现在半懂不懂,所以不妨写篇博客”的宏伟档案:代码高尔夫。我曾经听到有人说“我通过自己的高尔夫把它缩小到这么小”。我会眯着眼睛,感到困惑,然后就让它过去,因为这似乎不值得询问。也许是“工作”或“修补”的俚语。
这确实不差太远。**整个想法是将代码缩减到尽可能少的字符,同时保持功能。**在(真正的)高尔夫中,击球进洞的击球次数越少,你的表现就越好。在代码高尔夫中,你使用的字符越少,你的表现就越好。
有时代码高尔夫是比赛(或者假设是锦标赛,保持术语一致)的一部分。有时只是为了娱乐。有时它很有用。有时格式是解决特定的挑战或算法,或者从给定的输入中获得某些预期的输出。
“压缩”代码的可理解性完全消失了。代码不需要被理解,它只需要简短且有效。通常,人们会带着完全的困惑来看一段压缩的代码。这里有一个
function(a){a='0x'+a.slice(1).replace(a.length>4?a:/./g,'$&$&')|0;return[a>>16,a>>8&255,a&255]}
这是一段 JavaScript 代码,用于获取十六进制颜色并返回其 RGB 值。仅凭观察很难分辨!它是由 Jed Schmidt 编写的,在他的网站 140byt.es 上,该网站提供执行功能操作的推文大小的 JavaScript 代码片段。
在 JavaScript 的情况下,压缩的代码可能偶尔有用,因为它减少了需要通过网络发送的代码量。
维基百科有一篇关于代码高尔夫的文章,称其起源于 1999 年的 Perl。几乎任何你能想到的语言都可以压缩(毕竟它只是一个概念),并且可能甚至有锦标赛。 Reddit 和 StackExchange 都有专门的子站点用于此。
除了有趣之外,它还可以练习对语言的更深入理解,以及扩展你的逻辑和推理能力。
代码高尔夫不需要正式化,它可能只是你为了娱乐而做的事情。当你从正在处理的代码中删除几行代码时,你就压缩了它。
作为一个相关的旁白,我还没有在 SVG 中看到很多压缩代码。不过,SVG 非常适合它,因为它非常数学化、声明式和引用式。正是这支笔让我开始思考这个问题
查看 fuddl 在 CodePen 上编写的笔 Arrows(@fuddl)。
我也尝试了一下
查看 Chris Coyier 在 CodePen 上编写的笔 SVG Golf(@chriscoyier)。
http://codegolf.stackexchange.com/
感谢这篇文章!
JS 代码高尔夫是我的主要爱好(与 Twitter 和 Github 上的一群人一起)。
你可以在此处找到我们的大部分作品
https://gist.github.com/xem/206db44adbdd09bac424
以下是一些其他值得一提的有趣链接
– http://www.reddit.com/r/tinycode/
– http://js1k.com
干杯!
这是最酷、最极客的爱好。我深受启发。
我将其视为赞美 :) 干杯
关于 SVG 压缩的话题,这是我最喜欢的压缩 SVG 代码的糟糕示例,这要归功于利用 HTML 5 解析器来填充各种缺失字符
http://codegolf.stackexchange.com/a/26752
我喜欢代码高尔夫!我制作的最有用的东西之一是获取 DOM 选择器数组并将其转换为可以循环遍历的普通数组。我在 140 个字节内完成了它。
http://codepen.io/fabean/pen/vEMPrW
以前从未听说过代码高尔夫,但解释非常合理。感谢分享。
如果你使用
vi
/vim
并且还没有尝试过,你可以查看 Vim Golf你可以在 CodeWars.com 上与其他编码人员实时竞争。它还有一个评分系统等等,这非常不错。
vimgolf 是一个非常流行的 ruby gem,值得一看。 http://www.vimgolf.com/
在 C# 中什么也不做怎么样?
阅读后,我创建了一个微小的 aj(ax) 库
github.com/aretecode/aj
这很有趣。我一直使用“一杆进洞”这个词来表示你突破了一些代码,并且它在第一次刷新时完全按预期工作。
这篇文章中我真正缺少的一点是,一小节解释压缩实际上几乎总是生产代码中的一个非常糟糕的想法。
现实世界项目的问题在于,它们不仅仅是编写能够完成工作的代码。在现实世界项目中,代码易于阅读和理解也非常重要。易于理解的代码往往包含更少的错误,并且更容易维护。
过度的压缩几乎总是会导致不必要的晦涩代码,难以理解。这增加了错误的风险,并使维护变得更加困难。
完全同意 Ruben!你处理过多少次“童子军”代码,其中代码确实写在一行中,但基本上不可读?
是的,代码高尔夫是一种反模式。
好的代码是清晰的,而不是深奥的。
Fizzbuzz 有人吗?
这算高尔夫吗? http://www.nanochess.org/chess3.html