Was sind Ihre Tipps zum Code-Golfen mit Clojure?
Ziel dieser Frage ist es, eine Liste von Techniken zusammenzustellen, die spezifisch für Clojure sind und bei allgemeinen Code-Golf-Problemen eingesetzt werden können.
Was sind Ihre Tipps zum Code-Golfen mit Clojure?
Ziel dieser Frage ist es, eine Liste von Techniken zusammenzustellen, die spezifisch für Clojure sind und bei allgemeinen Code-Golf-Problemen eingesetzt werden können.
Antworten:
Verwenden Sie die Reader-Syntax für Lambdas.
Also benutze
#(+ % %2 %3)
Anstatt von
(fn [x y z] (+ x y z))
Sie können auch gelegentlich Leerzeichen entfernen:
#(if (< % 0) (- %) %)
#(if(< % 0)(- %)%)
#(+ % %2 %3)gleichbedeutend mit +.
Zwischen einer Zeichenfolge und irgendetwas anderem:
(println(+"Hello, World!"1))
Zwischen Klammern und allem anderen:
(for[x(range 5)](* x x))
Zwischen einer Zahl und allem anderen als Builtins oder Variablennamen:
Allowed:
(+ 1"Example")
(map{1"-1"2"-2"}[1 2 3])
Not allowed:
(+1 2)
Zwischen @(Dereferenzierung für Atome) und Klammern.
@
letund einige Leerzeichen entfernen können.
#(+ 1(first%))=#(+ 1 (first %))
Zeichenfolgen können als Zeichenfolge behandelt werden
zB um die Zeichen in einer Zeichenkette alphabetisch zu sortieren:
(sort "hello")
=> (\e \h \l \l \o)
nth ... 0anstelle vonfirstWenn Sie das erste Element einer Sammlung abrufen möchten, speichern Sie ein Byte mit (nth ... 0)over first:
(first[2 3 4]): 14 bytes
(nth[2 3 4]0): 13 bytes (saves a byte!)
second(2 Bytes)
([2 3 4]1)das Element bei Index 1 zurückgegeben wird. Dies sollte von Vorteil sein, wenn beispielsweise das Eingabeformat flexibel ist.
Wenn Sie beispielsweise ein partitionoder frequenciesmehrere Male verwenden müssen, kann es hilfreich sein, sie an ein Einzelbytesymbol in einem letMakro zu binden . Andererseits lohnt es sich möglicherweise nicht, wenn Sie das nicht benötigen let, und der Funktionsname ist relativ kurz.