Tips untuk bermain golf di Clojure

16

Apa tips Anda untuk bermain golf kode menggunakan Clojure?

Tujuan dari pertanyaan ini adalah untuk mengumpulkan daftar teknik yang khusus untuk Clojure dan dapat digunakan dalam masalah golf kode umum.

mikera
sumber
Hmm .. bukankah posting semacam ini harus dalam meta (memang saya tidak yakin meta ada 5+ tahun yang lalu)
Albert Renshaw

Jawaban:

6

Gunakan sintaks pembaca untuk lambdas.
Jadi gunakan

#(+ % %2 %3)

dari pada

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

Anda juga dapat menghilangkan spasi putih beberapa waktu:

#(if (< % 0) (- %) %)
#(if(< % 0)(- %)%)
pengguna2429260
sumber
omong-omong #(+ % %2 %3)setara dengan +.
bfontaine
4

Di mana Anda dapat menghapus spasi putih:

  • Antara string dan apa pun:

    (println(+"Hello, World!"1))
    
  • Antara kurung dan yang lainnya:

    (for[x(range 5)](* x x))
    
  • Antara angka dan segala sesuatu selain bawaan atau nama variabel:

    Allowed:
    (+ 1"Example")
    (map{1"-1"2"-2"}[1 2 3])
    
    Not allowed:
    (+1 2)
    
  • Antara @(referensi untuk atom) dan tanda kurung.

clismique
sumber
Juga di depan pembaca makro deref@
ASCII
1
Juga kadang-kadang Anda mungkin dapat mengatur kembali barang-barang di letdan menyingkirkan beberapa ruang.
NikoNyrh
Juga sebelum parameter dalam fungsi anonim: #(+ 1(first%))=#(+ 1 (first %))
bfontaine
3

String dapat diperlakukan sebagai urutan karakter

mis. untuk mengurutkan karakter dalam string berdasarkan abjad:

(sort "hello")
=> (\e \h \l \l \o)
mikera
sumber
1
Strings secara definisi merupakan urutan karakter di hampir setiap bahasa, tetapi Anda tidak dapat menerapkan trik ini di semuanya :-)
mellamokb
3
Atau lebih tepatnya, "urutan" memiliki arti khusus dalam Clojure daripada berarti Anda dapat menerapkan trik tambahan: :-)
mikera
2

Gunakan nth ... 0sebagai gantifirst

Untuk mendapatkan elemen pertama koleksi, menggunakan (nth ... 0)lebih dari firstsatu byte:

(first[2 3 4]): 14 bytes
(nth[2 3 4]0): 13 bytes (saves a byte!)
clismique
sumber
Hal yang sama berlaku untuk second(2 byte)
Uriel
1
Anda juga dapat menggunakan vektor sebagai fungsi, sehingga ([2 3 4]1)mengembalikan elemen pada indeks 1. Ini harus bermanfaat jika misalnya format input fleksibel.
NikoNyrh
1

Gunakan terapkan alih-alih mengurangi

Misalnya #(apply + %)satu byte lebih pendek dari #(reduce + %).

NikoNyrh
sumber
1

Hindari biarkan jika Anda sudah punya untuk

Misalnya: #(for[a[(sort %)]...)bukannya #(let[a(sort %)](for ...)).

Untuk memang memiliki :letkonstruksi tetapi terlalu bertele-tele untuk kode golf.

NikoNyrh
sumber
1

Gunakan +dan -bukannya incdandec

Ini menghemat 1 byte jika Anda menggunakan inc/ decpada ekspresi dengan parens:

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

Gunakan peta sebagai ganti ifsaat menguji kesetaraan

;; 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
bfontaine
sumber
1

Bind nama-nama fungsi panjang di biarkan ke simbol byte tunggal

Sebagai contoh jika Anda perlu menggunakan partitionatau frequenciesbeberapa kali, itu bisa bermanfaat untuk mengikatnya ke simbol byte tunggal di letmakro. Kemudian lagi mungkin tidak layak jika Anda tidak membutuhkan yang letsebaliknya, dan nama fungsinya relatif singkat.

NikoNyrh
sumber
0

Gunakan sebagai ganti peta

Misalnya #(for[i %](Math/abs i))jauh lebih pendek dari yang biasa map.

NikoNyrh
sumber