7

Clojure を学ぶための最初の試みとして、Clojure を使って Project Euler を始めました。最初の課題を解決しました:

1000 未満の 3 または 5 の倍数の合計を求めます。

以前にPythonで解決しました:

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

これは私の最初の Clojure の試みです:

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

私はそれがどれほど冗長になったかについて実際に驚いていますが、それは私のスタイルとClojureイディオムの無知のせいだと確信しています.

この Clojure コードの慣用的なバージョンはどのようになりますか?

4

3 に答える 3

9

ちょうど別のバージョン:

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

(+ (sum-of 3) (sum-of 5) (- (sum-of 15)))
于 2013-03-14T17:05:43.197 に答える
9

これが私がやった方法です:

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

私のソリューションを少し慣用的にしているのは、無名関数リーダー マクロの使用です#(...)zero? fn

あなたのソリューションは異なりますが、同じくらい良いです!

ところで、オイラー問題を解くことは、新しい言語を学ぶ素晴らしい方法です。本からすべてを得ることはできません。

編集:

私はあなたのPythonバージョンとよりインラインで別のソリューションを提供することに決めました(あまりきれいなIMOではありません)

(apply +
  (for [i (range 1000) :when (or (zero? (mod i 3))
                                 (zero? (mod i 5)))]
    i))
于 2013-03-14T16:58:13.980 に答える
0

Project Eulerの一般的な解決策を解こうとするのが好きなので、これが私の一般的な解決策です。

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

次に、次のように呼び出します。

(sum-multiples [3 5] 1000)
于 2013-03-15T21:46:14.193 に答える