Решение на FMI Buzz от Ана Иванова

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

Към профила на Ана Иванова

Резултати

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

Код

/// Вход: променлива `n`, която описва броя елементи, които ще генерираме в резултата.
///
/// За всяко число от 1 до `n` включително, искаме съответстващия елемент в резултата да е:
///
/// - String със съдържание "Fizz" ако числото се дели на 3, но не на 5
/// - String със съдържание "Buzz" ако числото се дели на 5, но не на 3
/// - String със съдържание "Fizzbuzz" ако числото се дели и на 3, и на 5
/// - Числото конвертирано до низ, във всички други случаи
///
/// Тоест, във `fizzbuzz(3)`, първия елемент ще бъде `String::from("1")`, втория
/// `String::from("2")`, последния `String::from("Fizz")`.
///
/// Ако `n` е 0, очакваме празен вектор за резултат.
///
pub fn fizzbuzz(n: usize) -> Vec<String> {
return custom_buzz(n, 3, 5)
}
/// Вход:
/// - променлива `n`, която описва броя елементи, които ще генерираме в резултата.
/// - променливи `k1` и `k2`, които са двата делителя, които ще използваме за заместване.
///
/// За всяко число от 1 до `n` включително, искаме съответстващия елемент в резултата да е:
///
/// - String със съдържание "Fizz" ако числото се дели на k1, но не на k2
/// - String със съдържание "Buzz" ако числото се дели на k2, но не на k1
/// - String със съдържание "Fizzbuzz" ако числото се дели и на k1, и на k2
/// - Числото конвертирано до низ, във всички други случаи
///
/// Ако `n` е 0, очакваме празен вектор за резултат.
/// Ако `k1` или `k2` са 0 или 1, очакваме функцията да panic-не с каквото съобщение изберете.
///
pub fn custom_buzz(n: usize, k1: u8, k2: u8) -> Vec<String> {
let fizzbuzzer = FizzBuzzer {
k1: k1,
k2: k2,
labels: [String::from("Fizz"), String::from("Buzz"), String::from("Fizzbuzz")]
};
return fizzbuzzer.take(n);
}
fn check_divisor(div: u8) {
if div == 0 || div == 1 {
panic!("Does not support divisor {}", div)
}
}
/// Параметри:
/// - полета `k1` и `k2`, които са двата делителя, които ще използваме за заместване.
/// - поле `labels`, които са трите етикета, които съответстват на коефициентите
///
pub struct FizzBuzzer {
pub k1: u8,
pub k2: u8,
pub labels: [String; 3],
}
impl FizzBuzzer {
/// За всяко число от 1 до `n` включително, искаме съответстващия елемент в резултата да е:
///
/// - Първия String от полето `labels` ако числото се дели на k1, но не на k2
/// - Втория String от полето `labels` ако числото се дели на k2, но не на k1
/// - Третия String от полето `labels` ако числото се дели и на k1, и на k2
/// - Числото конвертирано до низ, във всички други случаи
///
/// Ако `n` е 0, очакваме празен вектор за резултат.
/// Ако `k1` или `k2` са 0 или 1, очакваме функцията да panic-не с каквото съобщение изберете.
///
pub fn take(&self, n: usize) -> Vec<String> {
check_divisor(self.k1);
check_divisor(self.k2);
let mut result: Vec<String> = Vec::with_capacity(n);
for i in 1..=n {
result.push(self.get_label(i));
}
result
}
/// Параметъра `index` указва кой етикет от полето `labels` променяме, от 0 до 2. Ако подадения
/// `index` е извън тези рамки, очакваме функцията да panic-не.
///
/// Стойността `value` е низа, който ще сложим на този индекс в полето `labels`.
///
pub fn change_label(&mut self, index: usize, value: &String) {
self.labels[index] = value.clone()
}
fn get_label(&self, n: usize) -> String {
let mult = (self.k1 * self.k2) as usize;
let k1 = self.k1 as usize;
let k2 = self.k2 as usize;
if n % mult == 0 {
return self.labels[2].clone();
} else if n % k1 == 0 {
return self.labels[0].clone();
} else if n % k2 == 0 {
return self.labels[1].clone();
}
return n.to_string();
}
}

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

Compiling solution v0.1.0 (/tmp/d20201028-2816268-1o8jd00/solution)
    Finished test [unoptimized + debuginfo] target(s) in 3.24s
     Running target/debug/deps/solution-ebb42508826ef2b4

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-9e954a53ed808c89

