Clojure打高尔夫的秘诀


16

使用Clojure打高尔夫球的技巧是什么?

这个问题的目的是收集特定于Clojure的技术列表,这些技术可用于一般的代码高尔夫问题。


嗯..这些类型的帖子不应该放在meta中(当然,我不确定meta是否存在5年以上)
Albert Renshaw

Answers:


6

对lambda使用阅读器语法。
所以用

#(+ % %2 %3)

代替

(fn [x y z] (+ x y z))

您还可以在某些时候消除空格:

#(if (< % 0) (- %) %)
#(if(< % 0)(- %)%)

顺便#(+ % %2 %3)等于+
bfontaine

4

可以删除空格的位置:

  • 在字符串和其他任何东西之间:

    (println(+"Hello, World!"1))
    
  • 在方括号和其他任何东西之间:

    (for[x(range 5)](* x x))
    
  • 在数字和除内建函数或变量名之外的所有内容之间:

    Allowed:
    (+ 1"Example")
    (map{1"-1"2"-2"}[1 2 3])
    
    Not allowed:
    (+1 2)
    
  • @(取消引用原子)和方括号之间。


也在deref阅读器宏之前@
仅ASCII的

1
同样,有时您可能可以在a处重新排列内容let并摆脱一些空格。
NikoNyrh

同样在匿名函数中的参数之前:#(+ 1(first%))=#(+ 1 (first %))
bfontaine

3

字符串可以视为一个字符序列

例如,按字母顺序对字符串中的字符进行排序:

(sort "hello")
=> (\e \h \l \l \o)

1
根据定义,字符串几乎是每种语言中的一个字符序列,但是您不能对所有字符都应用此技巧:-)
mellamokb 2011年

3
或者说,“顺序”在Clojure中有特殊含义,而不是意味着您可以应用其他技巧::-)
mikera 2011年

2

使用nth ... 0代替first

要获取集合的第一个元素,请使用(nth ... 0)over first保存一个字节:

(first[2 3 4]): 14 bytes
(nth[2 3 4]0): 13 bytes (saves a byte!)

同样适用于second(2个字节)
Uriel

1
另外,您也可以将向量用作函数,因此([2 3 4]1)返回索引1处的元素。如果输入格式灵活,这将是有益的。
NikoNyrh

1

使用套用而不是减少

例如,#(apply + %)比短一个字节#(reduce + %)


1

如果您已经有一个,请避免让

例如:#(for[a[(sort %)]...)代替#(let[a(sort %)](for ...))

For确实也有一个:let构造,但是对于代码高尔夫来说太冗长了。


1

使用+-代替incdec

如果在带括号的表达式上使用inc/ dec,则会节省1个字节:

(inc(first[1 3 5]))
(+(first[1 3 5])1)

1

if测试相等性时,使用map而不是s

;; if n=3 then A else B
(if (= 3 n) A B) ; (if(=3n)AB)
({3 A} n B)      ; ({3A}nB) -> -3 chars

;; if n=2 or n=3 then A else B
(if (#{2 3} n) A B) ; (if(#{23}n)AB)
({2 A 3 A} n B)     ; ({2A3A}nB) -> -4 chars

1

将let的长函数名称绑定到单字节符号

例如,如果您需要使用partitionfrequencies多次,将它们绑定到let宏中的单字节符号可能是有益的。再一次,如果您不需要let其他方法,则可能不值得,并且函数名称相对较短。


0

用于代替地图

例如,#(for[i %](Math/abs i))map等效的要短很多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.