diff options
6 files changed, 81 insertions, 7 deletions
diff --git a/challenge-107/tyler-wardhaugh/clojure/deps.edn b/challenge-107/tyler-wardhaugh/clojure/deps.edn index 8b94f9a032..a781a94ba4 100644 --- a/challenge-107/tyler-wardhaugh/clojure/deps.edn +++ b/challenge-107/tyler-wardhaugh/clojure/deps.edn @@ -1,6 +1,5 @@ {:paths ["src" "resources"] - :deps {org.clojure/clojure {:mvn/version "1.10.1"} - org.clojure/math.numeric-tower {:mvn/version "0.0.4"}} + :deps {org.clojure/clojure {:mvn/version "1.10.1"}} :aliases {:test {:extra-paths ["test"] :extra-deps {org.clojure/test.check {:mvn/version "1.0.0"}}} diff --git a/challenge-107/tyler-wardhaugh/clojure/pom.xml b/challenge-107/tyler-wardhaugh/clojure/pom.xml index ba1826c36c..b6737dd838 100644 --- a/challenge-107/tyler-wardhaugh/clojure/pom.xml +++ b/challenge-107/tyler-wardhaugh/clojure/pom.xml @@ -30,11 +30,6 @@ <artifactId>clojure</artifactId> <version>1.10.1</version> </dependency> - <dependency> - <groupId>org.clojure</groupId> - <artifactId>math.numeric-tower</artifactId> - <version>0.0.4</version> - </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> diff --git a/challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/core.clj b/challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/core.clj new file mode 100644 index 0000000000..9f4c65116f --- /dev/null +++ b/challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/core.clj @@ -0,0 +1,12 @@ +(ns tw.weekly.c107.core + (:require [tw.weekly.c107.t1 :as t1]) + (:require [tw.weekly.c107.t2 :as t2]) + (:gen-class)) + +(defn -main + "Run all tasks" + [& _] + (println "Task #1:") + (t1/-main) + (println "\nTask #2:") + (t2/-main)) diff --git a/challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/t1.clj b/challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/t1.clj new file mode 100644 index 0000000000..ee75347ab8 --- /dev/null +++ b/challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/t1.clj @@ -0,0 +1,33 @@ +(ns tw.weekly.c107.t1 + (:require [clojure.edn :as edn] + [clojure.pprint :refer [cl-format]])) + +;;; +; Task description for TASK #1 › Self-descriptive Numbers +;;; +(def DEFAULT-INPUT 3) +(def FIRST-SDN 1210) + +(defn self-descriptive? + "Test whether n is a self-descriptive number" + [n] + (let [nstr (str n) + freq (frequencies nstr) + f (fn [[i v]] + (let [cnt (get freq (Character/forDigit i 10) 0)] + (= cnt (Character/digit v 10))))] + (every? f (map-indexed vector nstr)))) + +(defn generate-self-descriptives + "Generator for self-descriptive numbers" + [n] + (let [xf (comp (filter self-descriptive?) + (take n))] + (sequence xf (iterate (partial + 10) FIRST-SDN)))) + +(defn -main + "Run Task 1 with a given N, defaulting to the example given in the task + description." + [& args] + (let [N (or (some-> args first edn/read-string) DEFAULT-INPUT)] + (cl-format true "~{~a~^, ~}" (generate-self-descriptives N)))) diff --git a/challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/t2.clj b/challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/t2.clj new file mode 100644 index 0000000000..4753ce8054 --- /dev/null +++ b/challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/t2.clj @@ -0,0 +1,21 @@ +(ns tw.weekly.c107.t2 + (:require [clojure.reflect :refer [reflect]] + [clojure.pprint :refer [cl-format]])) + +;;; +; Task description for TASK #2 › List Methods +;;; +(def DEFAULT-INPUT "java.lang.Object") + +(defn list-methods + "Return a list of methods on classname" + [classname] + (let [source (->> (Class/forName classname) reflect :members) + xf (comp (filter :return-type) (map :name))] + (into #{} xf source))) + +(defn -main + "Run Task 2 with a given CLASSNAME, defaulting to a standard Java class" + [& args] + (let [CLASSNAME (or (some-> args first) DEFAULT-INPUT)] + (cl-format true "~{~a~%~}" (list-methods CLASSNAME)))) diff --git a/challenge-107/tyler-wardhaugh/clojure/test/tw/weekly/c107_test.clj b/challenge-107/tyler-wardhaugh/clojure/test/tw/weekly/c107_test.clj new file mode 100644 index 0000000000..5bd6990318 --- /dev/null +++ b/challenge-107/tyler-wardhaugh/clojure/test/tw/weekly/c107_test.clj @@ -0,0 +1,14 @@ +(ns tw.weekly.c107-test + (:require [clojure.test :refer [deftest is testing]] + [tw.weekly.c107.t1 :refer [generate-self-descriptives]] + [tw.weekly.c107.t2 :refer [list-methods]])) + +(deftest task-1 + (testing "Task 1, Self-descriptive Numbers" + (is (= [1210 2020 21200] (generate-self-descriptives 3))))) + +(deftest task-2 + (testing "Task 2, List Methods" + (is (= '#{notify finalize getClass toString equals hashCode + clone notifyAll wait} + (list-methods "java.lang.Object"))))) |
