aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Wardhaugh <tyler.wardhaugh@gmail.com>2021-02-10 09:57:23 -0800
committerTyler Wardhaugh <tyler.wardhaugh@gmail.com>2021-02-12 09:31:25 -0800
commitdc48cb570de7841f7af41ba6e81ef64007c8059e (patch)
treedd2217c742345d56926d8f57be3bcf51a40f3dfb
parent49cab280781c426e997c691635fce821977d8439 (diff)
downloadperlweeklychallenge-club-dc48cb570de7841f7af41ba6e81ef64007c8059e.tar.gz
perlweeklychallenge-club-dc48cb570de7841f7af41ba6e81ef64007c8059e.tar.bz2
perlweeklychallenge-club-dc48cb570de7841f7af41ba6e81ef64007c8059e.zip
Ch99 (Python): Tasks 1 & 2
-rwxr-xr-xchallenge-099/tyler-wardhaugh/python/ch-1.py29
-rwxr-xr-xchallenge-099/tyler-wardhaugh/python/ch-2.py53
l---------challenge-099/tyler-wardhaugh/python/ch1.py1
l---------challenge-099/tyler-wardhaugh/python/ch2.py1
-rw-r--r--challenge-099/tyler-wardhaugh/python/requirements.txt1
-rwxr-xr-xchallenge-099/tyler-wardhaugh/python/test_ch1.py17
-rwxr-xr-xchallenge-099/tyler-wardhaugh/python/test_ch2.py15
7 files changed, 117 insertions, 0 deletions
diff --git a/challenge-099/tyler-wardhaugh/python/ch-1.py b/challenge-099/tyler-wardhaugh/python/ch-1.py
new file mode 100755
index 0000000000..99cab7c794
--- /dev/null
+++ b/challenge-099/tyler-wardhaugh/python/ch-1.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+"""Challenge 99, Task 1"""
+
+import sys
+from fnmatch import fnmatch
+
+
+DEFAULT_INPUT = ('abcde', 'a*e')
+
+
+def pattern_match(string, pattern):
+ """Return true if pattern p matches string s, according to glob rules."""
+ return fnmatch(string, pattern)
+
+
+def main(args=None):
+ """Run the task"""
+ if args is None:
+ args = sys.argv[1:]
+
+ s, p = args[0:1] if args else DEFAULT_INPUT
+ if pattern_match(s, p):
+ print(1)
+ else:
+ print(0)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/challenge-099/tyler-wardhaugh/python/ch-2.py b/challenge-099/tyler-wardhaugh/python/ch-2.py
new file mode 100755
index 0000000000..5bceca3c51
--- /dev/null
+++ b/challenge-099/tyler-wardhaugh/python/ch-2.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+"""Challenge 99, Task 2"""
+
+import sys
+import numpy as np
+
+
+DEFAULT_INPUT = ('littleit', 'lit')
+
+
+def unique_subsequences(s, t):
+ """Use a dynamic programming algorithm to solve unique subsequences.
+ Source: https://www.geeksforgeeks.org/count-distinct-occurrences-as-a-subsequence/"""
+
+ m = len(t)
+ n = len(s)
+
+ if m > n:
+ return 0
+
+ # NumPy is overkill for this use case, especially since we're not taking
+ # advantage of any high-performance array manipulations, but I wanted to
+ # show its use.
+ dp = np.zeros((m + 1, n + 1), dtype=int)
+ dp[0, :] = np.ones(n + 1)
+
+ with np.nditer(dp, flags=['multi_index'], order='C') as it:
+ while not it.finished:
+ i, j = it.multi_index
+ it.iternext()
+
+ if i == 0 or j == 0:
+ continue
+
+ if t[i - 1] != s[j - 1]:
+ dp[i][j] = dp[i][j - 1]
+ else:
+ dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1]
+
+ return dp[m][n]
+
+
+def main(args=None):
+ """Run the task"""
+ if args is None:
+ args = sys.argv[1:]
+
+ s, t = args[0:1] if args else DEFAULT_INPUT
+ print(unique_subsequences(s, t))
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/challenge-099/tyler-wardhaugh/python/ch1.py b/challenge-099/tyler-wardhaugh/python/ch1.py
new file mode 120000
index 0000000000..7680b02e4f
--- /dev/null
+++ b/challenge-099/tyler-wardhaugh/python/ch1.py
@@ -0,0 +1 @@
+ch-1.py \ No newline at end of file
diff --git a/challenge-099/tyler-wardhaugh/python/ch2.py b/challenge-099/tyler-wardhaugh/python/ch2.py
new file mode 120000
index 0000000000..13a132b99f
--- /dev/null
+++ b/challenge-099/tyler-wardhaugh/python/ch2.py
@@ -0,0 +1 @@
+ch-2.py \ No newline at end of file
diff --git a/challenge-099/tyler-wardhaugh/python/requirements.txt b/challenge-099/tyler-wardhaugh/python/requirements.txt
new file mode 100644
index 0000000000..a39ae54275
--- /dev/null
+++ b/challenge-099/tyler-wardhaugh/python/requirements.txt
@@ -0,0 +1 @@
+numpy==1.20.1
diff --git a/challenge-099/tyler-wardhaugh/python/test_ch1.py b/challenge-099/tyler-wardhaugh/python/test_ch1.py
new file mode 100755
index 0000000000..94e18be7b3
--- /dev/null
+++ b/challenge-099/tyler-wardhaugh/python/test_ch1.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python3
+
+import unittest
+from ch1 import pattern_match
+
+class TestTask1(unittest.TestCase):
+
+
+ def test_example_cases(self):
+ self.assertTrue(pattern_match("abcde", "a*e"))
+ self.assertFalse(pattern_match("abcde", "a*d"))
+ self.assertFalse(pattern_match("abcde", "?b*d"))
+ self.assertTrue(pattern_match("abcde", "a*c?e"))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/challenge-099/tyler-wardhaugh/python/test_ch2.py b/challenge-099/tyler-wardhaugh/python/test_ch2.py
new file mode 100755
index 0000000000..968a4fe8e4
--- /dev/null
+++ b/challenge-099/tyler-wardhaugh/python/test_ch2.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python3
+
+import unittest
+from ch2 import unique_subsequences
+
+class TestTask2(unittest.TestCase):
+
+
+ def test_example_cases(self):
+ self.assertEqual(5, unique_subsequences('littleit', 'lit'))
+ self.assertEqual(3, unique_subsequences('london', 'lon'))
+
+
+if __name__ == '__main__':
+ unittest.main()