Clojure'da golf için ipuçları


16

Clojure kullanarak kod golfü için ipuçlarınız nelerdir?

Bu sorunun amacı Clojure'a özgü olan ve genel kod golf problemlerinde kullanılabilecek tekniklerin bir listesini toplamaktır.


Hmm .. bu tür yayınlar metada olmamalıdır (meta 5+ yıl önce var olduğundan emin değilim)
Albert Renshaw

Yanıtlar:


6

Lambdas için okuyucu sözdizimini kullanın.
Öyleyse kullan

#(+ % %2 %3)

onun yerine

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

Ayrıca boşlukları da zaman zaman kaldırabilirsiniz:

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

bu arada #(+ % %2 %3)eşdeğerdir +.
bfontaine

4

Boşluğu nereden kaldırabilirsiniz:

  • Bir dize ve başka bir şey arasında:

    (println(+"Hello, World!"1))
    
  • Parantezler ve başka herhangi bir şey arasında:

    (for[x(range 5)](* x x))
    
  • Bir sayı ile yerleşik veya değişken adları dışındaki her şey arasında:

    Allowed:
    (+ 1"Example")
    (map{1"-1"2"-2"}[1 2 3])
    
    Not allowed:
    (+1 2)
    
  • Arasında @(atomlar için dereference) ve parantez.


Ayrıca deref okuyucu makrosundan önce@
sadece ASCII sadece

1
Ayrıca bazen bir şeyleri yeniden düzenleyebilir letve bazı alanlardan kurtulabilirsiniz.
NikoNyrh

Ayrıca anonim fonksiyonlarda parametrelerden önce: #(+ 1(first%))=#(+ 1 (first %))
bfontaine

3

Dizeler bir dizi karakter olarak ele alınabilir

örneğin bir dizgideki karakterleri alfabetik olarak sıralamak için:

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

1
Dizeler tanımı gereği neredeyse her dilde bir dizi karakterdir, ancak bu hileyi hepsinde uygulayamazsınız :-)
mellamokb

3
Daha doğrusu, "dizi"
Clojure'da

2

Yerine nth ... 0kullanınfirst

Bir koleksiyonun ilk öğesini almak için (nth ... 0)over kullanarak firstbir bayt kaydeder:

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

Aynı şey second(2 bayt) için
Uriel

1
Ayrıca vektörleri fonksiyon olarak kullanabilirsiniz, bu nedenle ([2 3 4]1)elemanı indeks 1'e döndürür. Örneğin, giriş formatı esnekse bu yararlı olacaktır.
NikoNyrh

1

Azaltmak yerine uygulamak kullanın

Örneğin #(apply + %), bir bayt daha kısadır #(reduce + %).


1

Zaten bir için varsa izin vermeyin

Örneğin: #(for[a[(sort %)]...)yerine #(let[a(sort %)](for ...)).

Çünkü bir :letyapı var ama kod golf için çok ayrıntılı.


1

Kullanın +ve -yerine incvedec

Parensli bir ifade kullanıyorsanız inc/ decüzerinde 1 bayt tasarruf sağlar :

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

1

ifEşitliği test ederken s yerine haritalar kullanın

;; 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

Uzun işlev adlarını tek baytlık bir simgeye bağla

Örneğin partitionveya frequenciesbirden çok kez kullanmanız gerekiyorsa , bunları bir makrodaki tek baytlık bir sembole bağlamak faydalı olabilir let. Daha sonra, letaksi takdirde ihtiyacınız yoksa ve işlev adı nispeten kısasa buna değmeyebilir.


0

Harita yerine kullan

Örneğin #(for[i %](Math/abs i)), mapeşdeğerden çok daha kısadır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.