Решение на Думи на Фибоначи от Петър Велков

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

Към профила на Петър Велков

Резултати

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

Код

pub struct FibIter {
previous: u32,
current: u32
}
impl FibIter {
pub fn new() -> FibIter {
FibIter {
previous: 0_u32,
current: 1_u32
}
}
pub fn next(&mut self) -> u32 {
let temporary = self.previous;
self.previous = self.current;
self.current = temporary + self.current;
self.previous
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
previous: self.previous,
current: self.current,
}
}
}
pub struct RevFibIter {
previous: u32,
current: u32
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.previous > 0 {
let temporary = self.current;
self.current = self.previous;
self.previous = temporary - self.previous;
Option::from(self.current)
}
else {
None
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut words: Vec<String> = Vec::new();
let mut iter = FibIter::new();
let mut remaining_text: String = text.to_string();
while remaining_text.len() > 0 {
let fib_number = iter.next() as usize;
let word_length =
if remaining_text.len() < fib_number {
remaining_text.len()
}
else {
fib_number
};
words.push(remaining_text[..word_length].to_string());
remaining_text = remaining_text[word_length..].to_string();
}
words
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, String) {
let mut words: Vec<String> = Vec::new();
let mut iter = FibIter::new();
let mut remaining_text: String = text.to_string();
for _ in 0..n {
let word_length = iter.next() as usize;
if remaining_text.len() < word_length {
panic!("Text too short");
}
words.push(remaining_text[..word_length].to_string());
remaining_text = remaining_text[word_length..].to_string();
}
(words, remaining_text)
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, String) {
let mut words: Vec<String> = Vec::new();
let mut iter = FibIter::new();
let mut remaining_text: String = text.to_string();
for _ in 0..n {
let word_length = iter.next() as usize;
if remaining_text.len() < word_length {
panic!("Text too short");
}
words.push(remaining_text[..word_length].to_string());
remaining_text = remaining_text[word_length..].to_string();
}
let mut rev_iter = iter.rev();
for _ in 0..n {
let optional_word_length = rev_iter.next();
if optional_word_length.is_none() {
break;
}
let word_length = optional_word_length.unwrap() as usize;
if remaining_text.len() < word_length {
panic!("Text too short");
}
words.push(remaining_text[..word_length].to_string());
remaining_text = remaining_text[word_length..].to_string();
}
(words, remaining_text)
}

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

Compiling solution v0.1.0 (/tmp/d20241104-1739405-btn9bk/solution)
    Finished test [unoptimized + debuginfo] target(s) in 1.15s
     Running tests/solution_test.rs (target/debug/deps/solution_test-1428e1090729d165)

running 20 tests
test solution_test::fib_iter ... ok
test solution_test::fib_split_ascii ... ok
test solution_test::fib_split_cyrillic ... FAILED
test solution_test::fib_split_empty ... ok
test solution_test::fib_split_n_ascii ... ok
test solution_test::fib_split_n_ascii_exact ... ok
test solution_test::fib_split_n_ascii_panic ... ok
test solution_test::fib_split_n_cyrillic ... FAILED
test solution_test::fib_split_n_cyrillic_exact ... FAILED
test solution_test::fib_split_n_cyrillic_panic ... ok
test solution_test::fib_split_n_symmetric_ascii_exact ... ok
test solution_test::fib_split_n_symmetric_ascii ... ok
test solution_test::fib_split_n_symmetric_ascii_panic ... ok
test solution_test::fib_split_n_symmetric_cyrillic ... FAILED
test solution_test::fib_split_n_symmetric_cyrillic_exact ... FAILED
test solution_test::fib_split_n_symmetric_cyrillic_panic ... ok
test solution_test::fib_split_n_symmetric_zero ... ok
test solution_test::rev_fib_iter ... ok
test solution_test::fib_split_n_zero ... ok
test solution_test::rev_fib_iter_empty ... ok

failures:

---- solution_test::fib_split_cyrillic stdout ----
thread 'solution_test::fib_split_cyrillic' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа с грозде`', src/lib.rs:62:20
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

---- solution_test::fib_split_n_cyrillic stdout ----
thread 'solution_test::fib_split_n_cyrillic' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа_with_грозде`', src/lib.rs:80:20

---- solution_test::fib_split_n_cyrillic_exact stdout ----
thread 'solution_test::fib_split_n_cyrillic_exact' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа_with_`', src/lib.rs:80:20

---- solution_test::fib_split_n_symmetric_cyrillic stdout ----
thread 'solution_test::fib_split_n_symmetric_cyrillic' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа_with_грозде`', src/lib.rs:98:20

---- solution_test::fib_split_n_symmetric_cyrillic_exact stdout ----
thread 'solution_test::fib_split_n_symmetric_cyrillic_exact' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа_with_гр`', src/lib.rs:98:20


failures:
    solution_test::fib_split_cyrillic
    solution_test::fib_split_n_cyrillic
    solution_test::fib_split_n_cyrillic_exact
    solution_test::fib_split_n_symmetric_cyrillic
    solution_test::fib_split_n_symmetric_cyrillic_exact

test result: FAILED. 15 passed; 5 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

error: test failed, to rerun pass `--test solution_test`

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

Петър качи първо решение на 30.10.2024 01:40 (преди 11 месеца)

Петър качи решение на 30.10.2024 02:35 (преди 11 месеца)

pub struct FibIter {
previous: u32,
current: u32
}
impl FibIter {
pub fn new() -> FibIter {
FibIter {
previous: 0_u32,
current: 1_u32
}
}
pub fn next(&mut self) -> u32 {
let temporary = self.previous;
self.previous = self.current;
self.current = temporary + self.current;
self.previous
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
previous: self.previous,
current: self.current,
}
}
}
pub struct RevFibIter {
previous: u32,
current: u32
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.previous > 0 {
let temporary = self.current;
self.current = self.previous;
self.previous = temporary - self.previous;
Option::from(self.current)
}
else {
None
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut words: Vec<String> = Vec::new();
let mut iter = FibIter::new();
let mut remaining_text: String = text.to_string();
while remaining_text.len() > 0 {
let fib_number = iter.next() as usize;
let word_length =
if remaining_text.len() < fib_number {
remaining_text.len()
}
else {
fib_number
};
words.push(remaining_text[..word_length].to_string());
remaining_text = remaining_text[word_length..].to_string();
}
words
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, String) {
let mut words: Vec<String> = Vec::new();
let mut iter = FibIter::new();
let mut remaining_text: String = text.to_string();
for _ in 0..n {
let word_length = iter.next() as usize;
if remaining_text.len() < word_length {
panic!("Text too short");
}
words.push(remaining_text[..word_length].to_string());
remaining_text = remaining_text[word_length..].to_string();
}
(words, remaining_text)
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, String) {
let mut words: Vec<String> = Vec::new();
let mut iter = FibIter::new();
let mut remaining_text: String = text.to_string();
for _ in 0..n {
let word_length = iter.next() as usize;
if remaining_text.len() < word_length {
panic!("Text too short");
}
words.push(remaining_text[..word_length].to_string());
remaining_text = remaining_text[word_length..].to_string();
}
let mut rev_iter = iter.rev();
for _ in 0..n {
let optional_word_length = rev_iter.next();
if optional_word_length.is_none() {
break;
}
let word_length = optional_word_length.unwrap() as usize;
if remaining_text.len() < word_length {
panic!("Text too short");
}
words.push(remaining_text[..word_length].to_string());
remaining_text = remaining_text[word_length..].to_string();
}
(words, remaining_text)
-}
-
+}
-pub fn add(left: u64, right: u64) -> u64 {
- left + right
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn it_works() {
- let result = add(2, 2);
- assert_eq!(result, 4);
- }
-
- #[test]
- fn test_basic() {
- let mut fib_iter = FibIter::new();
- fib_iter.next();
-
- let mut rev_fib_iter: RevFibIter = fib_iter.rev();
- rev_fib_iter.next();
-
- let words: Vec<String> = fib_split("Fibonacci words!");
- assert_eq!(words, &["F", "i", "bo", "nac", "ci wo", "rds!"]);
-
- let (words, rest) = fib_split_n("Lorem ipsum dolor sit amet.", 6);
- assert_eq!(words, &["L", "o", "re", "m i", "psum ", "dolor si"]);
- assert_eq!(rest, "t amet.");
-
- let (words, rest) = fib_split_n_symmetric("Lorem ipsum dolor sit amet.", 5);
- assert_eq!(words, &["L", "o", "re", "m i", "psum ", "dolor", " si", "t ", "a", "m"]);
- assert_eq!(rest, "et.");
- }
-
- #[test]
- fn fib_iter_works() {
- let mut iter = FibIter::new();
- assert_eq!(iter.next(), 1);
- assert_eq!(iter.next(), 1);
- assert_eq!(iter.next(), 2);
- assert_eq!(iter.next(), 3);
- assert_eq!(iter.next(), 5);
- assert_eq!(iter.next(), 8);
- assert_eq!(iter.next(), 13);
- assert_eq!(iter.next(), 21);
- assert_eq!(iter.next(), 34);
- assert_eq!(iter.next(), 55);
- }
-
- #[test]
- fn fib_split_works() {
- assert_eq!(fib_split(""), Vec::<String>::new());
- assert_eq!(fib_split("F"), vec!["F"]);
- assert_eq!(fib_split("Fi"), vec!["F", "i"]);
- assert_eq!(fib_split("Fib"), vec!["F", "i", "b"]);
- assert_eq!(fib_split("Fibonacci words!"), vec!["F", "i", "bo", "nac", "ci wo", "rds!"]);
- }
-
- #[test]
- fn fib_split_n_works() {
- let (actual_vector, remaining_text) =
- fib_split_n("Lorem ipsum dolor sit amet.", 6);
-
- assert_eq!(actual_vector, vec!["L", "o", "re", "m i", "psum ", "dolor si"]);
- assert_eq!(remaining_text, "t amet.");
- }
-
- #[test]
- #[should_panic]
- fn fib_split_n_panic() {
- fib_split_n("Lorem ipsum dolor sit amet.", 7);
- }
-
- #[test]
- fn rev_fib_iter_works() {
- let mut iter = FibIter::new();
- assert_eq!(iter.next(), 1);
- assert_eq!(iter.next(), 1);
- assert_eq!(iter.next(), 2);
- assert_eq!(iter.next(), 3);
- assert_eq!(iter.next(), 5);
- assert_eq!(iter.next(), 8);
- assert_eq!(iter.next(), 13);
- assert_eq!(iter.next(), 21);
- assert_eq!(iter.next(), 34);
- assert_eq!(iter.next(), 55);
-
- let mut rev_iter = iter.rev();
- assert_eq!(rev_iter.next(), Option::from(55));
- assert_eq!(rev_iter.next(), Option::from(34));
- assert_eq!(rev_iter.next(), Option::from(21));
- assert_eq!(rev_iter.next(), Option::from(13));
- assert_eq!(rev_iter.next(), Option::from(8));
- assert_eq!(rev_iter.next(), Option::from(5));
- assert_eq!(rev_iter.next(), Option::from(3));
- assert_eq!(rev_iter.next(), Option::from(2));
- assert_eq!(rev_iter.next(), Option::from(1));
- assert_eq!(rev_iter.next(), Option::from(1));
- assert_eq!(rev_iter.next(), None);
- assert_eq!(rev_iter.next(), None);
- assert_eq!(rev_iter.next(), None);
- }
-
- #[test]
- fn fib_split_n_symmetric_works() {
- let (actual_vector, remaining_text) =
- fib_split_n_symmetric("Lorem ipsum dolor sit amet.", 5);
-
- assert_eq!(actual_vector, vec!["L", "o", "re", "m i", "psum ", "dolor", " si", "t ", "a", "m"]);
- assert_eq!(remaining_text, "et.");
- }
-
- #[test]
- fn fib_split_n_symmetric_works_1() {
- let (actual_vector, remaining_text) =
- fib_split_n_symmetric("Lorem ipsum dolor sit amet.", 1);
-
- assert_eq!(actual_vector, vec!["L", "o"]);
- assert_eq!(remaining_text, "rem ipsum dolor sit amet.");
- }
-
- #[test]
- fn fib_split_n_symmetric_works_empty() {
- let (actual_vector, remaining_text) =
- fib_split_n_symmetric("Lorem ipsum dolor sit amet.", 0);
-
- assert_eq!(actual_vector, Vec::<String>::new());
- assert_eq!(remaining_text, "Lorem ipsum dolor sit amet.");
- }
-
- #[test]
- #[should_panic]
- fn fib_split_n_symmetric_panic() {
- fib_split_n_symmetric("Lorem ipsum dolor sit amet.", 6);
- }
-}