Решение на Думи на Фибоначи от Николай Манански

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

Към профила на Николай Манански

Резултати

  • 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`

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

Николай качи първо решение на 31.10.2024 17:07 (преди 11 месеца)