Решение на Думи на Фибоначи от Николай Манански
Към профила на Николай Манански
Резултати
- 14 точки от тестове
- 0 бонус точки
- 14 точки общо
- 14 успешни тест(а)
- 6 неуспешни тест(а)
Код
pub struct FibIter {
a: u32,
b: u32,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { a: 1, b: 1 }
}
pub fn next(&mut self) -> u32 {
let current = self.a;
let next_value = self.a + self.b;
self.a = self.b;
self.b = next_value;
current
}
pub fn rev(self) -> RevFibIter {
RevFibIter::new(self.a, self.b)
}
}
pub struct RevFibIter {
sequence: Vec<u32>,
index: usize,
}
impl RevFibIter {
fn new(last: u32, second_last: u32) -> RevFibIter {
let mut sequence = vec![last, second_last];
let mut a = second_last;
let mut b = last;
while a > 0 {
let next_value = a + b;
sequence.push(next_value);
a = b;
b = next_value;
}
sequence.reverse();
RevFibIter { sequence, index: 0 }
}
pub fn next(&mut self) -> Option<u32> {
if self.index < self.sequence.len() {
let value = self.sequence[self.index];
self.index += 1;
Some(value)
} else {
None
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut fib_iter = FibIter::new();
let mut words = Vec::new();
let chars: Vec<_> = text.chars().collect();
let mut index = 0;
loop {
let length = fib_iter.next();
if index + length as usize > chars.len() {
break;
}
let word: String = chars[index..index + length as usize].iter().collect();
words.push(word);
index += length as usize;
}
if index < chars.len() {
let rest: String = chars[index..].iter().collect();
words.push(rest);
}
words
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib_iter = FibIter::new();
let mut words = Vec::new();
let chars: Vec<_> = text.chars().collect();
let mut index = 0;
for _ in 0..n {
let length = fib_iter.next();
if index + length as usize > chars.len() {
panic!("Not enough characters in the text!");
}
let word: String = chars[index..index + length as usize].iter().collect();
words.push(word);
index += length as usize;
}
let rest = &text[index..];
(words, rest)
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib_iter = FibIter::new();
let mut words = Vec::new();
let chars: Vec<_> = text.chars().collect();
let mut index = 0;
// F0, F1, ..., Fn-1
let mut lengths = Vec::new();
for _ in 0..n {
lengths.push(fib_iter.next());
}
// F(n-1), ..., F0
let mut reversed_lengths = lengths.iter().rev().cloned().collect::<Vec<_>>();
lengths.append(&mut reversed_lengths);
for length in lengths {
if index + length as usize > chars.len() {
panic!("Not enough characters in the text!");
}
let word: String = chars[index..index + length as usize].iter().collect();
words.push(word);
index += length as usize;
}
let rest = &text[index..];
(words, rest)
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-xm1hnx/solution) Finished test [unoptimized + debuginfo] target(s) in 2.08s 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 ... ok test solution_test::fib_split_n_cyrillic ... FAILED 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 ... FAILED test solution_test::fib_split_n_cyrillic_exact ... FAILED test solution_test::fib_split_n_symmetric_cyrillic_panic ... ok test solution_test::fib_split_n_symmetric_cyrillic_exact ... FAILED test solution_test::fib_split_n_symmetric_zero ... ok 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_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:97:17 ---- solution_test::fib_split_n_symmetric_cyrillic stdout ---- thread 'solution_test::fib_split_n_symmetric_cyrillic' panicked at 'assertion failed: `(left == right)` left: `"анджа_with_грозде"`, right: `"нджа_with_грозде"`', tests/solution_test.rs:161:5 ---- solution_test::fib_split_n_cyrillic_exact stdout ---- thread 'solution_test::fib_split_n_cyrillic_exact' panicked at 'assertion failed: `(left == right)` left: `"_with_"`, right: `""`', tests/solution_test.rs:114:5 ---- solution_test::fib_split_n_symmetric_cyrillic_exact stdout ---- thread 'solution_test::fib_split_n_symmetric_cyrillic_exact' panicked at 'assertion failed: `(left == right)` left: `"ith_гр"`, right: `""`', tests/solution_test.rs:172:5 ---- solution_test::rev_fib_iter stdout ---- thread 'solution_test::rev_fib_iter' panicked at 'attempt to add with overflow', src/lib.rs:36:30 ---- solution_test::rev_fib_iter_empty stdout ---- thread 'solution_test::rev_fib_iter_empty' panicked at 'attempt to add with overflow', src/lib.rs:36:30 failures: 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 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.01s error: test failed, to rerun pass `--test solution_test`