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.
Sie können auch Vektoren als Funktionen verwenden, sodass ([2 3 4]1)das Element bei Index 1 zurückgegeben wird. Dies sollte von Vorteil sein, wenn beispielsweise das Eingabeformat flexibel ist.
NikoNyrh
1
Verwenden Sie Übernehmen anstelle von Reduzieren
Zum Beispiel #(apply + %)ist ein Byte kürzer als #(reduce + %).
Verwenden Sie ifbeim Testen auf Gleichheit Karten anstelle von 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
Binden Sie lange Funktionsnamen bei let an ein Einzelbytesymbol
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.
Antworten:
Verwenden Sie die Reader-Syntax für Lambdas.
Also benutze
Anstatt von
Sie können auch gelegentlich Leerzeichen entfernen:
quelle
#(+ % %2 %3)
gleichbedeutend mit+
.Wo Sie Leerzeichen entfernen können:
Zwischen einer Zeichenfolge und irgendetwas anderem:
Zwischen Klammern und allem anderen:
Zwischen einer Zahl und allem anderen als Builtins oder Variablennamen:
Zwischen
@
(Dereferenzierung für Atome) und Klammern.quelle
@
let
und 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:
quelle
Verwenden Sie
nth ... 0
anstelle vonfirst
Wenn Sie das erste Element einer Sammlung abrufen möchten, speichern Sie ein Byte mit
(nth ... 0)
overfirst
:quelle
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.Verwenden Sie Übernehmen anstelle von Reduzieren
Zum Beispiel
#(apply + %)
ist ein Byte kürzer als#(reduce + %)
.quelle
Vermeiden Sie lassen, wenn Sie bereits eine für haben
Zum Beispiel:
#(for[a[(sort %)]...)
statt#(let[a(sort %)](for ...))
.Für hat auch ein
:let
Konstrukt, aber es ist zu ausführlich für Code-Golf.quelle
Verwenden Sie
+
und-
anstelle voninc
unddec
Dies spart 1 Byte, wenn Sie
inc
/dec
für einen Ausdruck mit parens verwenden:quelle
Verwenden Sie
if
beim Testen auf Gleichheit Karten anstelle von squelle
Binden Sie lange Funktionsnamen bei let an ein Einzelbytesymbol
Wenn Sie beispielsweise ein
partition
oderfrequencies
mehrere Male verwenden müssen, kann es hilfreich sein, sie an ein Einzelbytesymbol in einemlet
Makro zu binden . Andererseits lohnt es sich möglicherweise nicht, wenn Sie das nicht benötigenlet
, und der Funktionsname ist relativ kurz.quelle
Verwenden Sie für anstelle der Karte
Zum Beispiel
#(for[i %](Math/abs i))
ist viel kürzer als dasmap
Äquivalent.quelle