aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-107/tyler-wardhaugh/clojure/deps.edn3
-rw-r--r--challenge-107/tyler-wardhaugh/clojure/pom.xml5
-rw-r--r--challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/core.clj12
-rw-r--r--challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/t1.clj33
-rw-r--r--challenge-107/tyler-wardhaugh/clojure/src/tw/weekly/c107/t2.clj21
-rw-r--r--challenge-107/tyler-wardhaugh/clojure/test/tw/weekly/c107_test.clj14
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")))))