diff options
| author | Tyler Wardhaugh <twardhaugh@cap-rx.com> | 2021-10-06 07:51:00 -0700 |
|---|---|---|
| committer | Tyler Wardhaugh <twardhaugh@cap-rx.com> | 2021-10-06 07:51:00 -0700 |
| commit | ae07cd04f89371e88ca57ca997be8016d74959bd (patch) | |
| tree | fc08f9aa82291c66fdd7d0b6f2d535d8164b5c9f | |
| parent | c138ad6152c0ee9f2a456b586e5ea73605566c46 (diff) | |
| download | perlweeklychallenge-club-ae07cd04f89371e88ca57ca997be8016d74959bd.tar.gz perlweeklychallenge-club-ae07cd04f89371e88ca57ca997be8016d74959bd.tar.bz2 perlweeklychallenge-club-ae07cd04f89371e88ca57ca997be8016d74959bd.zip | |
Ch133 (Clojure): Task 2
| -rw-r--r-- | challenge-133/tyler-wardhaugh/clojure/src/tw/weekly/c133/t2.clj | 32 | ||||
| -rw-r--r-- | challenge-133/tyler-wardhaugh/clojure/test/tw/weekly/c133/t2_test.clj | 15 |
2 files changed, 43 insertions, 4 deletions
diff --git a/challenge-133/tyler-wardhaugh/clojure/src/tw/weekly/c133/t2.clj b/challenge-133/tyler-wardhaugh/clojure/src/tw/weekly/c133/t2.clj index ad200456c8..ed11beff5a 100644 --- a/challenge-133/tyler-wardhaugh/clojure/src/tw/weekly/c133/t2.clj +++ b/challenge-133/tyler-wardhaugh/clojure/src/tw/weekly/c133/t2.clj @@ -1,15 +1,39 @@ -(ns tw.weekly.c132.t2 - (:require [clojure.edn :as edn] - [clojure.pprint :refer [cl-format]])) +(ns tw.weekly.c133.t2 + (:require [clojure.edn :as edn])) ;;; ; Task description for TASK #2, Smith Numbers ;;; (def DEFAULT-INPUT [10]) +; based on source: https://rosettacode.org/wiki/Prime_decomposition#Clojure +(defn prime-factors + "Return a list of factors of n." + ([n] + (prime-factors n 2 (list))) + ([n k acc] + (cond + (= 1 n) acc + (zero? (rem n k)) (recur (quot n k) k (cons k acc)) + :else (recur n (inc k) acc)))) + +(defn sum-digits + "Sum the individual digits of n." + [n] + (transduce (map #(Character/getNumericValue %)) + (str n))) + +(defn smith? + "Returns true if n is a Smith Number." + [n] + (let [pfs (prime-factors n)] + (and (< 1 (count pfs)) + (= (sum-digits n) (transduce (map sum-digits) + pfs))))) + +(def smiths (->> (iterate inc 1) (filter smith?))) + (defn -main "Run Task 2 with a given input N, defaulting to the first example from the task description." [& args] (let [[N] (or (some->> args (map edn/read-string)) DEFAULT-INPUT)] - )) + (run! println (take N smiths)))) diff --git a/challenge-133/tyler-wardhaugh/clojure/test/tw/weekly/c133/t2_test.clj b/challenge-133/tyler-wardhaugh/clojure/test/tw/weekly/c133/t2_test.clj new file mode 100644 index 0000000000..424873cbea --- /dev/null +++ b/challenge-133/tyler-wardhaugh/clojure/test/tw/weekly/c133/t2_test.clj @@ -0,0 +1,15 @@ +(ns tw.weekly.c133.t2-test + (:require [clojure.test :refer [deftest is testing]] + [tw.weekly.c133.t2 :refer [smiths]])) + +; source: https://oeis.org/A006753/list +(def oeis-smith-numbers + [4,22,27,58,85,94,121,166,202,265,274,319,346,355, + 378,382,391,438,454,483,517,526,535,562,576,588, + 627,634,636,645,648,654,663,666,690,706,728,729, + 762,778,825,852,861,895,913,915,922,958,985,1086, + 1111,1165,1219]) + +(deftest first-10 + (testing "Verify the first 10 Smith Numbers" + (is (= (take 10 oeis-smith-numbers) (take 10 smiths))))) |
