From 299958c5efa601f47379db353a73d7eed1e58c3c Mon Sep 17 00:00:00 2001 From: Augusto Date: Mon, 18 Jan 2021 19:28:01 +0000 Subject: [PATCH 1/9] Add exercise subject for matrix_transposition_4by3 --- subjects/matrix_transposition/README.md | 2 +- subjects/matrix_transposition_4by3/README.md | 67 ++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 subjects/matrix_transposition_4by3/README.md diff --git a/subjects/matrix_transposition/README.md b/subjects/matrix_transposition/README.md index eaae796f..a1d479fe 100644 --- a/subjects/matrix_transposition/README.md +++ b/subjects/matrix_transposition/README.md @@ -13,7 +13,7 @@ Example: ``` -( a b ) __ transposition __> ( a d ) +( a b ) __ transposition __> ( a d ) ( c d ) ( b d ) ``` diff --git a/subjects/matrix_transposition_4by3/README.md b/subjects/matrix_transposition_4by3/README.md new file mode 100644 index 00000000..7b2ba7fe --- /dev/null +++ b/subjects/matrix_transposition_4by3/README.md @@ -0,0 +1,67 @@ +## matrix_transposition + +### Instructions + +- Define the structure matrix as a tuple of tuples of `i32`'s + +- Define a function that calculate the transpose matrix of a 4x3 matrix (4 rows by 3 columns) which is a 3x4 matrix (3 rows by 4 columns). + +- Note: + + - The transpose of a matrix `A` is the matrix `A'` where `A'`'s columns are `A`'s row and the rows are the columns: + +Example: + +``` +( a b ) __ transposition __> ( a d ) +( c d ) ( b d ) +``` + +- Matrix must implement Debug, PartialEq and Eq. You can use derive + +- Remember that you're defining a library so you have to make public the elements that are going to be called from an external crate. + +### Notions + +[Chapter 7]( https://doc.rust-lang.org/stable/book/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html ) + +### Expected Function + +```rust +pub struct Matrix4by3( + pub (i32, i32, i32), + pub (i32, i32, i32), + pub (i32, i32, i32), + pub (i32, i32, i32), +); + +pub struct Matrix3by4( + pub (i32, i32, i32, i32), + pub (i32, i32, i32, i32), + pub (i32, i32, i32, i32), +); + +pub fn transpose(m: Matrix4by3) -> Matrix3by4 { +} +``` + +### Usage + +Here is a posible program to test your function + +```rust +fn main() { + let matrix = Matrix4by3((1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)); + println!("Original matrix {:?}", matrix); + println!("Transpose matrix {:?}", transpose(matrix)); +} +``` + +And it's output: + +```console +student@ubuntu:~/[[ROOT]]/test$ cargo run +Original matrix Matrix4by3((1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)) +Transpose matrix Matrix3by4((1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) +student@ubuntu:~/[[ROOT]]/test$ +``` From f3eac5a510f01f9edca354b7167aa08ef5ca3e14 Mon Sep 17 00:00:00 2001 From: Augusto Date: Tue, 19 Jan 2021 17:29:11 +0000 Subject: [PATCH 2/9] Add exercise insertion_sort --- .../insertion_sort/Insertion-Sort-demo.jpg | Bin 0 -> 67860 bytes subjects/insertion_sort/README.md | 58 ++++++++++++++++++ subjects/matrix_transposition_4by3/README.md | 10 +-- 3 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 subjects/insertion_sort/Insertion-Sort-demo.jpg create mode 100644 subjects/insertion_sort/README.md diff --git a/subjects/insertion_sort/Insertion-Sort-demo.jpg b/subjects/insertion_sort/Insertion-Sort-demo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cbe8848ff52f75f6bd25402d8869a18ab5a1a3e6 GIT binary patch literal 67860 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 ( a d ) -( c d ) ( b d ) +( a b c ) __ transposition __> ( a d g j ) +( d e f ) ( b e h k ) +( g h i ) ( c f i l ) +( j k l ) ``` - Matrix must implement Debug, PartialEq and Eq. You can use derive @@ -25,7 +27,7 @@ Example: [Chapter 7]( https://doc.rust-lang.org/stable/book/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html ) -### Expected Function +### Expected Function and Structs ```rust pub struct Matrix4by3( From 6558e9cd9cb7f3b779adf602c4a5664cccfe028d Mon Sep 17 00:00:00 2001 From: Augusto Date: Tue, 19 Jan 2021 22:55:58 +0000 Subject: [PATCH 3/9] Add exercise `matrix_display`s subject --- subjects/insertion_sort/README.md | 2 -- subjects/matrix_display/README.md | 44 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 subjects/matrix_display/README.md diff --git a/subjects/insertion_sort/README.md b/subjects/insertion_sort/README.md index c469e148..550ec737 100644 --- a/subjects/insertion_sort/README.md +++ b/subjects/insertion_sort/README.md @@ -19,8 +19,6 @@ Here is a visual example of sorting a slice step by step using the insertion sor - Implement the algorithm insertion sort by creating a function `insertion_sort(slice, steps)` that executes the iterations of the algorithm the number of steps indicated by the parameter `steps`. See the [Usage](#usage) for more information. -### Notion - ### Expected Function ```rust diff --git a/subjects/matrix_display/README.md b/subjects/matrix_display/README.md new file mode 100644 index 00000000..d5acc795 --- /dev/null +++ b/subjects/matrix_display/README.md @@ -0,0 +1,44 @@ +## matrix_display + +### Instructions + +Use the Matrix struct given in the [expected struct](#expected-functions-and-struct) and implement the `std::fmt::Display` trait so it prints the matrix like in the [usage](#usage). + +You will also have to implement the associated function `new` that creates a matrix from a slice of slices. + +### Expected Functions and Struct + +```rust +pub struct Matrix(pub Vec>); + +pub fn new(slice: &[&[i32]]) -> Self { +} + +use std::fmt; + +impl fmt::Display for Matrix { +} +``` + +### Usage + +Here is a possible program to test your function + +```rust +use matrix_display::*; + +fn main() { + let matrix = Matrix::new(&[&[1, 2, 3], &[4, 5, 6], &[7, 8, 9]]); + println!("{}", matrix); +} +``` + +And it's output: + +```console +student@ubuntu:~/[[ROOT]]/test$ cargo run +(1 2 3) +(4 5 6) +(7 8 9) +student@ubuntu:~/[[ROOT]]/test$ +``` From ec36485648cd0275cde7cb0abeb7530c8c38eda7 Mon Sep 17 00:00:00 2001 From: Augusto Date: Tue, 26 Jan 2021 18:39:16 +0000 Subject: [PATCH 4/9] Fix a typo in the roman_numbers exercise --- subjects/roman_numbers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/roman_numbers/README.md b/subjects/roman_numbers/README.md index c4c8ea5c..2b6ff317 100644 --- a/subjects/roman_numbers/README.md +++ b/subjects/roman_numbers/README.md @@ -1,7 +1,7 @@ ## roman_numbers ### Instructions -Implement the From Trait to create a roman number from a u32 the roman number should be in subtractive notation (the common way to write roman number I, II, II, IV, V, VI, VII, VIII, IX, X ...) +Implement the From Trait to create a roman number from a u32 the roman number should be in subtractive notation (the common way to write roman number I, II, III, IV, V, VI, VII, VIII, IX, X ...) For this start by defining the digits as `RomanDigit` with the values I, V, X, L, C, D, M and Nulla for 0 From df14481572e292c5b8df62df2a83e0da1744ab39 Mon Sep 17 00:00:00 2001 From: Augusto Date: Tue, 26 Jan 2021 18:40:34 +0000 Subject: [PATCH 5/9] Add the subject for the exercise display_table --- subjects/display_table/README.md | 79 ++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 subjects/display_table/README.md diff --git a/subjects/display_table/README.md b/subjects/display_table/README.md new file mode 100644 index 00000000..a5453699 --- /dev/null +++ b/subjects/display_table/README.md @@ -0,0 +1,79 @@ +## display_table + +### Instructions + +- Implement the std::fmt::Display trait for the structure table so the table is printed like in the [Usage](#usage) the length of each column must adjust to the longest element of the column and the element must be centered in the "cell" when possible, if the length of the element doesn't allow to center exactly it must alight slightly to the right. + + - Note: If the table is empty `println!` must not print anything. + +- Define the associated function `new` that create a new empty table. + +- Define the method function `add_row` that adds a new row to the table created from a slice of strings. + +### Expected function + +```rust +pub struct Table { + pub headers: Vec, + pub body: Vec>, +} + +impl fmt::Display for Table { +} + +impl Table { + fn new() -> Table { + } + + fn add_row(&mut self, row: &[String]) { + } +} +``` + +### Usage + +Here is a possible test for your function: + +```rust +fn main() { + let mut table = Table::new(); + println!("{}", table); + table.headers = vec![ + String::from("Model"), + String::from("Piece N°"), + String::from("In Stock"), + String::from("Description"), + ]; + table.add_row(&[ + String::from("model 1"), + String::from("43-EWQE304"), + String::from("30"), + String::from("Piece for x"), + ]); + table.add_row(&[ + String::from("model 2"), + String::from("98-QCVX5433"), + String::from("100000000"), + String::from("-"), + ]); + table.add_row(&[ + String::from("model y"), + String::from("78-NMNH"), + String::from("60"), + String::from("nothing"), + ]); + println!("{}", table); +} +``` + +And its output: + +```console +student@ubuntu:~/[[ROOT]]/test$ cargo run +| Model | Piece N° | In Stock | Description | +|---------+-------------+-----------+-------------| +| model 1 | 43-EWQE304 | 30 | Piece for x | +| model 2 | 98-QCVX5433 | 100000000 | - | +| model y | 78-NMNH | 60 | nothing | +student@ubuntu:~/[[ROOT]]/test$ +``` From eec65f28a9671940fa78e876854d7ae35bdff580 Mon Sep 17 00:00:00 2001 From: Augusto Date: Tue, 26 Jan 2021 22:11:16 +0000 Subject: [PATCH 6/9] Add the subject for the exercise `display_table` --- subjects/display_table/README.md | 4 +- subjects/filter_table/README.md | 85 ++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 subjects/filter_table/README.md diff --git a/subjects/display_table/README.md b/subjects/display_table/README.md index a5453699..31419c7f 100644 --- a/subjects/display_table/README.md +++ b/subjects/display_table/README.md @@ -22,10 +22,10 @@ impl fmt::Display for Table { } impl Table { - fn new() -> Table { + pub fn new() -> Table { } - fn add_row(&mut self, row: &[String]) { + pub fn add_row(&mut self, row: &[String]) { } } ``` diff --git a/subjects/filter_table/README.md b/subjects/filter_table/README.md new file mode 100644 index 00000000..f33ce790 --- /dev/null +++ b/subjects/filter_table/README.md @@ -0,0 +1,85 @@ +## filter_table + +### Instructions + +- Define the functions: + + - new: creates a new empty table. + + - add_rows: adds a new row to the table from a slice of strings. + + - filter_cols: that receives a closure that receives a `&str` and returns a `bool` value: + + - filter_cols returns a table with all the columns that yielded true when applied to the header. + + - filter_rows: that receives a closure that receives a `&str` and returns a `bool` value + + - filter_rows returns a table with all the columns that yielded true when applied to the elements of the selected column. + +### Expected function + +```rust +pub struct Table { + pub headers: Vec, + pub body: Vec>, +} + +impl Table { + pub fn new() -> Table { + } + + pub fn add_row(&mut self, row: &[String]) { + } + + pub fn filter_col(&self, filter: ) -> Option { + + } + + pub fn filter_row(&self, col_name: &str, filter: ) -> Option { + } +} +``` + +### Usage + +Here is a possible test for your function: + +```rust +fn main() { + let mut table = Table::new(); + table.headers = vec![ + "Name".to_string(), + "Last Name".to_string(), + "ID Number".to_string(), + ]; + table.add_row(&[ + "Adam".to_string(), + "Philips".to_string(), + "123456789".to_string(), + ]); + table.add_row(&[ + "Adamaris".to_string(), + "Shelby".to_string(), + "1111123456789".to_string(), + ]); + table.add_row(&[ + "Ackerley".to_string(), + "Philips".to_string(), + "123456789".to_string(), + ]); + let filter_names = |col: &str| col == "Name"; + println!("{:?}", table.filter_col(filter_names)); + + let filter_philips = |lastname: &str| lastname == "Philips"; + println!("{:?}", table.filter_row("Last Name", filter_philips)); +} +``` + +And its output: + +```console +student@ubuntu:~/[[ROOT]]/test$ cargo run +Some(Table { headers: ["Name"], body: [["Adam"], ["Adamaris"], ["Ackerley"]] }) +Some(Table { headers: ["Name", "Last Name", "ID Number"], body: [["Adam", "Philips", "123456789"], ["Ackerley", "Philips", "123456789"]] }) +student@ubuntu:~/[[ROOT]]/test$ +``` From 7397c5c7b49d6fbab46f40e10236c6b8ed889b31 Mon Sep 17 00:00:00 2001 From: Augusto Date: Wed, 27 Jan 2021 10:20:27 +0000 Subject: [PATCH 7/9] Add the subject for the exercise `flat_tree` --- subjects/flat_tree/README.md | 43 ++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 subjects/flat_tree/README.md diff --git a/subjects/flat_tree/README.md b/subjects/flat_tree/README.md new file mode 100644 index 00000000..3ecda4c6 --- /dev/null +++ b/subjects/flat_tree/README.md @@ -0,0 +1,43 @@ +## flat_rust + +### Instructions + +- Define the functions `flatten_tree` that receives a std::collections::BTreeSet and returns a new `Vec` with the elements in the binary tree in order. + +### Expected function + +```rust +pub fn flatten_tree>(tree: &BTreeSet) -> Vec { +} +``` + +### Usage + +Here is a possible test for your function: + +```rust +fn main() { + let mut tree = BTreeSet::new(); + tree.insert(34); + tree.insert(0); + tree.insert(9); + tree.insert(30); + println!("{:?}", flatten_tree(&tree)); + + let mut tree = BTreeSet::new(); + tree.insert("Slow"); + tree.insert("kill"); + tree.insert("will"); + tree.insert("Horses"); + println!("{:?}", flatten_tree(&tree)); +} +``` + +And its output: + +```console +student@ubuntu:~/[[ROOT]]/test$ cargo run +[0, 9, 30, 34] +["Horses", "Slow", "kill", "will"] +student@ubuntu:~/[[ROOT]]/test$ +``` From 6d4ca52b21b9001c68f4ad33bcc89e550dca63cf Mon Sep 17 00:00:00 2001 From: Augusto Date: Wed, 27 Jan 2021 12:17:25 +0000 Subject: [PATCH 8/9] Add the subject for the exercise `blood_types_s` A simplified version of `blood_types` --- subjects/blood_types_s/README.md | 92 ++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 subjects/blood_types_s/README.md diff --git a/subjects/blood_types_s/README.md b/subjects/blood_types_s/README.md new file mode 100644 index 00000000..9fe00071 --- /dev/null +++ b/subjects/blood_types_s/README.md @@ -0,0 +1,92 @@ +## blood_types_s + +### Instructions + +Use the following table to define the methods asked: + +| Blood Types | Donate Blood to | Receive Blood From | +|-------------|------------------|--------------------| +| A+ | A+, AB+ | A+, A-, O+, O- | +| O+ | O+, A+, B+, AB+ | O+, O- | +| B+ | O+, O- | B+, B-, O+, O- | +| AB+ | AB+ | Everyone | +| A- | A+, A-, AB+, AB- | A-, O- | +| O- | Everyone | O- | +| B- | B+, B-, AB+, AB- | B-, O- | +| AB- | AB+, AB- | AB-, A-, B-, O- | + +Write three methods for BloodType: + +- `can_receive_from`: which returns true if `self` can receive blood from `other` blood type +- `donors`: which returns all the blood types that can give blood to `self` +- `recipients`: which returns all the blood types that can receive blood from `self` + +### Expected Functions and Structures + +```rust +#[derive(Debug, PartialEq, Eq, Clone, PartialOrd, Ord)] +pub enum Antigen { + A, + AB, + B, + O, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +enum RhFactor { + Positive, + Negative, +} + +#[derive(PartialEq, Eq, PartialOrd, Ord, Clone)] +pub struct BloodType { + pub antigen: Antigen, + pub rh_factor: RhFactor, +} + +impl BloodType { + pub fn can_receive_from(&self, other: &Self) -> bool { + } + + pub fn donors(&self) -> Vec { + } + + pub fn recipients(&self) -> Vec { +} +``` + +### Usage + +Here is a program to test your function. + +```rust +use blood_types_s::{Antigen, BloodType, RhFactor}; + +fn main() { + let blood_type = BloodType { + antigen: Antigen::O, + rh_factor: RhFactor::Positive, + }; + println!("recipients of O+ {:?}", blood_type.recipients()); + println!("donors of O+ {:?}", blood_type.donors()); + let another_blood_type = BloodType { + antigen: Antigen::O, + rh_factor: RhFactor::Positive, + }; + println!( + "donors of O+ can receive from {:?} {:?}", + &another_blood_type, + blood_type.can_receive_from(&another_blood_type) + ); +} +``` + +And its output + +```console +student@ubuntu:~/[[ROOT]]/test$ cargo run +recipients of O+ [BloodType { antigen: AB, rh_factor: Positive }, BloodType { antigen: O, rh_factor: Positive }, BloodType { antigen: A, rh_factor: Positive }, BloodType { antigen: B, rh_factor: Positive }] +donors of O+ [BloodType { antigen: O, rh_factor: Positive }, BloodType { antigen: O, rh_factor: Negative }] +donors of O+ can receive from BloodType { antigen: O, rh_factor: Positive } true +student@ubuntu:~/[[ROOT]]/test$ +``` From 797c1a4c05c62a0ead5ce7df7301d428cc791cb7 Mon Sep 17 00:00:00 2001 From: Augusto Date: Thu, 28 Jan 2021 20:47:58 +0000 Subject: [PATCH 9/9] Fix typos in the subject of the exercise blood_types --- subjects/blood_types/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/subjects/blood_types/README.md b/subjects/blood_types/README.md index 5aba94f1..061abb96 100644 --- a/subjects/blood_types/README.md +++ b/subjects/blood_types/README.md @@ -2,12 +2,12 @@ ### Instructions -In this exercise you will create a model data model of blood types and an API to deal with blood types +In this exercise you will create a data model of blood types and an API to deal with blood types -Start by creating the data representation of the blood types: +Start by copying the data representation of the blood types: - Create the enumerator `Antigen` that has 4 possibilities: A, B, O and AB And the enumerator `RhFactor` that has two possible values: Positive and Negative -- After, create the struct BloodType that contains two fields with the names antigen and rh_factor +- After, copy the struct BloodType that contains two fields with the names antigen and rh_factor - To provide a simple way to create blood types implement the trait FromStr for BloodType (which will allow us to use the `parse` method and the associated function from_str, so we can do: @@ -19,11 +19,11 @@ Start by creating the data representation of the blood types: - Implement the trait std::Debug for BloodType allowing to print a vector such as [BloodType { antigen: A, rh_factor: Positive}, BloodType{ antigen: B, rh_factor: Negative}] as [ A+, A-] using the formatting {:?} -Write three methods for BloodType: +- Lastly, write three methods for BloodType: -- `can_receive_from`: which returns true if self can receive blood from `other` blood type -- `donors`: which returns all the blood types that can give blood to self -- `recipients`: which returns all the blood types that can receive blood from self + - `can_receive_from`: which returns true if `self` can receive blood from `other` blood type + - `donors`: which returns all the blood types that can give blood to `self` + - `recipients`: which returns all the blood types that can receive blood from `self` ### Expected Functions and Structures