running 10 tests
test solution_test::test_change_label_basic ... ok
test solution_test::test_change_label_invalid ... ok
test solution_test::test_classic1 ... ok
test solution_test::test_classic2 ... ok
test solution_test::test_coefficients1 ... ok
test solution_test::test_coefficients2 ... ok
test solution_test::test_coefficients_invalid ... ok
test solution_test::test_struct_basic ... ok
test solution_test::test_struct_invalid ... ok
test solution_test::test_zeroes ... ok

test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests solution

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

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

Ана качи първо решение на 27.10.2020 20:51 (преди почти 5 години)

Ана качи решение на 27.10.2020 21:34 (преди почти 5 години)

/// Вход: променлива `n`, която описва броя елементи, които ще генерираме в резултата.
///
/// За всяко число от 1 до `n` включително, искаме съответстващия елемент в резултата да е:
///
/// - String със съдържание "Fizz" ако числото се дели на 3, но не на 5
/// - String със съдържание "Buzz" ако числото се дели на 5, но не на 3
/// - String със съдържание "Fizzbuzz" ако числото се дели и на 3, и на 5
/// - Числото конвертирано до низ, във всички други случаи
///
/// Тоест, във `fizzbuzz(3)`, първия елемент ще бъде `String::from("1")`, втория
/// `String::from("2")`, последния `String::from("Fizz")`.
///
/// Ако `n` е 0, очакваме празен вектор за резултат.
///
pub fn fizzbuzz(n: usize) -> Vec<String> {
- return custom_buzz(n, 3, 5)
- }
+ return custom_buzz(n, 3, 5)
-
+}
- /// Вход:
+
- /// - променлива `n`, която описва броя елементи, които ще генерираме в резултата.
+/// Вход:
- /// - променливи `k1` и `k2`, които са двата делителя, които ще използваме за заместване.
+/// - променлива `n`, която описва броя елементи, които ще генерираме в резултата.
- ///
+/// - променливи `k1` и `k2`, които са двата делителя, които ще използваме за заместване.
- /// За всяко число от 1 до `n` включително, искаме съответстващия елемент в резултата да е:
+///
- ///
+/// За всяко число от 1 до `n` включително, искаме съответстващия елемент в резултата да е:
- /// - String със съдържание "Fizz" ако числото се дели на k1, но не на k2
+///
- /// - String със съдържание "Buzz" ако числото се дели на k2, но не на k1
+/// - String със съдържание "Fizz" ако числото се дели на k1, но не на k2
- /// - String със съдържание "Fizzbuzz" ако числото се дели и на k1, и на k2
+/// - String със съдържание "Buzz" ако числото се дели на k2, но не на k1
- /// - Числото конвертирано до низ, във всички други случаи
+/// - String със съдържание "Fizzbuzz" ако числото се дели и на k1, и на k2
- ///
+/// - Числото конвертирано до низ, във всички други случаи
- /// Ако `n` е 0, очакваме празен вектор за резултат.
+///
- /// Ако `k1` или `k2` са 0 или 1, очакваме функцията да panic-не с каквото съобщение изберете.
+/// Ако `n` е 0, очакваме празен вектор за резултат.
- ///
+/// Ако `k1` или `k2` са 0 или 1, очакваме функцията да panic-не с каквото съобщение изберете.
- pub fn custom_buzz(n: usize, k1: u8, k2: u8) -> Vec<String> {
+///
- let unsupported_divisors = [0u8, 1u8];
+pub fn custom_buzz(n: usize, k1: u8, k2: u8) -> Vec<String> {
- if unsupported_divisors.contains(&k1) || unsupported_divisors.contains(&k2) {
+ let fizzbuzzer = FizzBuzzer {
- panic!("Does not support 0 and 1 divisors")
+ k1: k1,
- }
+ k2: k2,
-
+ labels: [String::from("Fizz"), String::from("Buzz"), String::from("Fizzbuzz")]
- let fizzbuzzer = FizzBuzzer {
+ };
- k1: k1,
+ return fizzbuzzer.take(n);
- k2: k2,
+}
- labels: [String::from("Fizz"), String::from("Buzz"), String::from("Fizzbuzz")]
+
- };
+fn check_divisor(div: u8) {
- return fizzbuzzer.take(n);
+ if div == 0 || div == 1 {
- }
+ panic!("Does not support divisor {}", div)
-
+ }
- /// Параметри:
+}
- /// - полета `k1` и `k2`, които са двата делителя, които ще използваме за заместване.
+
- /// - поле `labels`, които са трите етикета, които съответстват на коефициентите
+/// Параметри:
- ///
+/// - полета `k1` и `k2`, които са двата делителя, които ще използваме за заместване.
- pub struct FizzBuzzer {
+/// - поле `labels`, които са трите етикета, които съответстват на коефициентите
- pub k1: u8,
+///
- pub k2: u8,
+pub struct FizzBuzzer {
- pub labels: [String; 3],
+ pub k1: u8,
- }
+ pub k2: u8,
-
+ pub labels: [String; 3],
- impl FizzBuzzer {
+}
- /// За всяко число от 1 до `n` включително, искаме съответстващия елемент в резултата да е:
+
- ///
+impl FizzBuzzer {
- /// - Първия String от полето `labels` ако числото се дели на k1, но не на k2
+ /// За всяко число от 1 до `n` включително, искаме съответстващия елемент в резултата да е:
- /// - Втория String от полето `labels` ако числото се дели на k2, но не на k1
+ ///
- /// - Третия String от полето `labels` ако числото се дели и на k1, и на k2
+ /// - Първия String от полето `labels` ако числото се дели на k1, но не на k2
- /// - Числото конвертирано до низ, във всички други случаи
+ /// - Втория String от полето `labels` ако числото се дели на k2, но не на k1
- ///
+ /// - Третия String от полето `labels` ако числото се дели и на k1, и на k2
- /// Ако `n` е 0, очакваме празен вектор за резултат.
+ /// - Числото конвертирано до низ, във всички други случаи
- /// Ако `k1` или `k2` са 0 или 1, очакваме функцията да panic-не с каквото съобщение изберете.
+ ///
- ///
+ /// Ако `n` е 0, очакваме празен вектор за резултат.
- pub fn take(&self, n: usize) -> Vec<String> {
+ /// Ако `k1` или `k2` са 0 или 1, очакваме функцията да panic-не с каквото съобщение изберете.
- let mut result: Vec<String> = Vec::with_capacity(n);
+ ///
-
+ pub fn take(&self, n: usize) -> Vec<String> {
- for i in 1..=n {
+ check_divisor(self.k1);
- result.push(self.get_label(i));
+ check_divisor(self.k2);
- }
+
- result
+ let mut result: Vec<String> = Vec::with_capacity(n);
- }
+
-
+ for i in 1..=n {
- /// Параметъра `index` указва кой етикет от полето `labels` променяме, от 0 до 2. Ако подадения
+ result.push(self.get_label(i));
- /// `index` е извън тези рамки, очакваме функцията да panic-не.
+ }
- ///
+ result
- /// Стойността `value` е низа, който ще сложим на този индекс в полето `labels`.
+ }
- ///
+
- pub fn change_label(&mut self, index: usize, value: &String) {
+ /// Параметъра `index` указва кой етикет от полето `labels` променяме, от 0 до 2. Ако подадения
- self.labels[index] = value.clone()
+ /// `index` е извън тези рамки, очакваме функцията да panic-не.
- }
+ ///
-
+ /// Стойността `value` е низа, който ще сложим на този индекс в полето `labels`.
- fn get_label(&self, n: usize) -> String {
+ ///
- let mult = (self.k1 * self.k2) as usize;
+ pub fn change_label(&mut self, index: usize, value: &String) {
- let k1 = self.k1 as usize;
+ self.labels[index] = value.clone()
- let k2 = self.k2 as usize;
+ }
-
+
- if n % mult == 0 {
+ fn get_label(&self, n: usize) -> String {
- return self.labels[2].clone();
+ let mult = (self.k1 * self.k2) as usize;
- } else if n % k1 == 0 {
+ let k1 = self.k1 as usize;
- return self.labels[0].clone();
+ let k2 = self.k2 as usize;
- } else if n % k2 == 0 {
+
- return self.labels[1].clone();
+ if n % mult == 0 {
- }
+ return self.labels[2].clone();
- return n.to_string();
+ } else if n % k1 == 0 {
- }
+ return self.labels[0].clone();
- }
+ } else if n % k2 == 0 {
+ return self.labels[1].clone();
+ }
+ return n.to_string();
+ }
+}