1. 如果我们要列出 10 以下且为 3 或 5 的倍数的所有自然数,我们将得到 3、5、6 和 9。这几个数的和是 23。我们的题目是求出 1,000 以下且为 3 或 5 的倍数的自然数的和。
;;定义函数
(defn divisible-by-3-or-5 [num] (or (== (mod num 3) 0)(== (mod num 5) 0)))
;;调用函数
(reduce + (filter divisible-by-3-or-5 (range 1000)))
=> 233168
;;100以内的3或者5的倍数的所有自然数之和
(reduce + (filter divisible-by-3-or-5 (range 100)))
=> 2318
2. 现在又一个矢量,矢量中有多个清单,每个清单有:month,:val,:s1,:s2四个键值,矢量为:
(def entries [{:month 1 :val 12 :s1 true :s2 false}
{:month 2 :val 3 :s1 false :s2 true}
{:month 3 :val 32 :s1 true :s2 false}
{:month 4 :val 18 :s1 true :s2 false}
{:month 5 :val 32 :s1 false :s2 true}
{:month 6 :val 62 :s1 false :s2 true}
{:month 7 :val 12 :s1 false :s2 true}
{:month 8 :val 142 :s1 true :s2 false}
{:month 9 :val 52 :s1 true :s2 false}
{:month 10 :val 18 :s1 true :s2 false}
{:month 11 :val 23 :s1 false :s2 true}
{:month 12 :val 56 :s1 false :s2 true}])
- 求出:s1为true的所有项 ?
(filter #(:s1 %) entries)
=>
({:month 1, :val 12, :s1 true, :s2 false}
{:month 3, :val 32, :s1 true, :s2 false}
{:month 4, :val 18, :s1 true, :s2 false}
{:month 8, :val 142, :s1 true, :s2 false}
{:month 9, :val 52, :s1 true, :s2 false}
{:month 10, :val 18, :s1 true, :s2 false})
- 求出:val大于30并且:s2为true的所有项?
(filter #(and (:s2 %) (> (:val %) 30)) entries)
=>
({:month 5, :val 32, :s1 false, :s2 true}
{:month 6, :val 62, :s1 false, :s2 true}
{:month 12, :val 56, :s1 false, :s2 true})
(:s2 %)是去除所有:s2为true的项,(:val %)是去除:val键对应的val,%表示匿名函数的参数,(> (:val %)30)是取出:val对应的值大于30。
(def entries1 [{:month 1 :val "hello" :s1 true :s2 false}
{:month 2 :val "nam" :s1 false :s2 true}
{:month 3 :val "cx" :s1 true :s2 false}
{:month 4 :val "cx" :s1 true :s2 false}
{:month 5 :val "cx" :s1 false :s2 true}
{:month 6 :val "cx" :s1 false :s2 true}
{:month 7 :val "nam" :s1 false :s2 true}
{:month 8 :val "nam" :s1 true :s2 false}
{:month 9 :val "hello" :s1 true :s2 false}
{:month 10 :val "hello" :s1 true :s2 false}
{:month 11 :val "font" :s1 false :s2 true}
{:month 12 :val "font" :s1 false :s2 true}])
- 取出:s2为true并且:val为”cx"的所有项?
(filter #(and (:s2 %) (= (:val %) "cx")) entries1)
=> ({:month 5, :val "cx", :s1 false, :s2 true}
{:month 6, :val "cx", :s1 false, :s2 true})
- 根据:val值对entries1进行分组?
;;分组函数
(defn grouped-by-keys
([data group-keys]
(->> data
(group-by (fn [m] (select-keys m group-keys)))
(reduce-kv (fn [m k v]
(assoc m k {:list
(mapv
(fn [e]
(apply dissoc e group-keys))
v)}))
{})
(mapv (fn [e] (apply merge e))))))
调用函数进行分组:
(grouped-by-keys entries1 [:val])
=>
[{:val "hello",
:list [{:month 1, :s1 true, :s2 false}
{:month 9, :s1 true, :s2 false}
{:month 10, :s1 true, :s2 false}]}
{:val "nam",
:list [{:month 2, :s1 false, :s2 true}
{:month 7, :s1 false, :s2 true}
{:month 8, :s1 true, :s2 false}]}
{:val "cx",
:list [{:month 3, :s1 true, :s2 false}
{:month 4, :s1 true, :s2 false}
{:month 5, :s1 false, :s2 true}
{:month 6, :s1 false, :s2 true}]}
{:val "font",
:list [{:month 11, :s1 false, :s2 true}
{:month 12, :s1 false, :s2 true}]}]