Решение на Думи на Фибоначи от Йоанна Ненкова

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

Към профила на Йоанна Ненкова

Резултати

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

Код

pub struct FibIter {
prev: u32,
curr: u32,
}
pub struct RevFibIter {
curr: u32,
prev: u32,
done: bool,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { prev: 1, curr: 1 }
}
pub fn next(&mut self) -> u32 {
let to_add: u32 = self.prev;
self.prev = self.curr;
self.curr = self.prev + to_add;
to_add
}
pub fn rev(self) -> RevFibIter {
RevFibIter { curr: self.curr, prev: self.prev, done: false }
}
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.done {
return None
}
if self.curr == 1 && self.prev == 1 {
self.done = true;
} else {
let new_prev = self.curr - self.prev;
self.curr = self.prev;
self.prev = new_prev;
}
Some(self.prev)
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut result: Vec<String> = Vec::new();
let mut fib = FibIter::new();
let mut remaining_text = text.chars();
while let Some(next_word_len) = fib.next().try_into().ok() {
let mut next_word = String::new();
for _ in 0..next_word_len {
match remaining_text.next() {
Some(symbol) => next_word.push(symbol),
None => {
if !next_word.is_empty() {
result.push(next_word);
}
return result;
}
}
}
result.push(next_word);
}
result
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, String) {
let all_split = fib_split(text);
let mut n_split_len: usize = 0;
for word in &all_split[..n as usize] {
n_split_len += word.chars().count();
}
if all_split.len() < n as usize || all_split[n as usize - 3].chars().count() + all_split[n as usize- 2].chars().count() != all_split[n as usize - 1].chars().count() {
panic!("Text not long enough!");
} else {
let remaining_text: String = text.chars().skip(n_split_len).collect();
(all_split[..n as usize].to_vec(), remaining_text)
}
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, String) {
let all_split_normal = fib_split(text);
if all_split_normal.len() <= n as usize {
panic!("Text not long enough!");
}
let mut n_split_len: usize = 0;
for word in &all_split_normal[..n as usize] {
n_split_len += word.chars().count();
}
if n_split_len * 2 > text.chars().count() {
panic!("Text not long enough!");
} else {
let to_split: String = text.chars().skip(n_split_len).take(n_split_len).collect::<String>().chars().rev().collect();
let mut split_by_rev_fib = fib_split(&to_split);
split_by_rev_fib.reverse();
for word in split_by_rev_fib.iter_mut() {
*word = word.chars().rev().collect();
}
let mut result_vec = all_split_normal[..n as usize].to_vec();
result_vec.extend(split_by_rev_fib);
let remaining_text: String = text.chars().skip(n_split_len * 2).collect();
(result_vec, remaining_text)
}
}

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

Compiling solution v0.1.0 (/tmp/d20241104-1739405-ei1chr/solution)
    Finished test [unoptimized + debuginfo] target(s) in 1.01s
     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 ... ok
test solution_test::fib_split_empty ... ok
test solution_test::fib_split_n_ascii_exact ... ok
test solution_test::fib_split_n_ascii ... FAILED
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 ... ok
test solution_test::fib_split_n_cyrillic_panic ... ok
test solution_test::fib_split_n_symmetric_ascii ... ok
test solution_test::fib_split_n_symmetric_ascii_exact ... ok
test solution_test::fib_split_n_symmetric_ascii_panic ... ok
test solution_test::fib_split_n_symmetric_cyrillic ... ok
test solution_test::fib_split_n_symmetric_cyrillic_exact ... ok
test solution_test::fib_split_n_symmetric_cyrillic_panic ... ok
test solution_test::fib_split_n_symmetric_zero ... FAILED
test solution_test::fib_split_n_zero ... FAILED
test solution_test::rev_fib_iter ... FAILED
test solution_test::rev_fib_iter_empty ... FAILED

failures:

---- solution_test::fib_split_n_ascii stdout ----
thread 'solution_test::fib_split_n_ascii' panicked at 'attempt to subtract with overflow', src/lib.rs:80:50
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 'attempt to subtract with overflow', src/lib.rs:80:50

---- solution_test::fib_split_n_symmetric_zero stdout ----
thread 'solution_test::fib_split_n_symmetric_zero' panicked at 'Text not long enough!', src/lib.rs:91:9

---- solution_test::fib_split_n_zero stdout ----
thread 'solution_test::fib_split_n_zero' panicked at 'attempt to subtract with overflow', src/lib.rs:80:50

---- solution_test::rev_fib_iter stdout ----
thread 'solution_test::rev_fib_iter' panicked at 'assertion failed: `(left == right)`
  left: `Some(1)`,
 right: `None`', tests/solution_test.rs:35:5

---- solution_test::rev_fib_iter_empty stdout ----
thread 'solution_test::rev_fib_iter_empty' panicked at 'assertion failed: `(left == right)`
  left: `Some(1)`,
 right: `None`', tests/solution_test.rs:43:5


failures:
    solution_test::fib_split_n_ascii
    solution_test::fib_split_n_cyrillic
    solution_test::fib_split_n_symmetric_zero
    solution_test::fib_split_n_zero
    solution_test::rev_fib_iter
    solution_test::rev_fib_iter_empty

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

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

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

Йоанна качи първо решение на 31.10.2024 02:35 (преди 11 месеца)