mirror of https://github.com/01-edu/public.git
Augusto
4 years ago
4 changed files with 231 additions and 0 deletions
@ -0,0 +1,38 @@
|
||||
# This file is automatically @generated by Cargo. |
||||
# It is not intended for manual editing. |
||||
[[package]] |
||||
name = "borrow_me_the_reference" |
||||
version = "0.1.0" |
||||
dependencies = [ |
||||
"meval", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "borrow_me_the_reference_test" |
||||
version = "0.1.0" |
||||
dependencies = [ |
||||
"borrow_me_the_reference", |
||||
"meval", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "fnv" |
||||
version = "1.0.7" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" |
||||
|
||||
[[package]] |
||||
name = "meval" |
||||
version = "0.2.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "f79496a5651c8d57cd033c5add8ca7ee4e3d5f7587a4777484640d9cb60392d9" |
||||
dependencies = [ |
||||
"fnv", |
||||
"nom", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "nom" |
||||
version = "1.2.4" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" |
@ -0,0 +1,11 @@
|
||||
[package] |
||||
name = "borrow_me_the_reference_test" |
||||
version = "0.1.0" |
||||
authors = ["lee <lee-dasilva@hotmail.com>"] |
||||
edition = "2018" |
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
||||
|
||||
[dependencies] |
||||
meval = "0.2" |
||||
borrow_me_the_reference = { path = "../../../../rust-piscine-solutions/borrow_me_the_reference"} |
@ -0,0 +1,127 @@
|
||||
/* |
||||
## borrowing_or_not_to_borrow |
||||
|
||||
### Instructions |
||||
|
||||
Ownership is Rust's most unique feature, and it enables Rust to make memory safety guarantees without |
||||
needing garbage collector. Therefore you must understand ownership in rust. |
||||
|
||||
Create the following functions : |
||||
|
||||
- `delete_and_backspace`, imagine that `-` represents the backspace key and the `+` represents the |
||||
delete key, this function must receive a borrowed string and turn this string into the string without |
||||
the backspaces and the deletes. Example: `delete_and_backspace("bpp--o+erroi-+cw") // output: "borrow"`
|
||||
- `is_correct` that borrows a Vector of string literals with some correct and incorrect math equations |
||||
and replaces the correct equations with `✔` and the wrong with `✘` and returns a `usize` with the percentage |
||||
of correct equations. |
||||
|
||||
|
||||
### Example |
||||
|
||||
```rust |
||||
fn main() { |
||||
let mut a = String::from("bpp--o+er+++sskroi-++lcw"); |
||||
let mut b: Vec<&str> = vec!["2+2=4", "3+2=5", "10-3=3", "5+5=10"]; |
||||
|
||||
// - If a value does **not implement Copy**, it must be **borrowed** and so will be passed by **reference**.
|
||||
delete_and_backspace(&mut a); // the reference of the value
|
||||
let per = is_correct(&mut b); // the reference of the value
|
||||
|
||||
println!("{:?}", (a, b, per)); |
||||
// output: ("borrow", ["✔", "✔", "✘", "✔"], 75)
|
||||
} |
||||
``` |
||||
|
||||
### Notions |
||||
|
||||
- https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html
|
||||
- https://docs.rs/meval/0.2.0/meval/
|
||||
|
||||
*/ |
||||
use borrow_me_the_reference::*; |
||||
//use meval::eval_str;
|
||||
|
||||
// fn d_a_b(s: String) -> String {
|
||||
// let mut new_string = String::new();
|
||||
// let mut count = 0;
|
||||
// for v in s.chars() {
|
||||
// if count != 0 && v != '+' {
|
||||
// count -= 1;
|
||||
// continue;
|
||||
// }
|
||||
// if v == '+' {
|
||||
// count += 1;
|
||||
// continue;
|
||||
// }
|
||||
// new_string.push(v);
|
||||
// if v == '-' {
|
||||
// new_string.pop();
|
||||
// new_string.pop();
|
||||
// }
|
||||
// }
|
||||
// new_string
|
||||
// }
|
||||
// - If a value does **not implement Copy**, it must be **borrowed** and so will be passed by **reference**.
|
||||
// this is not good in rust because strings are not to be manipulated like this
|
||||
// but its a good view for the students to see how memory works in rust
|
||||
// fn delete_and_backspace(s: &mut String) {
|
||||
// let a = d_a_b(s.clone());
|
||||
// s.clear();
|
||||
// s.push_str(&a);
|
||||
// }
|
||||
|
||||
// - If a value does **not implement Copy**, it must be **borrowed** and so will be passed by **reference**.
|
||||
// fn is_correct(v: &mut Vec<&str>) -> usize {
|
||||
// let mut percentage = 0;
|
||||
// for (i, equation) in v.clone().iter().enumerate() {
|
||||
// let a: Vec<&str> = equation.split('=').collect();
|
||||
// if eval_str(a[0]).unwrap() == a[1].parse::<f64>().unwrap() {
|
||||
// v[i] = "✔";
|
||||
// percentage += 1;
|
||||
// } else {
|
||||
// v[i] = "✘";
|
||||
// }
|
||||
// }
|
||||
// (percentage * 100) / v.len()
|
||||
// }
|
||||
|
||||
#[test] |
||||
fn reference_string() { |
||||
let mut a_1 = String::from("bpp--o+er+++sskroi-++lcw"); |
||||
let mut a_2 = String::from("hs-+deasdasd------l+++dsdp"); |
||||
let mut a_3 = String::from("pad-rtic+eulqw--+rar"); |
||||
delete_and_backspace(&mut a_1); |
||||
delete_and_backspace(&mut a_2); |
||||
delete_and_backspace(&mut a_3); |
||||
assert_eq!(a_1, "borrow".to_string()); |
||||
assert_eq!(a_2, "help".to_string()); |
||||
assert_eq!(a_3, "particular".to_string()); |
||||
} |
||||
#[test] |
||||
fn reference_vec() { |
||||
let mut b_1: Vec<&str> = vec!["2+2=4", "3+2=5", "10-3=3", "5+5=10"]; |
||||
let mut b_2: Vec<&str> = vec!["1+2=4", "0+2=5", "10-3=3", "41+5=10"]; |
||||
let mut b_3: Vec<&str> = vec!["2+2=4", "3+2=5", "10-3=7", "5+5=10"]; |
||||
let result_1 = is_correct(&mut b_1); |
||||
let result_2 = is_correct(&mut b_2); |
||||
let result_3 = is_correct(&mut b_3); |
||||
assert_eq!(result_1, 75); |
||||
assert_eq!(result_2, 0); |
||||
assert_eq!(result_3, 100); |
||||
|
||||
assert_eq!(b_1, vec!["✔", "✔", "✘", "✔"]); |
||||
assert_eq!(b_2, vec!["✘", "✘", "✘", "✘"]); |
||||
assert_eq!(b_3, vec!["✔", "✔", "✔", "✔"]); |
||||
} |
||||
|
||||
fn main() { |
||||
let mut a = String::from("bpp--o+er+++sskroi-++lcw"); |
||||
let mut b: Vec<&str> = vec!["2+2=4", "3+2=5", "10-3=3", "5+5=10"]; |
||||
|
||||
// - If a value does **not implement Copy**, it must be **borrowed** and so will be passed by **reference**.
|
||||
delete_and_backspace(&mut a); // the reference of the value
|
||||
let per = is_correct(&mut b); // the reference of the value
|
||||
|
||||
println!("{:?}", (a, b, per)); |
||||
// output: ("borrow", ["✔", "✔", "✘", "✔"], 75)
|
||||
} |
@ -0,0 +1,55 @@
|
||||
## borrow_me_the_reference |
||||
|
||||
### Instructions |
||||
|
||||
Ownership is Rust's most unique feature, and it enables Rust to make memory safety guarantees without |
||||
needing garbage collector. Therefore you must understand ownership in rust. |
||||
|
||||
Create the following functions : |
||||
|
||||
- `delete_and_backspace`, imagine that `-` represents the backspace key and the `+` represents the delete key, this function must receive a borrowed string and turn this string into the string without the backspaces and the deletes. |
||||
|
||||
- `is_correct` that borrows a Vector of string literals with some correct and incorrect math equations and replaces the correct equations with `✔` and the wrong with `✘` and returns a `usize` with the percentage of correct equations. |
||||
|
||||
### Expected Functions |
||||
|
||||
```rust |
||||
pub fn delete_and_backspace(s: &mut String) { |
||||
} |
||||
|
||||
pub fn is_correct(v: &mut Vec<&str>) -> usize { |
||||
} |
||||
``` |
||||
|
||||
### Notions |
||||
|
||||
- https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html |
||||
- https://docs.rs/meval/0.2.0/meval/ |
||||
|
||||
|
||||
### Usage |
||||
|
||||
Here is a program to test your function |
||||
|
||||
```rust |
||||
use borrow_me_the_reference::{delete_and_backspace, is_correct}; |
||||
|
||||
fn main() { |
||||
let mut a = String::from("bpp--o+er+++sskroi-++lcw"); |
||||
let mut b: Vec<&str> = vec!["2+2=4", "3+2=5", "10-3=3", "5+5=10"]; |
||||
|
||||
// - If a value does **not implement Copy**, it must be **borrowed** and so will be passed by **reference**. |
||||
delete_and_backspace(&mut a); // the reference of the value |
||||
let per = is_correct(&mut b); // the reference of the value |
||||
|
||||
println!("{:?}", (a, b, per)); |
||||
// output: ("borrow", ["✔", "✔", "✘", "✔"], 75) |
||||
} |
||||
``` |
||||
|
||||
And its output |
||||
|
||||
```console |
||||
student@ubuntu:~/[[ROOT]]/test$ cargo run |
||||
student@ubuntu:~/[[ROOT]]/test$ |
||||
``` |
Loading…
Reference in new issue