diff options
| author | Tyler Wardhaugh <tyler.wardhaugh@gmail.com> | 2021-02-16 15:50:35 -0800 |
|---|---|---|
| committer | Tyler Wardhaugh <tyler.wardhaugh@gmail.com> | 2021-02-18 10:43:33 -0800 |
| commit | c07820d988ff3ea387cad72a2d46c3128e5abd88 (patch) | |
| tree | 8bf30be97c2d5607215667e08643df8cc084d41d | |
| parent | 32545e79e01e98dfe5bebffb7ed156e5cfe05be7 (diff) | |
| download | perlweeklychallenge-club-c07820d988ff3ea387cad72a2d46c3128e5abd88.tar.gz perlweeklychallenge-club-c07820d988ff3ea387cad72a2d46c3128e5abd88.tar.bz2 perlweeklychallenge-club-c07820d988ff3ea387cad72a2d46c3128e5abd88.zip | |
Ch100 (Clojure): Tasks 1 & 2
5 files changed, 93 insertions, 1 deletions
diff --git a/challenge-100/tyler-wardhaugh/clojure/deps.edn b/challenge-100/tyler-wardhaugh/clojure/deps.edn index 156fa246c0..c245240206 100644 --- a/challenge-100/tyler-wardhaugh/clojure/deps.edn +++ b/challenge-100/tyler-wardhaugh/clojure/deps.edn @@ -1,6 +1,6 @@ {:paths ["src" "resources"] :deps {org.clojure/clojure {:mvn/version "1.10.1"} - net.mikera/core.matrix {:mvn/version "0.62.0"}} + clojure.java-time {:mvn/version "0.3.2"}} :aliases {:test {:extra-paths ["test"] :extra-deps {org.clojure/test.check {:mvn/version "1.0.0"}}} diff --git a/challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/core.clj b/challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/core.clj new file mode 100644 index 0000000000..55af76517a --- /dev/null +++ b/challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/core.clj @@ -0,0 +1,12 @@ +(ns tw.weekly.c100.core + (:require [tw.weekly.c100.t1 :as t1]) + (:require [tw.weekly.c100.t2 :as t2]) + (:gen-class)) + +(defn -main + "Run all tasks" + [& _] + (println "Task #1:") + (t1/-main) + (println "\nTask #2:") + (t2/-main)) diff --git a/challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/t1.clj b/challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/t1.clj new file mode 100644 index 0000000000..c25f398dce --- /dev/null +++ b/challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/t1.clj @@ -0,0 +1,34 @@ +(ns tw.weekly.c100.t1 + (:require [clojure.edn :as edn] + [clojure.string :as str] + [java-time :as j])) + +;;; +; Task description for TASK #1 › Fun Time +;;; + +(def DEFAULT-INPUT "05:15pm") + +(def FMT-12H "hh:mma") +(def FMT-24H "HH:mm") +(def TIME-MATCHER (re-pattern #"(?i)\s*(\d{1,2}:\d{1,2})\s*([ap]\.?m\.?)?\s*")) + +(defn fun-time + "Convert the given time in string s from 12 hour format to 24 hour format + and vice versa." + [s] + (let [[match hhmm ampm] (re-matches TIME-MATCHER s)] + (when match + (let [[parser timestr fmt] + (if ampm + [FMT-12H (str hhmm (str/upper-case ampm)) FMT-24H] + [FMT-24H hhmm FMT-12H]) + time (j/local-time parser timestr)] + (j/format fmt time))))) + +(defn -main + "Run Task 1 using a string T representing a 12h or 24h time, defaulting to the example + given in the task description." + [& args] + (let [T (or (some-> args first edn/read-string) DEFAULT-INPUT)] + (println (fun-time T)))) diff --git a/challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/t2.clj b/challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/t2.clj new file mode 100644 index 0000000000..dab8457589 --- /dev/null +++ b/challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/t2.clj @@ -0,0 +1,31 @@ +(ns tw.weekly.c100.t2 + (:require [clojure.edn :as edn])) + +;;; +; Task description for TASK #2 › Triangle Sum +;;; + +(def DEFAULT-INPUT [ [1], [2,4], [6,4,9], [5,1,7,2] ]) + +(defn min-row + "For a row of length n, generate n-1 numbers representing the pair of + each element in row with its right neighbor." + [coll] + (let [xf (map (partial reduce min)) + source (partition 2 1 coll)] + (sequence xf source))) + +(defn min-triangle-sum + "Find the mininum path sum for the triangle from top to bottom." + [t] + (let [f (fn [acc row] (map + (min-row acc) row))] + (->> (reverse t) + (reduce f) + first))) + +(defn -main + "Run Task 2 using a triangle T, defaulting to the example given in the + task description." + [& args] + (let [T (or (some-> args first edn/read-string) DEFAULT-INPUT)] + (println (min-triangle-sum T)))) diff --git a/challenge-100/tyler-wardhaugh/clojure/test/tw/weekly/c100_test.clj b/challenge-100/tyler-wardhaugh/clojure/test/tw/weekly/c100_test.clj new file mode 100644 index 0000000000..d9e5319d83 --- /dev/null +++ b/challenge-100/tyler-wardhaugh/clojure/test/tw/weekly/c100_test.clj @@ -0,0 +1,15 @@ +(ns tw.weekly.c100-test + (:require [clojure.test :refer [deftest is testing]] + [tw.weekly.c100.t1 :refer [fun-time]] + [tw.weekly.c100.t2 :refer [min-triangle-sum]])) + +(deftest task-1 + (testing "Task 1, Fun Time" + (is (= "17:15" (fun-time "05:15 pm"))) + (is (= "17:15" (fun-time "05:15pm"))) + (is (= "07:15PM" (fun-time "19:15"))))) + +(deftest task-2 + (testing "Task 2, Triangle Sum" + (is (= 8 (min-triangle-sum [ [1], [2,4], [6,4,9], [5,1,7,2] ]))) + (is (= 7 (min-triangle-sum [ [3], [3,1], [5,2,3], [4,3,1,3] ]))))) |
