aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Wardhaugh <twardhaugh@cap-rx.com>2021-10-06 07:51:00 -0700
committerTyler Wardhaugh <twardhaugh@cap-rx.com>2021-10-06 07:51:00 -0700
commitae07cd04f89371e88ca57ca997be8016d74959bd (patch)
treefc08f9aa82291c66fdd7d0b6f2d535d8164b5c9f
parentc138ad6152c0ee9f2a456b586e5ea73605566c46 (diff)
downloadperlweeklychallenge-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.clj32
-rw-r--r--challenge-133/tyler-wardhaugh/clojure/test/tw/weekly/c133/t2_test.clj15
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)))))