2013-03-14 5 views
7

मैंने क्लोजर का उपयोग करके प्रोजेक्ट यूलर को क्लोजर सीखने के पहले स्टैब के रूप में शुरू करना शुरू कर दिया है।क्या यह बेवकूफ क्लोजर है?

नीचे 1000.

3 के सभी गुणकों का योग या 5 का पता लगाएं कि मैंने पहले अजगर में इसका समाधान कर लिया:

sum(i for i in xrange(1000) if i%3==0 or i%5==0) 

मैं पहला काम समाधान कर लिया है यह मेरा पहला क्लोजर प्रयास है:

(reduce + 
    (filter 
    (fn [x] 
     (or 
     (= 0 (mod x 3)) 
     (= 0 (mod x 5)))) 
    (range 1000))) 

मुझे वास्तव में यह पता चला है कि यह वर्बोज़ कैसे मिला, लेकिन मैं मुझे यकीन है कि यह मेरी शैली और क्लोजर मुहावरे की अज्ञानता के कारण है।

इस क्लोजर कोड का एक बेवकूफ संस्करण कैसा दिखता है?

उत्तर

8

इस तरह मैंने किया:

(apply + 
    (filter #(or (zero? (mod % 3)) 
       (zero? (mod % 5))) 
    (range 1000))) 

क्या मेरी समाधान थोड़ा अधिक मुहावरेदार बनाता है गुमनाम समारोह पाठक मैक्रो, #(...) के उपयोग और zero?fn

आपका समाधान है अलग लेकिन अच्छा के रूप में!

बीटीडब्ल्यू - एक नई भाषा सीखने का एक शानदार तरीका है - आप किसी पुस्तक से सब कुछ नहीं प्राप्त कर सकते हैं।

संपादित करें:

मैं (बहुत सुंदर नहीं IMO)

(apply + 
    (for [i (range 1000) :when (or (zero? (mod i 3)) 
           (zero? (mod i 5)))] 
    i)) 
+0

बहुत बहुत शुक्रिया, कि यह काफ़ी को साफ! लागू बनाम कम करने का उपयोग करने का लाभ यहां क्या होगा? – gumuz

+1

'+ 'में परिवर्तनीय धैर्य है इसलिए यह हमें कई बार' +' निष्पादित करने से रोकती है। हकीकत में, यह 'कमी' का उपयोग करने के बराबर है क्योंकि एक बार बहस सूची 2 से अधिक हो जाने पर '+' 'कमी 'का उपयोग करती है (' + 'के स्रोत देखें)। इस उदाहरण में, यह वास्तव में मेरी शैली किसी और चीज़ से अधिक है। – Kyle

+0

फिर से धन्यवाद, क्या कुछ स्टाइल गाइड है जो उदाहरण के लिए, आपके द्वारा या तर्कों को गठबंधन करने के तरीके की वकालत करता है? – gumuz

8

अपने अजगर संस्करण के साथ एक अलग समाधान अधिक इनलाइन प्रदान करने का निर्णय लिया बस एक और संस्करण:

(defn sum-of [n] 
    (reduce + (range n 1000 n))) 

(+ (sum-of 3) (sum-of 5) (- (sum-of 15))) 
+1

प्यारा।इसके अलावा '(कम + (विशिष्ट (कॉन्सट (रेंज 3 1000 3) (रेंज 5 1000 5))) – ToBeReplaced

0

मैं प्रोजेक्ट यूलर के लिए एक सामान्य समाधान को हल करने की कोशिश करने की तरह, तो यहां मेरा सामान्य समाधान है:

(defn sum-multiples [nums lim] 
    (reduce 
    + 
    (filter 
    (fn [x] 
     (some identity 
      (map #(zero? (mod x %)) nums))) 
    (range lim)))) 

और फिर बस फोन:

(sum-multiples [3 5] 1000) 
संबंधित मुद्दे