aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Wardhaugh <tyler.wardhaugh@gmail.com>2021-02-16 15:50:35 -0800
committerTyler Wardhaugh <tyler.wardhaugh@gmail.com>2021-02-18 10:43:33 -0800
commitc07820d988ff3ea387cad72a2d46c3128e5abd88 (patch)
tree8bf30be97c2d5607215667e08643df8cc084d41d
parent32545e79e01e98dfe5bebffb7ed156e5cfe05be7 (diff)
downloadperlweeklychallenge-club-c07820d988ff3ea387cad72a2d46c3128e5abd88.tar.gz
perlweeklychallenge-club-c07820d988ff3ea387cad72a2d46c3128e5abd88.tar.bz2
perlweeklychallenge-club-c07820d988ff3ea387cad72a2d46c3128e5abd88.zip
Ch100 (Clojure): Tasks 1 & 2
-rw-r--r--challenge-100/tyler-wardhaugh/clojure/deps.edn2
-rw-r--r--challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/core.clj12
-rw-r--r--challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/t1.clj34
-rw-r--r--challenge-100/tyler-wardhaugh/clojure/src/tw/weekly/c100/t2.clj31
-rw-r--r--challenge-100/tyler-wardhaugh/clojure/test/tw/weekly/c100_test.clj15
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] ])))))