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.


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)(- %)%)

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.


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)

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!)

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 + %).


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.


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)

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

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.


0

Gunakan sebagai ganti peta

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.