0

シーケンスを取る関数と、シーケンス内の要素に作用するいくつかの関数を定義する必要があります。重複する関数値を持つ要素が削除された古いシーケンスからシーケンスを返します。

(defn dedup [seq & functions] ...)

たとえば、

(f1 1) = 'a'
(f1 2) = 'a'
(f1 3) = 'c'
(f1 4) = 'd'

(f2 1) = 'za'
(f2 2) = 'zb'
(f2 3) = 'zc'
(f2 4) = 'zb'

それから

(dedup [1 2 3 4] f1 f2) 

(1 3)のシーケンスを返します

どうすればいいのですか?

編集:誤解を生まないようにテスト値を編集しました

編集:以下は、1つの関数のみの場合の(それほど機能的ではない)実装です

(defn dedup [seq f]
  (loop [values #{} seq1 seq seq2 '()]
    (let [s (first seq1)]
      (if (nil? s)
        (reverse seq2)
        (let [v (f s)]
          (if (contains? values v)
            (recur values (rest seq1) seq2)
            (recur (conj values v) (rest seq1) (conj seq2 s))))))))
4

1 に答える 1

3

あなたの例はテキストと矛盾しているようです-2つの関数が一致する値を返しています。

(defn dedup [seq & fns]
  (for [s seq :when (apply = (map #(% s) fns))] s))

(dedup [1 2 3 4] 
  #(case % 1 "a" 2 "a" 3 "c" 4 "d") 
  #(case % 1 "a" 2 "b" 3 "c" 4 "b"))
(1 3)

ちょっとコンパクトすぎるかな。 #(... % ...) は同等で(fn [x] (... x ...))あり、mapindupは関数を実行し、それらすべてをシーケンス内の同じ値に適用します。

でテストすることもできます

(dedup [1 2 3 4] {1 "a" 2 "a" 3 "c" 4 "d"} {1 "a" 2 "b" 3 "c" 4 "b"})
(1 3)

psおそらく混乱は英語の意味にあると思います。「重複」とは、値が繰り返されることを意味します。したがって、「a」「a」は「a」の重複です。あなたが意味したのは「複数」だと思います-複数の(異なる)値を取得するエントリを削除したいと思います。

pps も使用できますfilter:

(defn dedup [seq & fns] 
  (filter #(apply = (map (fn [f] (f %)) fns)) seq))

ネストできないため、1 つの匿名関数を明示的に記述する必要がありました#(...)

于 2012-06-07T11:47:47.927 に答える