Решение на Matrix 4 от Стоян Грозданов
Към профила на Стоян Грозданов
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 15 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20220112-2706256-1sdldrv/solution)
Finished test [unoptimized + debuginfo] target(s) in 7.86s
Running tests/solution_test.rs (target/debug/deps/solution_test-4c880d3f0adaac34)
running 15 tests
test solution_test::test_adding_int_and_string_negative ... ok
test solution_test::test_adding_int_and_string_positive ... ok
test solution_test::test_adding_int_and_string_unicode ... ok
test solution_test::test_adding_int_and_string_zero ... ok
test solution_test::test_adding_matrices_1 ... ok
test solution_test::test_adding_matrices_2 ... ok
test solution_test::test_blank_strings ... ok
test solution_test::test_iterating_i32s ... ok
test solution_test::test_iterating_strings ... ok
test solution_test::test_multiplying_int_and_string_negative ... ok
test solution_test::test_multiplying_int_and_string_positive ... ok
test solution_test::test_multiplying_int_and_string_unicode ... ok
test solution_test::test_multiplying_int_and_string_zero ... ok
test solution_test::test_multiplying_matrices_1 ... ok
test solution_test::test_multiplying_matrices_2 ... ok
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
История (2 версии и 1 коментар)
Стоян качи решение на 16.11.2021 20:07 (преди около 4 години)
use std::ops::{Add, Mul};
// --> Utility
pub trait Reversable {
fn reverse(&self) -> Self;
}
impl Reversable for String {
fn reverse(&self) -> Self {
self.chars().rev().collect()
}
}
// <-- Utility
// --> Cell
#[derive(Debug, Clone, PartialEq)]
pub struct Cell<T>(pub T);
-impl<T> Cell<T> {
- pub fn value(self) -> T {
- self.0
+impl<T: Clone> Cell<T> {
+ pub fn value(&self) -> T {
+ self.0.clone()
}
}
Интересно решение с reverse() :). Не мисля, че ти трябва value() обаче -- клонирането ми изглежда излишно. reverse приема &self, така че не би трябвало да му трябва пълен ownership над стойност. Мисля си, че спокойно можеш да заместиш self.value().reverse() със self.0.reverse(). Или ако това не работи, би трябвало да има начин да се подкара.
impl Add<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn add(self, rhs: Cell<String>) -> Self::Output {
- if self.0 >= 0 {
+ if self.value() >= 0 {
Cell(format!("{} {}", self.value(), rhs.value()))
} else {
Cell(format!("{} {}", rhs.value().reverse(), self.value().abs()))
}
}
}
impl Mul<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn mul(self, rhs: Cell<String>) -> Self::Output {
- if self.0 >= 0 {
+ if self.value() >= 0 {
Cell(rhs.value().repeat(self.value() as usize))
} else {
Cell(rhs.value().reverse().repeat(self.value().abs() as usize))
}
}
}
// <-- Cell
// --> Matrix
#[derive(Debug)]
pub struct Matrix<T: Clone> {
elements: Vec<Cell<T>>,
}
impl<T: Clone> Matrix<T> {
pub fn new(data: &[T; 4]) -> Matrix<T> {
Matrix {
elements: data
.into_iter()
.map(|element| Cell(element.clone()))
.collect(),
}
}
pub fn by_row(&self) -> Vec<Cell<T>> {
self.elements.clone()
}
pub fn by_col(&self) -> Vec<Cell<T>> {
vec![
self.elements[0].clone(),
self.elements[2].clone(),
self.elements[1].clone(),
self.elements[3].clone(),
]
}
}
impl Add<Matrix<String>> for Matrix<i32> {
type Output = Matrix<String>;
fn add(self, rhs: Matrix<String>) -> Self::Output {
Matrix {
elements: self
.by_row()
.into_iter()
.zip(rhs.by_row())
.map(|(number_cell, string_cell)| number_cell + string_cell)
.collect(),
}
}
}
impl Mul<Matrix<String>> for Matrix<i32> {
type Output = String;
fn mul(self, rhs: Matrix<String>) -> Self::Output {
self.by_row()
.into_iter()
.zip(rhs.by_col())
.map(|(number_cell, string_cell)| (number_cell * string_cell).value())
.reduce(|a, b| format!("{} {}", a, b))
.unwrap()
}
}
// <-- Matrix

Интересно решение с
reverse():). Не мисля, че ти трябваvalue()обаче -- клонирането ми изглежда излишно.reverseприема&self, така че не би трябвало да му трябва пълен ownership над стойност. Мисля си, че спокойно можеш да заместишself.value().reverse()съсself.0.reverse(). Или ако това не работи, би трябвало да има начин да се подкара.