mirror of https://github.com/01-edu/public.git
lee
4 years ago
8 changed files with 404 additions and 0 deletions
@ -0,0 +1,12 @@ |
|||||||
|
# This file is automatically @generated by Cargo. |
||||||
|
# It is not intended for manual editing. |
||||||
|
[[package]] |
||||||
|
name = "project_motion" |
||||||
|
version = "0.1.0" |
||||||
|
|
||||||
|
[[package]] |
||||||
|
name = "project_motion_test" |
||||||
|
version = "0.1.0" |
||||||
|
dependencies = [ |
||||||
|
"project_motion", |
||||||
|
] |
@ -0,0 +1,10 @@ |
|||||||
|
[package] |
||||||
|
name = "project_motion_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] |
||||||
|
project_motion = { path = "../../../../rust-piscine-solutions/project_motion"} |
@ -0,0 +1,56 @@ |
|||||||
|
use project_motion::*; |
||||||
|
|
||||||
|
fn main() { |
||||||
|
let mut obj = Object::throw_object(50.0, 150.0); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
} |
||||||
|
|
||||||
|
#[cfg(test)] |
||||||
|
mod tests { |
||||||
|
use super::*; |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn test_short_distance() { |
||||||
|
let mut object = Object::throw_object(50.0, 20.0); |
||||||
|
|
||||||
|
assert_eq!(object.next(), Some(Object { distance: 50.0, velocity: 50.0, height: 15.1, time: 1.0 })); |
||||||
|
assert_eq!(object, Object { distance: 50.0, velocity: 50.0, height: 15.1, time: 1.0 }); |
||||||
|
|
||||||
|
assert!(object.next().is_none(), "{:?} instead of None", object); |
||||||
|
assert!(object.next().is_none(), "{:?} instead of None", object); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn test_media_distance() { |
||||||
|
let mut object = Object::throw_object(100.0, 30.0); |
||||||
|
|
||||||
|
assert_eq!(object.next(), Some(Object { distance: 100.0, velocity: 100.0, height: 25.1, time: 1.0 })); |
||||||
|
assert_eq!(object, Object { distance: 100.0, velocity: 100.0, height: 25.1, time: 1.0 }); |
||||||
|
|
||||||
|
assert_eq!(object.next(), Some(Object { distance: 200.0, velocity: 100.0, height: 5.5, time: 2.0 })); |
||||||
|
assert_eq!(object, Object { distance: 200.0, velocity: 100.0, height: 5.5, time: 2.0 }); |
||||||
|
|
||||||
|
assert!(object.next().is_none(), "{:?} instead of None", object); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn test_long_distance() { |
||||||
|
let mut object = Object::throw_object(120.0, 100.0); |
||||||
|
|
||||||
|
assert_eq!(object.next(), Some(Object { distance: 120.0, velocity: 120.0, height: 95.1, time: 1.0 })); |
||||||
|
assert_eq!(object, Object { distance: 120.0, velocity: 120.0, height: 95.1, time: 1.0 }); |
||||||
|
|
||||||
|
assert_eq!(object.next(), Some(Object { distance: 240.0, velocity: 120.0, height: 75.5, time: 2.0 })); |
||||||
|
assert_eq!(object, Object { distance: 240.0, velocity: 120.0, height: 75.5, time: 2.0 }); |
||||||
|
|
||||||
|
assert_eq!(object.next(), Some(Object { distance: 360.0, velocity: 120.0, height: 31.4, time: 3.0 })); |
||||||
|
assert_eq!(object, Object { distance: 360.0, velocity: 120.0, height: 31.4, time: 3.0 }); |
||||||
|
|
||||||
|
assert!(object.next().is_none(), "{:?} instead of None", object); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
# This file is automatically @generated by Cargo. |
||||||
|
# It is not intended for manual editing. |
||||||
|
[[package]] |
||||||
|
name = "sales" |
||||||
|
version = "0.1.0" |
||||||
|
|
||||||
|
[[package]] |
||||||
|
name = "sales_test" |
||||||
|
version = "0.1.0" |
||||||
|
dependencies = [ |
||||||
|
"sales", |
||||||
|
] |
@ -0,0 +1,10 @@ |
|||||||
|
[package] |
||||||
|
name = "sales_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] |
||||||
|
sales = { path = "../../../../rust-piscine-solutions/sales"} |
@ -0,0 +1,133 @@ |
|||||||
|
use sales::*; |
||||||
|
|
||||||
|
fn main() { |
||||||
|
let store = Store::new(vec![ |
||||||
|
(String::from("product A"), 1.23), |
||||||
|
(String::from("product B"), 23.1), |
||||||
|
(String::from("product C"), 3.12)]); |
||||||
|
|
||||||
|
println!("{:?}", store); |
||||||
|
// output:
|
||||||
|
// Store { products: [("product A", 1.23), ("product B", 23.1), ("product C", 3.12)] }
|
||||||
|
|
||||||
|
let mut cart = Cart::new(); |
||||||
|
cart.insert_item(&store, String::from("product A")); |
||||||
|
cart.insert_item(&store, String::from("product B")); |
||||||
|
cart.insert_item(&store, String::from("product C")); |
||||||
|
|
||||||
|
println!("{:?}", cart.generate_receipt()); |
||||||
|
// output:
|
||||||
|
// [1.17, 2.98, 22.07]
|
||||||
|
|
||||||
|
println!("{:?}", cart); |
||||||
|
// output:
|
||||||
|
// Cart { items: [("product A", 1.23), ("product B", 23.1), ("product C", 3.12)], receipt: [1.17, 2.98, 22.07] }
|
||||||
|
} |
||||||
|
#[cfg(test)] |
||||||
|
mod tests { |
||||||
|
use super::*; |
||||||
|
|
||||||
|
#[derive(Debug)] |
||||||
|
struct Tests { |
||||||
|
store: Store, |
||||||
|
carts: Vec<(Cart, Vec<f32>)>, |
||||||
|
} |
||||||
|
|
||||||
|
fn add_items(s: &Store, items: Vec<&str>, c: &mut Cart) { |
||||||
|
for item in items.iter() { |
||||||
|
c.insert_item(s, item.to_string()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Tests { |
||||||
|
fn new() -> Tests { |
||||||
|
let store = Store::new(vec![ |
||||||
|
(String::from("product A"), 1.23), |
||||||
|
(String::from("product B"), 23.1), |
||||||
|
(String::from("product C"), 3.12), |
||||||
|
(String::from("product D"), 9.75), |
||||||
|
(String::from("product E"), 1.75), |
||||||
|
(String::from("product F"), 23.75), |
||||||
|
(String::from("product G"), 2.75), |
||||||
|
(String::from("product H"), 1.64), |
||||||
|
(String::from("product I"), 15.23), |
||||||
|
(String::from("product J"), 2.10), |
||||||
|
(String::from("product K"), 54.91), |
||||||
|
(String::from("product L"), 43.99), |
||||||
|
]); |
||||||
|
|
||||||
|
let mut c = Cart::new(); |
||||||
|
let mut c1 = Cart::new(); |
||||||
|
let mut c2 = Cart::new(); |
||||||
|
let mut c3 = Cart::new(); |
||||||
|
add_items(&store, vec!["product A", "product B", "product C"], &mut c); |
||||||
|
let sol = vec![1.17, 2.98, 22.07]; |
||||||
|
add_items( |
||||||
|
&store, |
||||||
|
vec![ |
||||||
|
"product A", |
||||||
|
"product B", |
||||||
|
"product C", |
||||||
|
"product D", |
||||||
|
"product E", |
||||||
|
"product F", |
||||||
|
"product G", |
||||||
|
], |
||||||
|
&mut c1, |
||||||
|
); |
||||||
|
let sol1 = vec![1.17, 1.67, 2.62, 2.98, 9.31, 22.05, 22.67]; |
||||||
|
add_items( |
||||||
|
&store, |
||||||
|
vec![ |
||||||
|
"product A", |
||||||
|
"product B", |
||||||
|
"product C", |
||||||
|
"product D", |
||||||
|
"product E", |
||||||
|
"product F", |
||||||
|
"product G", |
||||||
|
"product H", |
||||||
|
"product I", |
||||||
|
], |
||||||
|
&mut c2, |
||||||
|
); |
||||||
|
let sol2 = vec![1.16, 1.55, 1.65, 2.6, 2.94, 9.2, 14.38, 21.8, 22.42]; |
||||||
|
add_items( |
||||||
|
&store, |
||||||
|
vec![ |
||||||
|
"product A", |
||||||
|
"product B", |
||||||
|
"product C", |
||||||
|
"product D", |
||||||
|
"product E", |
||||||
|
"product F", |
||||||
|
"product G", |
||||||
|
"product H", |
||||||
|
"product I", |
||||||
|
"product J", |
||||||
|
"product K", |
||||||
|
"product L", |
||||||
|
], |
||||||
|
&mut c3, |
||||||
|
); |
||||||
|
let sol3 = vec![ |
||||||
|
1.18, 1.58, 1.69, 2.02, 2.65, 3.01, 9.39, 14.67, 22.25, 22.88, 42.38, 52.89, |
||||||
|
]; |
||||||
|
|
||||||
|
Tests { |
||||||
|
store, |
||||||
|
carts: vec![(c, sol), (c1, sol1), (c2, sol2), (c3, sol3)], |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn test_generate_receipt() { |
||||||
|
let cases = Tests::new(); |
||||||
|
|
||||||
|
for (mut c, sol) in cases.carts.into_iter() { |
||||||
|
assert_eq!(c.generate_receipt(), sol); |
||||||
|
assert_eq!(c.receipt, sol); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
## project_motion |
||||||
|
|
||||||
|
### Instructions |
||||||
|
|
||||||
|
For this exercise you will have to create a [projectile motion](https://cimg2.ck12.org/datastreams/f-d%3Abb024be6673110b31e78b46819e792adaed8dc661e082a61f0a6d64e%2BIMAGE%2BIMAGE.1). |
||||||
|
|
||||||
|
You will be provided with a structure called `Object` that will have all variables that are |
||||||
|
essential for the projectile physics. (distance, velocity, height, time) |
||||||
|
|
||||||
|
You must implement : |
||||||
|
|
||||||
|
- A function `throw_object` that will initialize the Object with a given velocity and height. |
||||||
|
- The trait Iterator with the `.next()` in which it must calculate the next position of the object after 1 second. |
||||||
|
It will return an `Option` with the Object, It will return `None` if the object already reached the floor. |
||||||
|
|
||||||
|
### Expected Function |
||||||
|
|
||||||
|
```rust |
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq)] |
||||||
|
pub struct Object { |
||||||
|
pub distance: f32, |
||||||
|
pub velocity: f32, |
||||||
|
pub height: f32, |
||||||
|
pub time: f32, |
||||||
|
} |
||||||
|
|
||||||
|
impl Object { |
||||||
|
pub fn throw_object(velocity: f32, height: f32) -> Object {} |
||||||
|
} |
||||||
|
|
||||||
|
impl Iterator for Object { |
||||||
|
// next |
||||||
|
} |
||||||
|
|
||||||
|
``` |
||||||
|
|
||||||
|
### Usage |
||||||
|
|
||||||
|
Here is a program to test your function |
||||||
|
|
||||||
|
```rust |
||||||
|
fn main() { |
||||||
|
let mut obj = Object::throw_object(50.0, 150.0); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
println!("{:?}", obj.next()); |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
And its output: |
||||||
|
|
||||||
|
```console |
||||||
|
student@ubuntu:~/[[ROOT]]/test$ cargo run |
||||||
|
Some(Object { distance: 50.0, velocity: 50.0, height: 145.1, time: 1.0 }) |
||||||
|
Some(Object { distance: 100.0, velocity: 50.0, height: 125.5, time: 2.0 }) |
||||||
|
Some(Object { distance: 150.0, velocity: 50.0, height: 81.4, time: 3.0 }) |
||||||
|
Some(Object { distance: 200.0, velocity: 50.0, height: 3.0, time: 4.0 }) |
||||||
|
None |
||||||
|
None |
||||||
|
student@ubuntu:~/[[ROOT]]/test$ |
||||||
|
``` |
||||||
|
|
||||||
|
### Notions |
||||||
|
|
||||||
|
- https://doc.rust-lang.org/std/iter/trait.Iterator.html |
||||||
|
- https://doc.rust-lang.org/rust-by-example/trait/iter.html |
@ -0,0 +1,101 @@ |
|||||||
|
## sales |
||||||
|
|
||||||
|
### Instructions |
||||||
|
|
||||||
|
You will have to create a shopping system, where you will have a : |
||||||
|
|
||||||
|
- Store that will save all the products in it |
||||||
|
- Cart that will have `items`, that the client will buy, and a `receipt` |
||||||
|
|
||||||
|
This store is having a promotion, "Buy three and get one for free" (the free item must be the cheapest). The receipt must not present |
||||||
|
any value as 0, so you will have to apply the promotion to all items instead. |
||||||
|
|
||||||
|
### Expected Function |
||||||
|
|
||||||
|
```rust |
||||||
|
|
||||||
|
#[derive(Debug, Clone)] |
||||||
|
pub struct Store { |
||||||
|
pub products: Vec<(String, f32)>, |
||||||
|
} |
||||||
|
impl Store { |
||||||
|
pub fn new(products: Vec<(String, f32)>) -> Store { |
||||||
|
Store { products } |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Debug, Clone)] |
||||||
|
pub struct Cart { |
||||||
|
// expected public fields |
||||||
|
} |
||||||
|
impl Cart { |
||||||
|
pub fn new() -> Cart {} |
||||||
|
pub fn insert_item(&mut self, s: &Store, ele: String) {} |
||||||
|
pub fn get_prices(&self) -> Vec<f32> {} |
||||||
|
pub fn generate_receipt(&mut self) -> Vec<f32> {} |
||||||
|
} |
||||||
|
|
||||||
|
``` |
||||||
|
|
||||||
|
### Example |
||||||
|
|
||||||
|
`[1.23, 3.12, 23.1]` -> receipt will be `[1.17, 2.98, 22.07]` |
||||||
|
|
||||||
|
So `1.17 + 2.98 + 22.07 == 3.12 + 23.1 + 0` |
||||||
|
|
||||||
|
This is a percentage calculation, and it can be applied to a set of three items. |
||||||
|
If the client purchase 9 items it will be applied the promotion, three for free, to all items |
||||||
|
|
||||||
|
|--------------| |---------------| |---------------| |
||||||
|
`[1.23, 23.1, 3.12, 9.75, 1.75, 23.75, 2.75, 1.64, 15.23]` -> receipt will be `[1.16, 1.55, 1.65, 2.6, 2.94, 9.2, 14.38, 21.8, 22.42]` |
||||||
|
|
||||||
|
|--------| |--------| |--------| |
||||||
|
`[3.12, 9.75, 1.75, 23.75, 2.75, 1.64, 15.23]` -> receipt will be `[1.54, 1.65, 2.59, 2.94, 9.18, 14.34, 22.36]` |
||||||
|
|
||||||
|
and so on... (hint: Closures is the way) |
||||||
|
|
||||||
|
You will have to implement for the Cart structure the following function: |
||||||
|
|
||||||
|
- `new`, that will initialize the cart |
||||||
|
- `insert_item`, that will receive a reference to `Store` and a `String`. Just like the name says you will |
||||||
|
have to insert the item to the cart |
||||||
|
- `generate_receipt`, that returns a vector of sorted floats. This function must generate the receipt just |
||||||
|
like the example above, using the promotion. Also saving the result in the filed `receipt`. |
||||||
|
|
||||||
|
### Usage |
||||||
|
|
||||||
|
Here is a program to test your function |
||||||
|
|
||||||
|
```rust |
||||||
|
fn main() { |
||||||
|
let store = Store::new(vec![ |
||||||
|
(String::from("product A"), 1.23), |
||||||
|
(String::from("product B"), 23.1), |
||||||
|
(String::from("product C"), 3.12)]); |
||||||
|
|
||||||
|
println!("{:?}", store); |
||||||
|
|
||||||
|
let mut cart = Cart::new(); |
||||||
|
cart.insert_item(&store, String::from("product A")); |
||||||
|
cart.insert_item(&store, String::from("product B")); |
||||||
|
cart.insert_item(&store, String::from("product C")); |
||||||
|
|
||||||
|
println!("{:?}", cart.generate_receipt()); |
||||||
|
|
||||||
|
println!("{:?}", cart); |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
And its output: |
||||||
|
|
||||||
|
```console |
||||||
|
student@ubuntu:~/[[ROOT]]/test$ cargo run |
||||||
|
Store { products: [("product A", 1.23), ("product B", 23.1), ("product C", 3.12)] } |
||||||
|
[1.17, 2.98, 22.07] |
||||||
|
Cart { items: [("product A", 1.23), ("product B", 23.1), ("product C", 3.12)], receipt: [1.17, 2.98, 22.07] } |
||||||
|
student@ubuntu:~/[[ROOT]]/test$ |
||||||
|
``` |
||||||
|
|
||||||
|
### Notions |
||||||
|
|
||||||
|
- https://doc.rust-lang.org/rust-by-example/fn/closures.html |
Loading…
Reference in new issue