diff options
Diffstat (limited to 'rust/rustlings/exercises/quizzes')
| -rw-r--r-- | rust/rustlings/exercises/quizzes/README.md | 3 | ||||
| -rw-r--r-- | rust/rustlings/exercises/quizzes/quiz1.rs | 35 | ||||
| -rw-r--r-- | rust/rustlings/exercises/quizzes/quiz2.rs | 81 | ||||
| -rw-r--r-- | rust/rustlings/exercises/quizzes/quiz3.rs | 64 |
4 files changed, 183 insertions, 0 deletions
diff --git a/rust/rustlings/exercises/quizzes/README.md b/rust/rustlings/exercises/quizzes/README.md new file mode 100644 index 0000000..4d3bcd9 --- /dev/null +++ b/rust/rustlings/exercises/quizzes/README.md @@ -0,0 +1,3 @@ +# Quizzes + +After every couple of sections, there will be a quiz in this directory that'll test your knowledge on a bunch of sections at once. diff --git a/rust/rustlings/exercises/quizzes/quiz1.rs b/rust/rustlings/exercises/quizzes/quiz1.rs new file mode 100644 index 0000000..b787d7e --- /dev/null +++ b/rust/rustlings/exercises/quizzes/quiz1.rs @@ -0,0 +1,35 @@ +// This is a quiz for the following sections: +// - Variables +// - Functions +// - If +// +// Mary is buying apples. The price of an apple is calculated as follows: +// - An apple costs 2 rustbucks. +// - However, if Mary buys more than 40 apples, the price of each apple in the +// entire order is reduced to only 1 rustbuck! + +fn calculate_price_of_apples(n: i32) -> i32 { + if n > 40 { + n + } else { + 2 * n + } +} + +fn main() { + // You can optionally experiment here. +} + +// Don't change the tests! +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn verify_test() { + assert_eq!(calculate_price_of_apples(35), 70); + assert_eq!(calculate_price_of_apples(40), 80); + assert_eq!(calculate_price_of_apples(41), 41); + assert_eq!(calculate_price_of_apples(65), 65); + } +} diff --git a/rust/rustlings/exercises/quizzes/quiz2.rs b/rust/rustlings/exercises/quizzes/quiz2.rs new file mode 100644 index 0000000..fd32810 --- /dev/null +++ b/rust/rustlings/exercises/quizzes/quiz2.rs @@ -0,0 +1,81 @@ +// This is a quiz for the following sections: +// - Strings +// - Vecs +// - Move semantics +// - Modules +// - Enums +// +// Let's build a little machine in the form of a function. As input, we're going +// to give a list of strings and commands. These commands determine what action +// is going to be applied to the string. It can either be: +// - Uppercase the string +// - Trim the string +// - Append "bar" to the string a specified amount of times +// +// The exact form of this will be: +// - The input is going to be a Vector of 2-length tuples, +// the first element is the string, the second one is the command. +// - The output element is going to be a vector of strings. + +enum Command { + Uppercase, + Trim, + Append(usize), +} + +mod my_module { + use super::Command; + + // TODO: Complete the function as described above. + // pub fn transformer(input: ???) -> ??? { ??? } + pub fn transformer(input: Vec<(String, Command)>) -> Vec<String> { + let mut out = Vec::new(); + for inp in input { + out.push(match inp.1 { + Command::Uppercase => inp.0.to_uppercase(), + Command::Trim => String::from(inp.0.trim()), + Command::Append(n) => { + let mut r = inp.0; + for _ in 0..n { + r += "bar"; + } + r + } + }); + } + out + } +} + +fn main() { + // You can optionally experiment here. +} + +#[cfg(test)] +mod tests { + // TODO: What do we need to import to have `transformer` in scope? + // use ???; + use super::Command; + use super::my_module::transformer; + + #[test] + fn it_works() { + let input = vec![ + ("hello".to_string(), Command::Uppercase), + (" all roads lead to rome! ".to_string(), Command::Trim), + ("foo".to_string(), Command::Append(1)), + ("bar".to_string(), Command::Append(5)), + ]; + let output = transformer(input); + + assert_eq!( + output, + [ + "HELLO", + "all roads lead to rome!", + "foobar", + "barbarbarbarbarbar", + ] + ); + } +} diff --git a/rust/rustlings/exercises/quizzes/quiz3.rs b/rust/rustlings/exercises/quizzes/quiz3.rs new file mode 100644 index 0000000..5bb859f --- /dev/null +++ b/rust/rustlings/exercises/quizzes/quiz3.rs @@ -0,0 +1,64 @@ +// This quiz tests: +// - Generics +// - Traits +// +// An imaginary magical school has a new report card generation system written +// in Rust! Currently, the system only supports creating report cards where the +// student's grade is represented numerically (e.g. 1.0 -> 5.5). However, the +// school also issues alphabetical grades (A+ -> F-) and needs to be able to +// print both types of report card! +// +// Make the necessary code changes in the struct `ReportCard` and the impl +// block to support alphabetical report cards in addition to numerical ones. + +// TODO: Adjust the struct as described above. +struct ReportCard<T> { + grade: T, + student_name: String, + student_age: u8, +} + +// TODO: Adjust the impl block as described above. +impl<T: std::fmt::Display> ReportCard<T> { + fn print(&self) -> String { + format!( + "{} ({}) - achieved a grade of {}", + &self.student_name, &self.student_age, &self.grade, + ) + } +} + +fn main() { + // You can optionally experiment here. +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn generate_numeric_report_card() { + let report_card = ReportCard { + grade: 2.1, + student_name: "Tom Wriggle".to_string(), + student_age: 12, + }; + assert_eq!( + report_card.print(), + "Tom Wriggle (12) - achieved a grade of 2.1", + ); + } + + #[test] + fn generate_alphabetic_report_card() { + let report_card = ReportCard { + grade: "A+", + student_name: "Gary Plotter".to_string(), + student_age: 11, + }; + assert_eq!( + report_card.print(), + "Gary Plotter (11) - achieved a grade of A+", + ); + } +} |