Решение на Matrix 4 от Стоян Грозданов

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

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

Резултати

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

Код

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: 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.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.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

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

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 коментар)

Стоян качи първо решение на 14.11.2021 18:29 (преди почти 4 години)

Стоян качи решение на 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