First quiz and its related modules

This commit is contained in:
Nidhal Messaoudi 2023-02-26 17:28:24 +01:00
parent 36e66b545e
commit 52ed5dbcf9
22 changed files with 60 additions and 98 deletions

View file

@ -4,7 +4,7 @@
// This exercise uses some concepts that we won't get to until later in the course, like `Box` and the // This exercise uses some concepts that we won't get to until later in the course, like `Box` and the
// `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like. // `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like.
// For now, think of the `Box<dyn ???>` type as an "I want anything that does ???" type, which, given // For now, think of the `Box<dyn ...>` type as an "I want anything that does ???" type, which, given
// Rust's usual standards for runtime safety, should strike you as somewhat lenient! // Rust's usual standards for runtime safety, should strike you as somewhat lenient!
// In short, this particular use case for boxes is for when you want to own a value and you care only that it is a // In short, this particular use case for boxes is for when you want to own a value and you care only that it is a

View file

@ -1,8 +1,10 @@
// functions1.rs // functions1.rs
// Execute `rustlings hint functions1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint functions1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
call_me(); call_me();
} }
fn call_me() {
println!("I'm Nidhal Messaoudi, a software developer going Rusty!!!");
}

View file

@ -1,13 +1,11 @@
// functions2.rs // functions2.rs
// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
call_me(3); call_me(3);
} }
fn call_me(num:) { fn call_me(num: i32) {
for i in 0..num { for i in 0..num {
println!("Ring! Call number {}", i + 1); println!("Ring! Call number {}", i + 1);
} }

View file

@ -1,10 +1,8 @@
// functions3.rs // functions3.rs
// Execute `rustlings hint functions3` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint functions3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
call_me(); call_me(12);
} }
fn call_me(num: u32) { fn call_me(num: u32) {

View file

@ -7,14 +7,12 @@
// in the signatures for now. If anything, this is a good way to peek ahead // in the signatures for now. If anything, this is a good way to peek ahead
// to future exercises!) // to future exercises!)
// I AM NOT DONE
fn main() { fn main() {
let original_price = 51; let original_price = 51;
println!("Your sale price is {}", sale_price(original_price)); println!("Your sale price is {}", sale_price(original_price));
} }
fn sale_price(price: i32) -> { fn sale_price(price: i32) -> i32 {
if is_even(price) { if is_even(price) {
price - 10 price - 10
} else { } else {

View file

@ -1,13 +1,11 @@
// functions5.rs // functions5.rs
// Execute `rustlings hint functions5` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint functions5` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
let answer = square(3); let answer = square(3);
println!("The square of 3 is {}", answer); println!("The square of 3 is {}", answer);
} }
fn square(num: i32) -> i32 { fn square(num: i32) -> i32 {
num * num; return num * num;
} }

View file

@ -1,13 +1,16 @@
// if1.rs // if1.rs
// Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
pub fn bigger(a: i32, b: i32) -> i32 { pub fn bigger(a: i32, b: i32) -> i32 {
// Complete this function to return the bigger number! // Complete this function to return the bigger number!
// Do not use: // Do not use:
// - another function call // - another function call
// - additional variables // - additional variables
if a > b {
a
} else {
b
}
} }
// Don't mind this for now :) // Don't mind this for now :)

View file

@ -4,13 +4,13 @@
// Step 2: Get the bar_for_fuzz and default_to_baz tests passing! // Step 2: Get the bar_for_fuzz and default_to_baz tests passing!
// Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
pub fn foo_if_fizz(fizzish: &str) -> &str { pub fn foo_if_fizz(fizzish: &str) -> &str {
if fizzish == "fizz" { if fizzish == "fuzz" {
"bar"
} else if fizzish == "fizz" {
"foo" "foo"
} else { } else {
1 "baz"
} }
} }

View file

@ -9,8 +9,6 @@
// when you change one of the lines below! Try adding a `println!` line, or try changing // when you change one of the lines below! Try adding a `println!` line, or try changing
// what it outputs in your terminal. Try removing a semicolon and see what happens! // what it outputs in your terminal. Try removing a semicolon and see what happens!
// I AM NOT DONE
fn main() { fn main() {
println!("Hello and"); println!("Hello and");
println!(r#" welcome to... "#); println!(r#" welcome to... "#);

View file

@ -2,8 +2,6 @@
// Make the code print a greeting to the world. // Make the code print a greeting to the world.
// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint intro2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
println!("Hello {}!"); println!("Hello {}!", "World");
} }

View file

@ -10,7 +10,7 @@
// I AM NOT DONE // I AM NOT DONE
fn main() { fn main () {
let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"]; let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"];
let mut my_iterable_fav_fruits = ???; // TODO: Step 1 let mut my_iterable_fav_fruits = ???; // TODO: Step 1

View file

@ -3,7 +3,6 @@
// I AM NOT DONE // I AM NOT DONE
#[rustfmt::skip]
macro_rules! my_macro { macro_rules! my_macro {
() => { () => {
println!("Check out my macro!"); println!("Check out my macro!");

View file

@ -10,10 +10,20 @@
// Write a function that calculates the price of an order of apples given // Write a function that calculates the price of an order of apples given
// the quantity bought. No hints this time! // the quantity bought. No hints this time!
// I AM NOT DONE
// Put your function here! // Put your function here!
// fn calculate_price_of_apples { fn calculate_price_of_apples(quantity: i32) -> i32 {
let mut quantity= quantity;
if quantity <= 40 {
quantity = quantity * 2;
}
return quantity;
// if quantity > 40 {
// quantity
// } else {
// quantity * 2
// }
}
// Don't modify this function! // Don't modify this function!
#[test] #[test]

View file

@ -32,7 +32,7 @@ fn main() {
for offset in 0..8 { for offset in 0..8 {
let child_numbers = // TODO let child_numbers = // TODO
joinhandles.push(thread::spawn(move || { joinhandles.push(thread::spawn(move || {
let sum: u32 = child_numbers.iter().filter(|&&n| n % 8 == offset).sum(); let sum: u32 = child_numbers.iter().filter(|n| *n % 8 == offset).sum();
println!("Sum of offset {} is {}", offset, sum); println!("Sum of offset {} is {}", offset, sum);
})); }));
} }

View file

@ -4,9 +4,6 @@
// Cow is a clone-on-write smart pointer. // Cow is a clone-on-write smart pointer.
// It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required. // It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required.
// The type is designed to work with general borrowed data via the Borrow trait. // The type is designed to work with general borrowed data via the Borrow trait.
//
// This exercise is meant to show you what to expect when passing data to Cow.
// Fix the unit tests by checking for Cow::Owned(_) and Cow::Borrowed(_) at the TODO markers.
// I AM NOT DONE // I AM NOT DONE
@ -23,52 +20,29 @@ fn abs_all<'a, 'b>(input: &'a mut Cow<'b, [i32]>) -> &'a mut Cow<'b, [i32]> {
input input
} }
#[cfg(test)] fn main() {
mod tests {
use super::*;
#[test]
fn reference_mutation() -> Result<(), &'static str> {
// Clone occurs because `input` needs to be mutated.
let slice = [-1, 0, 1];
let mut input = Cow::from(&slice[..]);
match abs_all(&mut input) {
Cow::Owned(_) => Ok(()),
_ => Err("Expected owned value"),
}
}
#[test]
fn reference_no_mutation() -> Result<(), &'static str> {
// No clone occurs because `input` doesn't need to be mutated. // No clone occurs because `input` doesn't need to be mutated.
let slice = [0, 1, 2]; let slice = [0, 1, 2];
let mut input = Cow::from(&slice[..]); let mut input = Cow::from(&slice[..]);
match abs_all(&mut input) { match abs_all(&mut input) {
// TODO Cow::Borrowed(_) => println!("I borrowed the slice!"),
} _ => panic!("expected borrowed value"),
} }
#[test] // Clone occurs because `input` needs to be mutated.
fn owned_no_mutation() -> Result<(), &'static str> { let slice = [-1, 0, 1];
// We can also pass `slice` without `&` so Cow owns it directly. let mut input = Cow::from(&slice[..]);
// In this case no mutation occurs and thus also no clone,
// but the result is still owned because it always was.
let slice = vec![0, 1, 2];
let mut input = Cow::from(slice);
match abs_all(&mut input) { match abs_all(&mut input) {
// TODO Cow::Owned(_) => println!("I modified the slice and now own it!"),
} _ => panic!("expected owned value"),
} }
#[test] // No clone occurs because `input` is already owned.
fn owned_mutation() -> Result<(), &'static str> {
// Of course this is also the case if a mutation does occur.
// In this case the call to `to_mut()` returns a reference to
// the same data as before.
let slice = vec![-1, 0, 1]; let slice = vec![-1, 0, 1];
let mut input = Cow::from(slice); let mut input = Cow::from(slice);
match abs_all(&mut input) { match abs_all(&mut input) {
// TODO // TODO
} Cow::Borrowed(_) => println!("I own this slice!"),
_ => panic!("expected borrowed value"),
} }
} }

View file

@ -2,9 +2,7 @@
// Make me compile! // Make me compile!
// Execute `rustlings hint variables1` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint variables1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
x = 5; let x = 5;
println!("x has the value {}", x); println!("x has the value {}", x);
} }

View file

@ -1,10 +1,8 @@
// variables2.rs // variables2.rs
// Execute `rustlings hint variables2` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint variables2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
let x; let x = 12;
if x == 10 { if x == 10 {
println!("x is ten!"); println!("x is ten!");
} else { } else {

View file

@ -1,9 +1,7 @@
// variables3.rs // variables3.rs
// Execute `rustlings hint variables3` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint variables3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
let x: i32; let x: i32 = 12;
println!("Number {}", x); println!("Number {}", x);
} }

View file

@ -1,10 +1,8 @@
// variables4.rs // variables4.rs
// Execute `rustlings hint variables4` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint variables4` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
let x = 3; let mut x = 3;
println!("Number {}", x); println!("Number {}", x);
x = 5; // don't change this line x = 5; // don't change this line
println!("Number {}", x); println!("Number {}", x);

View file

@ -1,11 +1,9 @@
// variables5.rs // variables5.rs
// Execute `rustlings hint variables5` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint variables5` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
fn main() { fn main() {
let number = "T-H-R-E-E"; // don't change this line let number = "T-H-R-E-E"; // don't change this line
println!("Spell a Number : {}", number); println!("Spell a Number : {}", number);
number = 3; // don't rename this variable let number = 3; // don't rename this variable
println!("Number plus two is : {}", number + 2); println!("Number plus two is : {}", number + 2);
} }

View file

@ -1,9 +1,7 @@
// variables6.rs // variables6.rs
// Execute `rustlings hint variables6` or use the `hint` watch subcommand for a hint. // Execute `rustlings hint variables6` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE const NUMBER: i32 = 3;
const NUMBER = 3;
fn main() { fn main() {
println!("Number {}", NUMBER); println!("Number {}", NUMBER);
} }

View file

@ -13,5 +13,3 @@ the other useful data structure, hash maps, later.
## Further information ## Further information
- [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html) - [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html)
- [`iter_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.iter_mut)
- [`map`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.map)