diff options
| author | Tyler Wardhaugh <tyler.wardhaugh@gmail.com> | 2021-02-08 17:12:35 -0800 |
|---|---|---|
| committer | Tyler Wardhaugh <tyler.wardhaugh@gmail.com> | 2021-02-10 17:20:03 -0800 |
| commit | 49cab280781c426e997c691635fce821977d8439 (patch) | |
| tree | b948f90f44c4631b832b3663596876c1f4f55f72 | |
| parent | 7568a1ee0849d3c8bf5fb5bcc9351b3fff3ac2cd (diff) | |
| download | perlweeklychallenge-club-49cab280781c426e997c691635fce821977d8439.tar.gz perlweeklychallenge-club-49cab280781c426e997c691635fce821977d8439.tar.bz2 perlweeklychallenge-club-49cab280781c426e997c691635fce821977d8439.zip | |
Ch99 (Clojure): Tasks 1 & 2
6 files changed, 103 insertions, 1 deletions
diff --git a/challenge-099/tyler-wardhaugh/clojure/deps.edn b/challenge-099/tyler-wardhaugh/clojure/deps.edn index 5af0265ab3..4234dbc188 100644 --- a/challenge-099/tyler-wardhaugh/clojure/deps.edn +++ b/challenge-099/tyler-wardhaugh/clojure/deps.edn @@ -1,5 +1,6 @@ {:paths ["src" "resources"] - :deps {org.clojure/clojure {:mvn/version "1.10.1"}} + :deps {org.clojure/clojure {:mvn/version "1.10.1"} + net.mikera/core.matrix {:mvn/version "0.62.0"}} :aliases {:test {:extra-paths ["test"] :extra-deps {org.clojure/test.check {:mvn/version "1.0.0"}}} diff --git a/challenge-099/tyler-wardhaugh/clojure/pom.xml b/challenge-099/tyler-wardhaugh/clojure/pom.xml index b59b0262a4..aafdb47364 100644 --- a/challenge-099/tyler-wardhaugh/clojure/pom.xml +++ b/challenge-099/tyler-wardhaugh/clojure/pom.xml @@ -30,6 +30,11 @@ <artifactId>clojure</artifactId> <version>1.10.1</version> </dependency> + <dependency> + <groupId>net.mikera</groupId> + <artifactId>core.matrix</artifactId> + <version>0.62.0</version> + </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> diff --git a/challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/core.clj b/challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/core.clj new file mode 100644 index 0000000000..6dddb00c0b --- /dev/null +++ b/challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/core.clj @@ -0,0 +1,12 @@ +(ns tw.weekly.c99.core + (:require [tw.weekly.c99.t1 :as t1]) + (:require [tw.weekly.c99.t2 :as t2]) + (:gen-class)) + +(defn -main + "Run all tasks" + [& _] + (println "Task #1:") + (t1/-main) + (println "\nTask #2:") + (t2/-main)) diff --git a/challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/t1.clj b/challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/t1.clj new file mode 100644 index 0000000000..c00e69c46f --- /dev/null +++ b/challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/t1.clj @@ -0,0 +1,24 @@ +(ns tw.weekly.c99.t1 + (:import (java.nio.file FileSystems Paths)) + (:require [clojure.edn :as edn])) + +;;; +; Task description for TASK #1 › Pattern Match +;;; + +(def DEFAULT-INPUT ["abcde" "a*e"]) +(def FILESYSTEM (FileSystems/getDefault)) + +(defn pattern-match + "Determine if string s matches the given (glob) pattern." + [s pattern] + (let [matcher (.getPathMatcher FILESYSTEM (str "glob:" pattern)) + s-path (Paths/get s (into-array String ""))] + (.matches matcher s-path))) + +(defn -main + "Run Task 1 using a string S and a pattern P, defaulting to the example + given in the task description." + [& args] + (let [[S P] (or (some->> args (take 2) (map edn/read-string)) DEFAULT-INPUT)] + (println (if (pattern-match S P) 1 0)))) diff --git a/challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/t2.clj b/challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/t2.clj new file mode 100644 index 0000000000..3f8e6888db --- /dev/null +++ b/challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/t2.clj @@ -0,0 +1,44 @@ +(ns tw.weekly.c99.t2 + (:require [clojure.edn :as edn] + [clojure.core.matrix :as m])) + +;;; +; Task description for TASK #2 › Unique Subsequence +;;; + +(def DEFAULT-INPUT ["littleit" "lit"]) + +(defn- uniq-subseq-dp + "Use a dynamic programming algorithm to solve unique subsequences. + Source: https://www.geeksforgeeks.org/count-distinct-occurrences-as-a-subsequence/" + [s t m n] + (let [m+1 (inc m) + n+1 (inc n) + dp (m/mutable (m/zero-matrix :ndarray m+1 n+1))] + (m/set-column! dp 0 (repeat m+1 0)) + (m/set-row! dp 0 (repeat n+1 1)) + (dorun (for [i (range 1 m+1) + j (range 1 n+1)] + (let [schar (nth s (dec j)) + tchar (nth t (dec i))] + (if (not= schar tchar) + (m/mset! dp i j (m/mget dp i (dec j))) + (m/mset! dp i j (+ (m/mget dp i (dec j)) + (m/mget dp (dec i) (dec j)))))))) + (m/mget dp m n))) + +(defn unique-subsequences + "Count the unique subsequences of string t in string s" + [s t] + (let [m (count t) + n (count s)] + (if (> m n) + 0 + (uniq-subseq-dp s t m n)))) + +(defn -main + "Run Task 2 using a sorted sequence of integers NS and a target N, + defaulting to the example given in the task description." + [& args] + (let [[S T] (or (some->> args (take 2) (map edn/read-string)) DEFAULT-INPUT)] + (println (unique-subsequences S T)))) diff --git a/challenge-099/tyler-wardhaugh/clojure/test/tw/weekly/c99_test.clj b/challenge-099/tyler-wardhaugh/clojure/test/tw/weekly/c99_test.clj new file mode 100644 index 0000000000..4ef774679c --- /dev/null +++ b/challenge-099/tyler-wardhaugh/clojure/test/tw/weekly/c99_test.clj @@ -0,0 +1,16 @@ +(ns tw.weekly.c99-test + (:require [clojure.test :refer [deftest is testing]] + [tw.weekly.c99.t1 :refer [pattern-match]] + [tw.weekly.c99.t2 :refer [unique-subsequences]])) + +(deftest task-1 + (testing "Task 1, Pattern Match" + (is (true? (pattern-match "abcde" "a*e"))) + (is (false? (pattern-match "abcde" "a*d"))) + (is (false? (pattern-match "abcde" "?b*d"))) + (is (true? (pattern-match "abcde" "a*c?e"))))) + +(deftest task-2 + (testing "Task 2, Unique Subsequences" + (is (= 5 (unique-subsequences "littleit" "lit"))) + (is (= 3 (unique-subsequences "london" "lon"))))) |
