aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Berlin <jonas.berlin@nitorcreations.com>2021-02-08 10:37:56 +0200
committerJonas Berlin <jonas.berlin@nitorcreations.com>2021-02-08 10:37:56 +0200
commit641e3a346cbf54c6bb4fe7bc76d674d9845856bc (patch)
tree565fb6c196b91cea2d78fb91dc26684a6202d134
parent323110b0d053e2067a3cae6db62bc209f869bc57 (diff)
downloadperlweeklychallenge-club-641e3a346cbf54c6bb4fe7bc76d674d9845856bc.tar.gz
perlweeklychallenge-club-641e3a346cbf54c6bb4fe7bc76d674d9845856bc.tar.bz2
perlweeklychallenge-club-641e3a346cbf54c6bb4fe7bc76d674d9845856bc.zip
ch-1
-rw-r--r--challenge-099/xkr47/README5
-rw-r--r--challenge-099/xkr47/rust/Cargo.lock5
-rw-r--r--challenge-099/xkr47/rust/Cargo.toml11
-rw-r--r--challenge-099/xkr47/rust/ch-1.rs82
4 files changed, 103 insertions, 0 deletions
diff --git a/challenge-099/xkr47/README b/challenge-099/xkr47/README
index e4495cdc38..66625a1485 100644
--- a/challenge-099/xkr47/README
+++ b/challenge-099/xkr47/README
@@ -4,3 +4,8 @@ Install Rust from e.g. https://rustup.rs/ and run the Rust solutions like follow
cd rust
cargo run --release --bin ch-1 -- [<arguments>]
+
+And to run the unit tests (if any):
+
+cd rust
+cargo test
diff --git a/challenge-099/xkr47/rust/Cargo.lock b/challenge-099/xkr47/rust/Cargo.lock
new file mode 100644
index 0000000000..9ad4f2381d
--- /dev/null
+++ b/challenge-099/xkr47/rust/Cargo.lock
@@ -0,0 +1,5 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "pwd-099"
+version = "0.1.0"
diff --git a/challenge-099/xkr47/rust/Cargo.toml b/challenge-099/xkr47/rust/Cargo.toml
new file mode 100644
index 0000000000..7372c0c975
--- /dev/null
+++ b/challenge-099/xkr47/rust/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "pwd-099"
+version = "0.1.0"
+authors = ["Jonas Berlin <xkr47@outerspace.dyndns.org>"]
+edition = "2018"
+
+[dependencies]
+
+[[bin]]
+name = "ch-1"
+path = "ch-1.rs"
diff --git a/challenge-099/xkr47/rust/ch-1.rs b/challenge-099/xkr47/rust/ch-1.rs
new file mode 100644
index 0000000000..913903605e
--- /dev/null
+++ b/challenge-099/xkr47/rust/ch-1.rs
@@ -0,0 +1,82 @@
+#![allow(dead_code)]
+
+use std::env;
+
+fn main() {
+ let mut args = env::args().skip(1).take(2).collect::<Vec<_>>();
+ let (text, pattern) = (args.remove(0), args.remove(0));
+
+ let is_match = do_match(&text, &pattern);
+
+ println!("{}", if is_match { 1 } else { 0 });
+}
+
+fn do_match(text: &str, pattern: &str) -> bool {
+ if pattern.is_empty() {
+ text.is_empty()
+ } else {
+ match pattern.chars().next().unwrap() {
+ '*' =>
+ do_match(text, &pattern[1..]) ||
+ (!text.is_empty() && do_match(&text[1..], pattern)),
+ '?' =>
+ !text.is_empty() && do_match(&text[1..], &pattern[1..]),
+ ch =>
+ text.chars().next() == Some(ch) && do_match(&text[1..], &pattern[1..])
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use crate::*;
+
+ // from assignment
+
+ #[test]
+ fn do_test1() {
+ assert_eq!(do_match("abcde", "a*e"), true);
+ }
+
+ #[test]
+ fn do_test2() {
+ assert_eq!(do_match("abcde", "a*d"), false);
+ }
+
+ #[test]
+ fn do_test3() {
+ assert_eq!(do_match("abcde", "?b*d"), false);
+ }
+
+ #[test]
+ fn do_test4() {
+ assert_eq!(do_match("abcde", "a*c?e"), true);
+ }
+
+ // additional
+
+ #[test]
+ fn do_test10() {
+ assert_eq!(do_match("abc", "a*c?"), false);
+ }
+
+ #[test]
+ fn do_test11() {
+ assert_eq!(do_match("abc", "a*c*"), true);
+ }
+
+ #[test]
+ fn do_test12() {
+ assert_eq!(do_match("abc", "**"), true);
+ }
+
+ #[test]
+ fn do_test13() {
+ assert_eq!(do_match("", "**"), true);
+ }
+
+ #[test]
+ fn do_test14() {
+ assert_eq!(do_match("a", "*?"), true);
+ }
+}