Решение на упр.03 задача 3 от Георги Стоянов

Обратно към всички решения

Към профила на Георги Стоянов

Резултати

  • 1 точка от тестове
  • 0 бонус точки
  • 1 точка общо
  • 1 успешни тест(а)
  • 1 неуспешни тест(а)

Код

use std::collections::HashMap;
enum Event {
Login {
user: String,
timestamp: u64,
},
Logout {
user: String,
timestamp: u64,
},
Purchase {
user: String,
item: String,
amount: f64,
timestamp: u64,
},
Error {
code: i32,
message: String,
timestamp: u64,
},
}
struct EventLog {
events: Vec<Event>,
}
impl EventLog {
fn new() -> Self {
Self { events: Vec::new() }
}
fn add_event(&mut self, event: Event) {
self.events.push(event);
}
fn user_spent(&self, user: &str) -> f64 {
let mut spent = 0.0;
for event in &self.events {
match event {
Event::Purchase {
user: name, amount, ..
} if name == user => {
spent += *amount;
}
_ => continue,
}
}
spent
}
fn summaries_by_type(&self) -> HashMap<String, usize> {
let mut map = HashMap::new();
for event in &self.events {
match event {
Event::Error { .. } => *map.entry("Error".to_string()).or_insert(0) += 1,
Event::Login { .. } => *map.entry("Login".to_string()).or_insert(0) += 1,
Event::Logout { .. } => *map.entry("Logout".to_string()).or_insert(0) += 1,
Event::Purchase { .. } => *map.entry("Purchase".to_string()).or_insert(0) += 1,
}
}
map
}
fn filter_events(&self, user: Option<&str>, after: Option<u64>) -> Vec<&Event> {
let mut result = Vec::new();
match (user, after) {
(None, None) => {
// Return all events
for event in &self.events {
result.push(event);
}
}
(Some(u), Some(t)) => {
for event in &self.events {
match event {
Event::Error { .. } => continue,
Event::Login {
user: name,
timestamp,
}
| Event::Logout {
user: name,
timestamp,
}
| Event::Purchase {
user: name,
timestamp,
..
} if name == u && *timestamp > t => {
result.push(event);
}
_ => {}
}
}
}
_ => {}
}
result
}
}
fn main() {
}

Лог от изпълнението

Updating crates.io index
     Locking 17 packages to latest compatible versions
   Compiling proc-macro2 v1.0.103
   Compiling quote v1.0.41
   Compiling unicode-ident v1.0.22
   Compiling futures-core v0.3.31
   Compiling futures-sink v0.3.31
   Compiling futures-channel v0.3.31
   Compiling futures-task v0.3.31
   Compiling futures-io v0.3.31
   Compiling syn v2.0.108
   Compiling memchr v2.7.6
   Compiling pin-project-lite v0.2.16
   Compiling slab v0.4.11
   Compiling pin-utils v0.1.0
   Compiling solution v0.1.0 (/tmp/d20251030-1757769-a4vnx9/solution)
warning: enum `Event` is never used
 --> src/lib.rs:3:6
  |
