4
\$\begingroup\$

I'm learning Clojure and solved Project Euler #1, I'd like to have my code reviewed on all aspects and have one specific question. This is also my first Functional Programming language, I have however used some form of FP in Java and Python before.

Task: Multiples of 3 and 5

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

My solution

 (ns euler)
 (defn is-divisible-by?
 [x divisor]
 (zero? (mod x divisor)))
(->> (range 1000)
 (filter #(or (is-divisible-by? % 3) (is-divisible-by? % 5)))
 (reduce +)
 (println))

My additional question is whether the filter part can be written more succintly as I'm duplicating code right now while all I need to actually to is dos ome operation on 3 and 5.

asked Sep 24, 2016 at 17:17
\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

Good to extract the method is-divisible-by?. Ending with a question mark indicates a predicate, so is- prefix is not necessary. I think it is somewhat more readable if the divisor comes before the value, but that might be personal preference.

(defn divisible-by?
 [divisor x]
 (zero? (mod x divisor)))

Furthermore, if you provide a conditional in the fn to reduce you don't need a filter. It is debatable if it is more readable, but it is shorter and saves one walk over the collection I think (although I measure no difference in performance between the if-statement and the filter). Also there is no need for parentheses around println:

(->> (range 1000)
 (reduce #(if (or (divisible-by? 5 %2)
 (divisible-by? 3 %2))
 (+ %1 %2)
 %1))
 println) 

You can get inspired by other answers on the projecteuler thread for question 1.

answered Sep 24, 2016 at 19:13
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.