Wskazówki do gry w golfa w Clojure

16

Jakie są Twoje wskazówki dotyczące gry w golfa za pomocą Clojure?

Celem tego pytania jest zebranie listy technik specyficznych dla Clojure i które można zastosować w ogólnych problemach z golfem.

mikera
źródło
Hmm .. nie powinny tego typu posty być w meta (oczywiście nie jestem pewien, że meta istniała ponad 5 lat temu)
Albert Renshaw

Odpowiedzi:

6

Użyj składni czytnika dla lambdas.
Więc użyj

#(+ % %2 %3)

zamiast

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

Czasami możesz także wyeliminować białe znaki:

#(if (< % 0) (- %) %)
#(if(< % 0)(- %)%)
użytkownik2429260
źródło
nawiasem mówiąc #(+ % %2 %3)jest równoważne +.
bfontaine
4

Gdzie możesz usunąć białe znaki:

  • Między ciągiem a czymkolwiek innym:

    (println(+"Hello, World!"1))
    
  • Między nawiasami i czymkolwiek innym:

    (for[x(range 5)](* x x))
    
  • Między liczbą a wszystkim innym niż wbudowane lub nazwy zmiennych:

    Allowed:
    (+ 1"Example")
    (map{1"-1"2"-2"}[1 2 3])
    
    Not allowed:
    (+1 2)
    
  • Pomiędzy @(dereferencje dla atomów) i nawiasami.

clismique
źródło
Także przed makrem czytnika deref@
tylko ASCII
1
Czasami możesz być w stanie ponownie uporządkować rzeczy leti pozbyć się niektórych przestrzeni.
NikoNyrh
Również przed parametrami w funkcjach anonimowych: #(+ 1(first%))=#(+ 1 (first %))
bfontaine
3

Ciągi znaków można traktować jako ciąg znaków

np. aby posortować znaki alfabetycznie:

(sort "hello")
=> (\e \h \l \l \o)
mikera
źródło
1
Struny są z definicji ciągiem znaków w prawie każdym języku, ale nie można było zastosować tę sztuczkę w każdym z nich :-)
mellamokb
3
A raczej „sekwencja” ma w Clojure specjalne znaczenie, niż oznacza, że ​​możesz zastosować dodatkowe sztuczki: :-)
mikera
2

Użyj nth ... 0zamiastfirst

Aby uzyskać pierwszy element kolekcji, użycie (nth ... 0)over firstzapisuje bajt:

(first[2 3 4]): 14 bytes
(nth[2 3 4]0): 13 bytes (saves a byte!)
clismique
źródło
to samo dotyczy second(2 bajtów)
Uriel
1
Możesz także używać wektorów jako funkcji, więc ([2 3 4]1)zwraca element o indeksie 1. To powinno być korzystne, jeśli na przykład format wejściowy jest elastyczny.
NikoNyrh,
1

Użyj zastosowania zamiast zmniejszania

Na przykład #(apply + %)jest o jeden bajt krótszy niż #(reduce + %).

NikoNyrh
źródło
1

Unikaj let, jeśli już masz

Na przykład: #(for[a[(sort %)]...)zamiast #(let[a(sort %)](for ...)).

For ma również :letkonstrukcję, ale jest zbyt gadatliwy dla golfa kodu.

NikoNyrh
źródło
1

Użyj +i -zamiast incidec

To oszczędza 1 bajt, jeśli używasz inc/ decna wyrażenie z parens:

(inc(first[1 3 5]))
(+(first[1 3 5])1)
clismique
źródło
1

ifPodczas testowania równości używaj map zamiast 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
bfontaina
źródło
1

Powiąż długie nazwy funkcji w let z jednobajtowym symbolem

Na przykład, jeśli chcesz użyć partitionlub frequencieswiele razy, warto powiązać je z jednobajtowym symbolem w letmakrze. Z drugiej strony może nie być tego warte, jeśli nie potrzebujesz letinaczej, a nazwa funkcji jest stosunkowo krótka.

NikoNyrh
źródło
0

Użyj zamiast zamiast mapy

Na przykład #(for[i %](Math/abs i))jest znacznie krótszy niż mapekwiwalent.

NikoNyrh
źródło