Решение на 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()
. Или ако това не работи, би трябвало да има начин да се подкара.