2012-10-09 34 views
8
(def tmp = [ 1 2 3 9 4 8]) 

Tôi đang cố gắng tạo các cặp 2, sau đó cho mỗi cặp, trừ số thứ hai khỏi số đầu tiên. kết quả mong muốn: (1 6 4)bản đồ clojure theo thứ tự các cặp

Dưới đây là những gì tôi đã cố gắng:

(map #(apply - %2 %1) (partition 2 tmp)) 

làm thế nào tôi có thể làm điều này?

+0

Từ ví dụ, có vẻ như bạn trừ số * đầu tiên * từ * giây *, không phải theo cách khác xung quanh, phải không? –

Trả lời

10

Phân vùng tạo chuỗi các chuỗi để chức năng bạn ánh xạ trên chúng cần phải mong đợi một chuỗi gồm hai mục. Có một số cách để diễn tả điều này:

(def tmp [ 1 2 3 9 4 8]) 

user> (map #(- (second %) (first %)) (partition-all 2 tmp)) 
(1 6 4) 

user> (map #(apply - (reverse %)) (partition-all 2 tmp)) 
(1 6 4) 

user> (map (fn [[small large]] (- large small)) (partition-all 2 tmp)) 
(1 6 4) 

Phiên bản sử dụng áp dụng là khác nhau bởi vì nó sẽ vẫn "làm việc" trên danh sách dài lẻ:

user> (map #(apply - (reverse %)) (partition-all 2 [1 2 3 4 5 6 7])) 
(1 1 1 -7) 

Những người khác sẽ sụp đổ vào đầu vào không hợp lệ, mà bạn có thể thích.

+0

+1 trên giải pháp sử dụng destructuring – noahlz

2

Dưới đây là một giải pháp sử dụng reduce

(reduce #(conj %1 (apply - (reverse %2))) [] (partition-all 2 [1 2 3 9 4 8])) 
=> [1 6 4] 
+1

(giảm (conj ...)) ia một cách tuyệt vời để thể hiện một phiên bản không lười biếng của bản đồ. Hãy xem thư viện bộ giảm tốc mới để biết thêm về chủ đề này: http://clojure.com/blog/2012/05/08/reducers-a-library-and-model-for-collection-processing.html nếu bạn là quan tâm –

0

Tôi tự hỏi tại sao giải pháp này đã được bỏ qua ...

Kể từ khi chuyển đổi thứ tự của phép trừ đơn giản là tiêu cực của phép trừ gốc, (ab = - (ba)), giải pháp trở nên hiệu quả hơn (chỉ trong trường hợp đặc biệt này !!)

(map #(- (apply - %)) (partition-all 2 [1 2 3 9 4 8])) 

sư phạm, giải pháp Arthur là chính xác. Đây chỉ là một giải pháp phù hợp hơn với câu hỏi cụ thể.

Các vấn đề liên quan