3 | enum Event {
  |      ^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: struct `EventLog` is never constructed
  --> src/lib.rs:25:8
   |
25 | struct EventLog {
   |        ^^^^^^^^

warning: associated items `new`, `add_event`, `user_spent`, `summaries_by_type`, and `filter_events` are never used
  --> src/lib.rs:30:8
   |
29 | impl EventLog {
   | ------------- associated items in this implementation
30 |     fn new() -> Self {
   |        ^^^
...
33 |     fn add_event(&mut self, event: Event) {
   |        ^^^^^^^^^
...
36 |     fn user_spent(&self, user: &str) -> f64 {
   |        ^^^^^^^^^^
...
51 |     fn summaries_by_type(&self) -> HashMap<String, usize> {
   |        ^^^^^^^^^^^^^^^^^
...
63 |     fn filter_events(&self, user: Option<&str>, after: Option<u64>) -> Vec<&Event> {
   |        ^^^^^^^^^^^^^

warning: function `main` is never used
   --> src/lib.rs:101:4
    |
101 | fn main() {
    |    ^^^^

warning: `solution` (lib) generated 4 warnings
   Compiling futures-macro v0.3.31
   Compiling futures-util v0.3.31
   Compiling futures-executor v0.3.31
   Compiling futures v0.3.31
warning: function `main` is never used
   --> tests/../src/lib.rs:101:4
    |
101 | fn main() {
    |    ^^^^
    |
    = note: `#[warn(dead_code)]` on by default

warning: `solution` (test "solution_test") generated 1 warning
    Finished `test` profile [unoptimized + debuginfo] target(s) in 9.08s
     Running tests/solution_test.rs (target/debug/deps/solution_test-bfd50394249726db)

running 2 tests
test solution_test::test_empty ... ok
test solution_test::test_basic ... FAILED

failures:

---- solution_test::test_basic stdout ----
thread 'solution_test::test_basic' panicked at tests/solution_test.rs:116:9:
assertion failed: filtered.len() == expected.len() &&
    std::iter::zip(&filtered, expected).all(|(a, b)| eq_event(a, b))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    solution_test::test_basic

test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

error: test failed, to rerun pass `--test solution_test`

История (2 версии и 0 коментара)

Георги качи първо решение на 24.10.2025 12:34 (преди 7 дена)

Георги качи решение на 28.10.2025 16:27 (преди 2 дена)

use std::collections::HashMap;
enum Event {
Login {
user: String,
timestamp: u64,
},
Logout {
user: String,
timestamp: u64,
},
Purchase {
user: String,
item: String,
amount: f64,
timestamp: u64,
},
Error {
code: i32,
message: String,
timestamp: u64,
},
}
struct EventLog {
events: Vec<Event>,
}
impl EventLog {
fn new() -> Self {
Self { events: Vec::new() }
}
fn add_event(&mut self, event: Event) {
self.events.push(event);
}
fn user_spent(&self, user: &str) -> f64 {
let mut spent = 0.0;
for event in &self.events {
match event {
Event::Purchase {
user: name, amount, ..
} if name == user => {
spent += *amount;
}
_ => continue,
}
}
spent
}
fn summaries_by_type(&self) -> HashMap<String, usize> {
let mut map = HashMap::new();
for event in &self.events {
match event {
Event::Error { .. } => *map.entry("Error".to_string()).or_insert(0) += 1,
Event::Login { .. } => *map.entry("Login".to_string()).or_insert(0) += 1,
Event::Logout { .. } => *map.entry("Logout".to_string()).or_insert(0) += 1,
Event::Purchase { .. } => *map.entry("Purchase".to_string()).or_insert(0) += 1,
}
}
map
}
fn filter_events(&self, user: Option<&str>, after: Option<u64>) -> Vec<&Event> {
let mut result = Vec::new();
match (user, after) {
(None, None) => {
// Return all events
for event in &self.events {
result.push(event);
}
}
(Some(u), Some(t)) => {
for event in &self.events {
match event {
Event::Error { .. } => continue,
Event::Login {
user: name,
timestamp,
}
| Event::Logout {
user: name,
timestamp,
}
| Event::Purchase {
user: name,
timestamp,
..
} if name == u && *timestamp > t => {
result.push(event);
}
_ => {}
}
}
}
_ => {}
}
result
}
}
-fn test_empty() {
- let mut log = EventLog::new();
-
- assert_eq!(log.user_spent("Пешо"), 0.0);
- assert_eq!(log.summaries_by_type(), HashMap::new());
- assert!(matches!(log.filter_events(None, None).as_slice(), &[]));
- assert!(matches!(
- log.filter_events(Some("Пешо"), None).as_slice(),
- &[]
- ));
- assert!(matches!(log.filter_events(None, Some(100)).as_slice(), &[]));
-}
-
-fn test_basic() {
- let mut log = EventLog::new();
-
- log.add_event(Event::Login {
- user: "Пешо".to_string(),
- timestamp: 123,
- });
- log.add_event(Event::Login {
- user: "Тошо".to_string(),
- timestamp: 125,
- });
- log.add_event(Event::Purchase {
- user: "Пешо".to_string(),
- timestamp: 130,
- item: "мечка".to_string(),
- amount: 11.0,
- });
- log.add_event(Event::Error {
- code: 1404,
- timestamp: 133,
- message: "свършиха мечките".to_string(),
- });
- log.add_event(Event::Logout {
- user: "Тошо".to_string(),
- timestamp: 135,
- });
- log.add_event(Event::Purchase {
- user: "Пешо".to_string(),
- timestamp: 140,
- item: "мечка".to_string(),
- amount: 11.5,
- });
- log.add_event(Event::Purchase {
- user: "Пешо".to_string(),
- timestamp: 141,
- item: "мечка".to_string(),
- amount: 11.5,
- });
- log.add_event(Event::Logout {
- user: "Пешо".to_string(),
- timestamp: 143,
- });
-
- assert_eq!(
- log.summaries_by_type(),
- [
- ("Login".to_string(), 2),
- ("Logout".to_string(), 2),
- ("Purchase".to_string(), 3),
- ("Error".to_string(), 1)
- ]
- .into_iter()
- .collect::<HashMap<_, _>>(),
- );
-
- assert_eq!(log.user_spent("Пешо"), 34.0);
- assert_eq!(log.user_spent("Тошо"), 0.0);
- assert_eq!(log.user_spent("Гошо"), 0.0);
-
- assert!(matches!(
- log.filter_events(Some("Пешо"), None).as_slice(),
- &[
- Event::Login { .. },
- Event::Purchase { .. },
- Event::Purchase { .. },
- Event::Purchase { .. },
- Event::Logout { .. },
- ]
- ));
-
- assert!(matches!(
- log.filter_events(None, Some(140)).as_slice(),
- &[
- Event::Purchase { timestamp: 140, .. },
- Event::Purchase { timestamp: 141, .. },
- Event::Logout { timestamp: 143, .. },
- ]
- ));
-
- assert!(matches!(
- log.filter_events(Some("Гошо"), Some(140)).as_slice(),
- &[
- Event::Purchase { timestamp: 140, .. },
- Event::Purchase { timestamp: 141, .. },
- Event::Logout { timestamp: 143, .. },
- ]
- ));
-}
-
fn main() {
- test_empty();
- test_basic();
}