From 641e3a346cbf54c6bb4fe7bc76d674d9845856bc Mon Sep 17 00:00:00 2001 From: Jonas Berlin Date: Mon, 8 Feb 2021 10:37:56 +0200 Subject: ch-1 --- challenge-099/xkr47/README | 5 +++ challenge-099/xkr47/rust/Cargo.lock | 5 +++ challenge-099/xkr47/rust/Cargo.toml | 11 +++++ challenge-099/xkr47/rust/ch-1.rs | 82 +++++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 challenge-099/xkr47/rust/Cargo.lock create mode 100644 challenge-099/xkr47/rust/Cargo.toml create mode 100644 challenge-099/xkr47/rust/ch-1.rs 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 -- [] + +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 "] +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::>(); + 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); + } +} -- cgit