aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Wardhaugh <tyler.wardhaugh@gmail.com>2021-02-08 17:12:35 -0800
committerTyler Wardhaugh <tyler.wardhaugh@gmail.com>2021-02-10 17:20:03 -0800
commit49cab280781c426e997c691635fce821977d8439 (patch)
treeb948f90f44c4631b832b3663596876c1f4f55f72
parent7568a1ee0849d3c8bf5fb5bcc9351b3fff3ac2cd (diff)
downloadperlweeklychallenge-club-49cab280781c426e997c691635fce821977d8439.tar.gz
perlweeklychallenge-club-49cab280781c426e997c691635fce821977d8439.tar.bz2
perlweeklychallenge-club-49cab280781c426e997c691635fce821977d8439.zip
Ch99 (Clojure): Tasks 1 & 2
-rw-r--r--challenge-099/tyler-wardhaugh/clojure/deps.edn3
-rw-r--r--challenge-099/tyler-wardhaugh/clojure/pom.xml5
-rw-r--r--challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/core.clj12
-rw-r--r--challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/t1.clj24
-rw-r--r--challenge-099/tyler-wardhaugh/clojure/src/tw/weekly/c99/t2.clj44
-rw-r--r--challenge-099/tyler-wardhaugh/clojure/test/tw/weekly/c99_test.clj16
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")))))