From adc92c53b5b30d446065ec1b69fa245f9c6033a9 Mon Sep 17 00:00:00 2001 From: Ian Whitney Date: Fri, 27 May 2016 13:49:27 -0500 Subject: [PATCH] Implement pangram Implements the Pangram problem and follows the current canonical test suite. I'm putting the problem after scrabble score. I'm guessing that Most implementations will use iter -> filter -> collect (though students constantly surprise me with their great ideas). The track places these iterator -> Higher Order Function problems around scrabble score & hamming. --- config.json | 1 + exercises/pangram/Cargo.lock | 4 ++ exercises/pangram/Cargo.toml | 3 ++ exercises/pangram/example.rs | 18 +++++++++ exercises/pangram/tests/pangram.rs | 65 ++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 exercises/pangram/Cargo.lock create mode 100644 exercises/pangram/Cargo.toml create mode 100644 exercises/pangram/example.rs create mode 100644 exercises/pangram/tests/pangram.rs diff --git a/config.json b/config.json index 6ec384f78..de00f194f 100644 --- a/config.json +++ b/config.json @@ -13,6 +13,7 @@ "difference-of-squares", "hamming", "scrabble-score", + "pangram", "nucleotide-count", "word-count", "etl", diff --git a/exercises/pangram/Cargo.lock b/exercises/pangram/Cargo.lock new file mode 100644 index 000000000..1cc06af97 --- /dev/null +++ b/exercises/pangram/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "pangram" +version = "0.0.0" + diff --git a/exercises/pangram/Cargo.toml b/exercises/pangram/Cargo.toml new file mode 100644 index 000000000..541dca162 --- /dev/null +++ b/exercises/pangram/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "pangram" +version = "0.0.0" diff --git a/exercises/pangram/example.rs b/exercises/pangram/example.rs new file mode 100644 index 000000000..585d178d8 --- /dev/null +++ b/exercises/pangram/example.rs @@ -0,0 +1,18 @@ +use std::collections::BTreeSet; +use std::ascii::AsciiExt; +use std::iter::FromIterator; + +pub fn is_pangram(sentence: &str) -> bool { + sentence.to_lowercase() + .chars() + .filter(|c| c.is_alphabetic()) + .filter(|c| c.is_ascii()) + .collect::>() == english_letter_set() + +} + +fn english_letter_set() -> BTreeSet { + BTreeSet::from_iter(ENGLISH_ALPHABET.chars()) +} + +const ENGLISH_ALPHABET: &'static str = "abcdefghijklmnopqrstuvwxyz"; diff --git a/exercises/pangram/tests/pangram.rs b/exercises/pangram/tests/pangram.rs new file mode 100644 index 000000000..cc7da2baf --- /dev/null +++ b/exercises/pangram/tests/pangram.rs @@ -0,0 +1,65 @@ +extern crate pangram; + +use pangram::*; + +#[test] +fn empty_strings_are_not_pangrams() { + let sentence = ""; + assert!(!is_pangram(&sentence)); +} + +#[test] +#[ignore] +fn classic_pangram_is_a_pangram() { + let sentence = "the quick brown fox jumps over the lazy dog"; + assert!(is_pangram(&sentence)); +} + +#[test] +#[ignore] +fn pangrams_must_have_all_letters() { + let sentence = "a quick movement of the enemy will jeopardize five gunboats"; + assert!(!is_pangram(&sentence)); +} + +#[test] +#[ignore] +fn pangrams_must_have_all_letters_two() { + let sentence = "the quick brown fish jumps over the lazy dog"; + assert!(!is_pangram(&sentence)); +} + +#[test] +#[ignore] +fn underscores_do_not_affect_pangrams() { + let sentence = "the_quick_brown_fox_jumps_over_the_lazy_dog"; + assert!(is_pangram(&sentence)); +} + +#[test] +#[ignore] +fn numbers_do_not_affect_pangrams() { + let sentence = "the 1 quick brown fox jumps over the 2 lazy dogs"; + assert!(is_pangram(&sentence)); +} + +#[test] +#[ignore] +fn numbers_can_not_replace_numbers() { + let sentence = "7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog"; + assert!(!is_pangram(&sentence)); +} + +#[test] +#[ignore] +fn capitals_and_punctuation_can_be_in_pangrams() { + let sentence = "\"Five quacking Zephyrs jolt my wax bed.\""; + assert!(is_pangram(&sentence)); +} + +#[test] +#[ignore] +fn non_ascii_characters_can_be_in_pangrams() { + let sentence = "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich."; + assert!(is_pangram(&sentence)); +}