Решение на Matrix 4 от Георги Събев

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

Към профила на Георги Събев

Резултати

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

Код

use std::ops::{Add, Mul};
#[derive(Debug)]
pub struct Matrix<T: Clone> {
values: Vec<T>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Cell<T>(pub T);
impl<T: Clone> Matrix<T> {
pub fn new(data: &[T; 4]) -> Matrix<T> {
let mut vals: Vec<T> = Vec::new();
for val in data.iter() {
vals.push(val.clone());
}
Matrix { values: vals }
}
pub fn by_row(&self) -> Vec<Cell<T>> {
let mut vals: Vec<Cell<T>> = Vec::new();
for val in self.values.iter() {
vals.push(Cell(val.clone()));
}
vals
}
pub fn by_col(&self) -> Vec<Cell<T>> {
let mut vals: Vec<Cell<T>> = Vec::new();
vals.push(Cell(self.values[0].clone()));
vals.push(Cell(self.values[2].clone()));
vals.push(Cell(self.values[1].clone()));
vals.push(Cell(self.values[3].clone()));
vals
}
}
impl Add<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn add(self, rhs: Cell<String>) -> Cell<String> {
let count = self.0;
let txt = rhs.0;
let abs_count: usize = count.abs() as usize;
if count < 0 {
let txt_reversed: String = txt.chars().rev().collect();
return Cell(txt_reversed + " " + &abs_count.to_string());
}
Cell(count.to_string() + " " + &txt)
}
}
impl Mul<Cell<String>> for Cell<i32> {
type Output = Cell<String>;
fn mul(self, rhs: Cell<String>) -> Cell<String> {
let count = self.0;
let txt = rhs.0;
let abs_count: usize = count.abs() as usize;
if count < 0 {
let txt_reversed: String = txt.chars().rev().collect();
return Cell(txt_reversed.repeat(abs_count));
} else if count > 0 {
return Cell(txt.repeat(abs_count));
}
Cell(String::from(""))
}
}
impl Add<Matrix<String>> for Matrix<i32> {
type Output = Matrix<String>;
fn add(self, rhs: Matrix<String>) -> Self::Output {
let mut res: Vec<String> = Vec::new();
let l = self.by_row();
let r = rhs.by_row();
for _i in 0..4 {
res.push((l[_i].clone() + r[_i].clone()).0);
}
Matrix { values: res }
}
}
impl Mul<Matrix<String>> for Matrix<i32> {
type Output = String;
fn mul(self, rhs: Matrix<String>) -> String {
let mut res: Vec<String> = Vec::new();
let l = self.by_row();
let r = rhs.by_col();
for _i in 0..4 {
res.push((l[_i].clone() * r[_i].clone()).0);
}
res.join(" ")
}
}

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

Compiling solution v0.1.0 (/tmp/d20220112-2706256-qw569s/solution)
    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 ... 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

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

Георги качи първо решение на 17.11.2021 01:24 (преди почти 4 години)

Привет! Не съм разбрал, че било хубаво да си качваме нашите тестове, с които сме си тествали задачата преди предаване.

Но сега вече знам, та ето ги моите: https://pastebin.com/Z2ZjCveg

( Когато качих тестовете си за това домашно, качих и тестовете, които писах за 1. домашно. Малко "след дъжд - качулка", но все пак при интерес можете да ги видите в коментара ми под решението там. )

P.S. Не знаех как да направя цялото да ми се форматира като код в коментара ... затова ползвах pastebin :)

( Ако някой все пак може да каже, ще съм благодарен :D )

За да сложиш форматиран код, може да ползваш три backtick-а: ```. Поддържаме github-flavored markdown (макар че не съм сигурен доколко): https://github.github.com/gfm/#fenced-code-blocks

Тестовете не са лоши -- добре си се сетил да тестваш примерно празни низове, умножение по 0. Не виждам да си тествал unicode низове, които са добра идея ако ще правиш манипулация (в случая, обръщане) на низове. Кирилица, emoji, такива неща.

Имаш и един тест, в който има един голям низ. Не бих казал, че си заслужава да го има. Размера не би трябвало да има голямо значение за ситуацията, а ако има (рендериране на големи низове в templates примерно), може би има смисъл да го сложиш в отделен файл, или да го генерираш по някакъв начин, защото иначе теста става труден за четене и разбиране.