Решение на Matrix 4 от Александър Бакалов

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

Към профила на Александър Бакалов

Резултати

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

Код

use std::ops;
#[derive(Debug)]
pub struct Matrix<T: Clone> {
pub elements: Vec<Cell<T>>,
size: i32
}
impl ops::Add<Matrix<String>> for Matrix<i32> {
type Output = Matrix<String>;
fn add(self, _rhs: Matrix<String>) -> Matrix<String> {
if self.size != _rhs.size {
panic!("Error, matrix sizes don't match!");
}else {
let mut result : Matrix<String> = Matrix { elements: vec!(), size: self.size};
for (i, elem) in self.elements.iter().enumerate() {
result.elements.push(elem.clone() + _rhs.elements.get(i).unwrap().clone());
}
return result;
}
}
}
impl ops::Mul<Matrix<String>> for Matrix<i32> {
type Output = String;
fn mul(self, _rhs: Matrix<String>) -> String {
let mut result : String = String::from("");
if self.size != _rhs.size {
panic!("Error, matrix sizes don't match!");
}else {
let self_current_row = self.by_row();
let rhs_current_col = _rhs.by_col();
result += &(self_current_row[0].clone() * rhs_current_col[0].clone()).0;
result += " ";
result += &(self_current_row[1].clone() * rhs_current_col[1].clone()).0;
result += " ";
result += &(self_current_row[2].clone() * rhs_current_col[2].clone()).0;
result += " ";
result += &(self_current_row[3].clone() * rhs_current_col[3].clone()).0;
return result;
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Cell<T>(pub T);
impl ops::Add<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn add(self, _rhs: Cell<String>) -> Cell<String> {
if self.0 >= 0 {
let str = &self.0.to_string().add(" ").add(&_rhs.0);
return Cell(str.clone());
}else {
let str = String::from(_rhs.0.chars().rev().collect::<String>()).add(" ").add(&self.0.abs().to_string());
return Cell(str);
}
}
}
impl ops::Mul<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn mul(self, _rhs: Cell<String>) -> Cell<String> {
if self.0 >= 0 {
let mut result = String::from("");
for i in 0 .. self.0 {
result = result + &_rhs.0;
}
return Cell(result);
}else {
let mut result = String::from("");
for i in 0 .. self.0.abs() {
result = result + &_rhs.0.chars().rev().collect::<String>();
}
return Cell(result);
}
}
}
impl<T: Clone> Matrix<T> {
pub fn new(data: &[T; 4]) -> Matrix<T> {
let mut new_matrix : Matrix<T> = Matrix {
elements: Vec::new(),
size: 2
};
for current in data {
new_matrix.elements.push(Cell(current.clone()));
}
return new_matrix;
}
pub fn by_row(&self) -> Vec<Cell<T>> {
return self.elements.clone();
}
pub fn by_col(&self) -> Vec<Cell<T>> {
let mut result = vec!();
for (i, item) in self.elements.iter().enumerate() {
if i * 2 > self.size as usize {
break;
}
let mut current = i;
while current < self.elements.len() {
result.push(self.elements.get(current).unwrap().clone());
let size: usize = self.size as usize;
current += size;
}
}
return result;
}
}

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

Compiling solution v0.1.0 (/tmp/d20220112-2706256-o39ve2/solution)
warning: unused variable: `i`
  --> src/lib.rs:69:17
   |
69 |             for i in 0 .. self.0 {
   |                 ^ help: if this is intentional, prefix it with an underscore: `_i`
   |
   = note: `#[warn(unused_variables)]` on by default

warning: unused variable: `i`
  --> src/lib.rs:75:17
   |
75 |             for i in 0 .. self.0.abs() {
   |                 ^ help: if this is intentional, prefix it with an underscore: `_i`

warning: unused variable: `item`
   --> src/lib.rs:102:17
    |
102 |         for (i, item) in self.elements.iter().enumerate()  {
    |                 ^^^^ help: if this is intentional, prefix it with an underscore: `_item`

warning: `solution` (lib) generated 3 warnings
    Finished test [unoptimized + debuginfo] target(s) in 7.92s
     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.01s

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

Александър качи първо решение на 16.11.2021 22:40 (преди почти 4 години)