Решение на Думи на Фибоначи от Ана Илиева
Резултати
- 13 точки от тестове
- 0 бонус точки
- 13 точки общо
- 13 успешни тест(а)
- 7 неуспешни тест(а)
Код
pub struct FibIter
{
previous: u32,
current: u32,
history: Vec<u32>,
}
impl FibIter
{
pub fn new() -> FibIter
{
FibIter { previous: 1, current: 1, history: vec![1, 1] }
}
pub fn next(&mut self) -> u32
{
let value: u32 = self.previous;
let new_current: u32 = self.previous + self.current;
self.history.push(value);
self.previous = self.current;
self.current = new_current;
value
}
pub fn rev(self) -> RevFibIter
{
let history_len: usize = self.history.len();
RevFibIter
{
history: self.history,
index: history_len,
}
}
}
pub fn fib_split(text: &str) -> Vec<String>
{
let mut fib_iter: FibIter = FibIter::new();
let mut result: Vec<String> = Vec::new();
let mut chars: std::str::Chars<'_> = text.chars();
let mut len_so_far: usize = 0;
while text.len() > len_so_far
{
let fib_number: usize = fib_iter.next() as usize;
let word: String = chars.by_ref().take(fib_number).collect();
if word.is_empty()
{
break;
}
result.push(word);
len_so_far += fib_number;
}
result
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str)
{
let words: Vec<String> = fib_split(text);
if words.len() < n as usize
{
panic!("Not enough characters in the text to form {} Fibonacci-sized words!", n);
}
let selected_words: Vec<String> = words[..n as usize].to_vec();
let split_pos: usize = selected_words.iter().fold(0, |acc: usize, s: &String| acc + s.len());
let remaining_text: &str = &text[split_pos..];
(selected_words, remaining_text)
}
pub struct RevFibIter
{
history: Vec<u32>,
index: usize,
}
impl RevFibIter
{
pub fn next(&mut self) -> Option<u32>
{
match self.index
{
0 => None,
_ =>
{
self.index -= 1;
Some(self.history[self.index])
}
}
}
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str)
{
let (mut words, mut remaining_text) = fib_split_n(text, n);
let mut fib_iter: FibIter = FibIter::new();
for _ in 0..n
{
fib_iter.next();
}
let mut fib_iter_rev: RevFibIter = fib_iter.rev();
let mut mut_n: u32 = n;
while let Some(length) = fib_iter_rev.next()
{
if remaining_text.is_empty()
{
panic!("Not enough characters!");
}
if mut_n == 0
{
break;
}
let length: usize = length as usize;
let word: String = remaining_text.chars().by_ref().take(length).collect();
if word.is_empty()
{
break;
}
remaining_text = &remaining_text[word.len()..];
words.push(word);
mut_n -= 1;
}
(words, remaining_text)
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-17yr8jx/solution) Finished test [unoptimized + debuginfo] target(s) in 0.92s 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 ... ok test solution_test::fib_split_n_ascii_exact ... ok test solution_test::fib_split_n_ascii_panic ... FAILED test solution_test::fib_split_n_cyrillic_exact ... ok test solution_test::fib_split_n_cyrillic ... ok test solution_test::fib_split_n_symmetric_ascii ... ok test solution_test::fib_split_n_cyrillic_panic ... FAILED test solution_test::fib_split_n_symmetric_ascii_exact ... FAILED 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 ... FAILED 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 ... ok test solution_test::rev_fib_iter ... FAILED test solution_test::rev_fib_iter_empty ... FAILED failures: ---- solution_test::fib_split_n_ascii_panic stdout ---- thread 'solution_test::fib_split_n_ascii_panic' panicked at 'Not enough characters in the text to form 1 Fibonacci-sized words!', src/lib.rs:67:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread 'solution_test::fib_split_n_ascii_panic' panicked at 'assertion failed: catch_unwind(|| fib_split_n(\"abcd_123\", 5)).is_err()', tests/solution_test.rs:96:5 ---- solution_test::fib_split_n_cyrillic_panic stdout ---- thread 'solution_test::fib_split_n_cyrillic_panic' panicked at 'assertion failed: catch_unwind(|| fib_split_n(\"манджа_with_грозде\", 6)).is_err()', tests/solution_test.rs:119:5 ---- solution_test::fib_split_n_symmetric_ascii_exact stdout ---- thread 'solution_test::fib_split_n_symmetric_ascii_exact' panicked at 'Not enough characters!', src/lib.rs:116:13 ---- solution_test::fib_split_n_symmetric_cyrillic_exact stdout ---- thread 'solution_test::fib_split_n_symmetric_cyrillic_exact' panicked at 'Not enough characters!', src/lib.rs:116:13 ---- solution_test::fib_split_n_symmetric_zero stdout ---- thread 'solution_test::fib_split_n_symmetric_zero' panicked at 'Not enough characters!', src/lib.rs:116:13 ---- 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_panic solution_test::fib_split_n_cyrillic_panic solution_test::fib_split_n_symmetric_ascii_exact solution_test::fib_split_n_symmetric_cyrillic_exact solution_test::fib_split_n_symmetric_zero solution_test::rev_fib_iter solution_test::rev_fib_iter_empty test result: FAILED. 13 passed; 7 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--test solution_test`