Решение на Matrix 4 от Радослав Хубенов
Към профила на Радослав Хубенов
Резултати
- 16 точки от тестове
- 0 бонус точки
- 16 точки общо
- 12 успешни тест(а)
- 3 неуспешни тест(а)
Код
use std::ops::{Add, Mul};
#[derive(Debug)]
pub struct Matrix<T: Clone> {
cells: [[T; 2];2],
}
#[derive(Debug, Clone, PartialEq)]
pub struct Cell<T>(pub T);
impl Add<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn add(self, other: Cell<String>) -> Self::Output {
if self.0 >= 0 {
let mut num_str = self.0.to_string();
num_str.push(' ');
num_str.push_str(&other.0);
Cell(num_str)
} else {
let mut num_str = self.0.abs().to_string();
let mut rev_str = other.0.chars().rev().collect::<String>();
rev_str.push(' ');
rev_str.push_str(&num_str);
Cell(rev_str)
}
}
}
impl Mul<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn mul(self, other: Cell<String>) -> Self::Output {
if self.0 >= 0 {
let num = self.0;
let mut result = String::new();
for _ in 0..num {
result.push_str(&other.0);
}
Cell(result)
} else {
let num = self.0;
let mut rev_str = other.0.chars().rev().collect::<String>();
let mut result = String::new();
for _ in 0..num {
result.push_str(&other.0);
}
Cell(result)
}
}
}
impl<T: Clone> Matrix<T> {
/// Данните се очаква да бъдат подадени със статичен масив -- вижте по-долу за примери за
/// конструиране. Какви може да са елементите? Ще тестваме само с два типа: String и i32.
///
/// Очаква се да бъдат подадени по редове, от ляво надясно. Тоест, ако подадем като вход списък
/// с елементи: 1, 2, 3, 4, се очаква конструираната матрица:
///
/// | 1 2 |
/// | 3 4 |
///
/// Забележете, че подаваме като вход някакъв slice -- reference тип. Не очакваме матрицата да
/// държи reference, клонирайте си данните, за да имате ownership.
///
pub fn new(data: &[T; 4]) -> Matrix<T> {
Matrix {
cells: [
[data[0].clone(), data[1].clone()],
[data[2].clone(), data[3].clone()]
]
}
}
/// Връща вектор, който съдържа в себе си всички 4 елемента на матрицата, наредени по редове,
/// от ляво надясно и от горе надолу, обвити в `Cell`. Тоест, ако матрицата изглежда така:
///
/// | 1 2 |
/// | 3 4 |
///
/// Очакваме `.by_row` да върне елементите в ред: 1, 2, 3, 4
///
pub fn by_row(&self) -> Vec<Cell<T>> {
let mut vec = Vec::new();
for row in 0..2 {
for column in 0..2 {
vec.push(Cell(self.cells[row][column].clone()));
}
}
vec
}
/// Връща вектор, който съдържа в себе си всички 4 елемента на матрицата, наредени по колони,
/// от горе надолу и от ляво надясно, Обвити в `Cell`. Тоест, ако матрицата изглежда така:
///
/// | 1 2 |
/// | 3 4 |
///
/// Очакваме `.by_col` да върне елементите в ред: 1, 3, 2, 4
///
pub fn by_col(&self) -> Vec<Cell<T>> {
let mut vec = Vec::new();
for column in 0..2 {
for row in 0..2 {
vec.push(Cell(self.cells[row][column].clone()));
}
}
vec
}
}
impl Add<Matrix<String>> for Matrix<i32> {
type Output = Matrix<String>;
fn add(self, other: Matrix<String>) -> Self::Output {
let left_values = self.by_row();
let right_values = other.by_row();
let mut result = Vec::new();
for i in 0..4 {
let temp = left_values[i].clone() + right_values[i].clone();
result.push(temp.0);
}
Matrix::new(result.as_slice().try_into().unwrap())
}
}
impl Mul<Matrix<String>> for Matrix<i32> {
type Output = String;
fn mul(self, other: Matrix<String>) -> Self::Output {
let mut result = String::new();
let rows = self.by_row();
let columns = other.by_col();
for i in 0..4 {
result.push_str(&((rows[i].clone() * columns[i].clone()).0));
result.push(' ');
}
result.truncate(result.len() - 1);
result
}
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20220112-2706256-16qm0br/solution) warning: unused variable: `rev_str` --> src/lib.rs:48:21 | 48 | let mut rev_str = other.0.chars().rev().collect::<String>(); | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_rev_str` | = note: `#[warn(unused_variables)]` on by default warning: variable does not need to be mutable --> src/lib.rs:22:17 | 22 | let mut num_str = self.0.abs().to_string(); | ----^^^^^^^ | | | help: remove this `mut` | = note: `#[warn(unused_mut)]` on by default warning: variable does not need to be mutable --> src/lib.rs:48:17 | 48 | let mut rev_str = other.0.chars().rev().collect::<String>(); | ----^^^^^^^ | | | help: remove this `mut` warning: `solution` (lib) generated 3 warnings Finished test [unoptimized + debuginfo] target(s) in 7.57s 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 ... FAILED test solution_test::test_multiplying_int_and_string_positive ... ok test solution_test::test_multiplying_int_and_string_unicode ... FAILED 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 ... FAILED failures: ---- solution_test::test_multiplying_int_and_string_negative stdout ---- thread 'main' panicked at 'assertion failed: `(left == right)` left: `""`, right: `"!oow!oow"`', tests/solution_test.rs:88:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ---- solution_test::test_multiplying_int_and_string_unicode stdout ---- thread 'main' panicked at 'assertion failed: `(left == right)` left: `""`, right: `"апоапоапо"`', tests/solution_test.rs:97:5 ---- solution_test::test_multiplying_matrices_2 stdout ---- thread 'main' panicked at 'assertion failed: `(left == right)` left: `"едно "`, right: `"едно евдевдевд иритеч иритеч"`', tests/solution_test.rs:153:5 failures: solution_test::test_multiplying_int_and_string_negative solution_test::test_multiplying_int_and_string_unicode solution_test::test_multiplying_matrices_2 test result: FAILED. 12 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--test solution_test'
История (2 версии и 0 коментара)
Радослав качи решение на 18.11.2021 16:57 (преди почти 4 години)
+
use std::ops::{Add, Mul};
#[derive(Debug)]
pub struct Matrix<T: Clone> {
cells: [[T; 2];2],
}
#[derive(Debug, Clone, PartialEq)]
pub struct Cell<T>(pub T);
impl Add<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn add(self, other: Cell<String>) -> Self::Output {
if self.0 >= 0 {
let mut num_str = self.0.to_string();
num_str.push(' ');
num_str.push_str(&other.0);
Cell(num_str)
} else {
let mut num_str = self.0.abs().to_string();
- let mut rev_str = String::new();
-
-// for i in 0..other.0.len() {
-// rev_str.push(other.0[other.0.len() - 1 - i]);
-// }
+ let mut rev_str = other.0.chars().rev().collect::<String>();
rev_str.push(' ');
rev_str.push_str(&num_str);
Cell(rev_str)
}
}
}
impl Mul<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn mul(self, other: Cell<String>) -> Self::Output {
if self.0 >= 0 {
let num = self.0;
let mut result = String::new();
for _ in 0..num {
result.push_str(&other.0);
}
Cell(result)
} else {
- let mut num_str = self.0.abs().to_string();
- let mut rev_str = String::new();
-
-// for i in 0..other.0.len() {
-// rev_str.push(other.0[other.0.len() - 1 - i]);
-// }
+ let num = self.0;
+ let mut rev_str = other.0.chars().rev().collect::<String>();
- rev_str.push(' ');
- rev_str.push_str(&num_str);
- Cell(rev_str)
+ let mut result = String::new();
+
+ for _ in 0..num {
+ result.push_str(&other.0);
+ }
+
+ Cell(result)
}
}
}
impl<T: Clone> Matrix<T> {
/// Данните се очаква да бъдат подадени със статичен масив -- вижте по-долу за примери за
/// конструиране. Какви може да са елементите? Ще тестваме само с два типа: String и i32.
///
/// Очаква се да бъдат подадени по редове, от ляво надясно. Тоест, ако подадем като вход списък
/// с елементи: 1, 2, 3, 4, се очаква конструираната матрица:
///
/// | 1 2 |
/// | 3 4 |
///
/// Забележете, че подаваме като вход някакъв slice -- reference тип. Не очакваме матрицата да
/// държи reference, клонирайте си данните, за да имате ownership.
///
pub fn new(data: &[T; 4]) -> Matrix<T> {
Matrix {
cells: [
[data[0].clone(), data[1].clone()],
[data[2].clone(), data[3].clone()]
]
}
}
/// Връща вектор, който съдържа в себе си всички 4 елемента на матрицата, наредени по редове,
/// от ляво надясно и от горе надолу, обвити в `Cell`. Тоест, ако матрицата изглежда така:
///
/// | 1 2 |
/// | 3 4 |
///
/// Очакваме `.by_row` да върне елементите в ред: 1, 2, 3, 4
///
pub fn by_row(&self) -> Vec<Cell<T>> {
let mut vec = Vec::new();
for row in 0..2 {
for column in 0..2 {
vec.push(Cell(self.cells[row][column].clone()));
}
}
vec
}
/// Връща вектор, който съдържа в себе си всички 4 елемента на матрицата, наредени по колони,
/// от горе надолу и от ляво надясно, Обвити в `Cell`. Тоест, ако матрицата изглежда така:
///
/// | 1 2 |
/// | 3 4 |
///
/// Очакваме `.by_col` да върне елементите в ред: 1, 3, 2, 4
///
pub fn by_col(&self) -> Vec<Cell<T>> {
let mut vec = Vec::new();
for column in 0..2 {
for row in 0..2 {
vec.push(Cell(self.cells[row][column].clone()));
}
}
vec
}
}
impl Add<Matrix<String>> for Matrix<i32> {
type Output = Matrix<String>;
fn add(self, other: Matrix<String>) -> Self::Output {
let left_values = self.by_row();
let right_values = other.by_row();
let mut result = Vec::new();
for i in 0..4 {
let temp = left_values[i].clone() + right_values[i].clone();
result.push(temp.0);
}
Matrix::new(result.as_slice().try_into().unwrap())
}
}
impl Mul<Matrix<String>> for Matrix<i32> {
type Output = String;
fn mul(self, other: Matrix<String>) -> Self::Output {
let mut result = String::new();
let rows = self.by_row();
let columns = other.by_col();
for i in 0..4 {
result.push_str(&((rows[i].clone() * columns[i].clone()).0));
result.push(' ');
}
result.truncate(result.len() - 1);
result
}
-}
+}