Lời khuyên cho việc chơi golf ở Clojure


16

Lời khuyên của bạn để chơi golf mã bằng Clojure là gì?

Mục đích của câu hỏi này là thu thập một danh sách các kỹ thuật dành riêng cho Clojure và có thể được sử dụng trong các bài toán đánh gôn nói chung.


Hmm .. không nên các loại bài đăng này nằm trong meta (được cho là tôi không chắc meta đã tồn tại hơn 5 năm trước)
Albert Renshaw

Câu trả lời:


6

Sử dụng cú pháp đọc cho lambdas.
Vì vậy, sử dụng

#(+ % %2 %3)

thay vì

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

Bạn cũng có thể loại bỏ khoảng trắng một số thời gian:

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

nhân tiện #(+ % %2 %3)là tương đương với +.
bfontaine

4

Nơi bạn có thể xóa khoảng trắng:

  • Giữa một chuỗi và bất cứ điều gì khác:

    (println(+"Hello, World!"1))
    
  • Giữa dấu ngoặc và bất cứ thứ gì khác:

    (for[x(range 5)](* x x))
    
  • Giữa một số và mọi thứ khác với nội dung hoặc tên biến:

    Allowed:
    (+ 1"Example")
    (map{1"-1"2"-2"}[1 2 3])
    
    Not allowed:
    (+1 2)
    
  • Giữa @(sự bổ nhiệm cho các nguyên tử) và dấu ngoặc.


Ngoài ra, trước macro macro của trình đọc deref@
ASCII - chỉ

1
Cũng có lúc bạn có thể sắp xếp lại đồ đạc tại một nơi letvà thoát khỏi một số không gian.
NikoNyrh

Ngoài ra trước các tham số trong các hàm ẩn danh: #(+ 1(first%))=#(+ 1 (first %))
bfontaine

3

Chuỗi có thể được coi là một chuỗi ký tự

ví dụ: để sắp xếp các ký tự trong một chuỗi theo thứ tự abc:

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

1
Các chuỗi theo định nghĩa là một chuỗi ký tự trong hầu hết mọi ngôn ngữ, nhưng bạn không thể áp dụng thủ thuật này trong tất cả các ngôn ngữ đó :-)
mellamokb

3
Hay đúng hơn, "chuỗi" có ý nghĩa đặc biệt trong Clojure hơn có nghĩa là bạn có thể áp dụng các thủ thuật bổ sung :-)
mikera

2

Sử dụng nth ... 0thay vìfirst

Để có được phần tử đầu tiên của bộ sưu tập, sử dụng (nth ... 0)trên sẽ firsttiết kiệm một byte:

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

tương tự với second(2 byte)
Uriel

1
Ngoài ra, bạn có thể sử dụng vectơ làm hàm, vì vậy ([2 3 4]1)trả về phần tử ở chỉ mục 1. Điều này sẽ có ích nếu ví dụ định dạng đầu vào là linh hoạt.
NikoNyrh

1

Sử dụng áp dụng thay vì giảm

Ví dụ #(apply + %)ngắn hơn một byte #(reduce + %).


1

Tránh để nếu bạn đã có

Ví dụ: #(for[a[(sort %)]...)thay vì #(let[a(sort %)](for ...)).

Vì cũng có một :letcấu trúc nhưng nó quá dài dòng cho mã golf.


1

Sử dụng +-thay vì incdec

Điều này sẽ tiết kiệm 1 byte nếu bạn đang sử dụng inc/ dectrên một biểu thức có parens:

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

1

Sử dụng bản đồ thay vì ifs khi kiểm tra sự bằng nhau

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

Ràng buộc các tên hàm dài tại ký hiệu byte đơn

Ví dụ, nếu bạn cần sử dụng partitionhoặc frequenciesnhiều lần, có thể có ích khi liên kết chúng với một ký hiệu một byte trong một letmacro. Sau đó, một lần nữa nó có thể không có giá trị nếu bạn không cần letkhác, và tên hàm tương đối ngắn.


0

Sử dụng thay cho bản đồ

Ví dụ, #(for[i %](Math/abs i))ngắn hơn rất nhiều so với mapđẳng thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.