Решение на Думи на Фибоначи от Александър Асенов

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

Към профила на Александър Асенов

Резултати

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

Код

pub struct FibIter {
curr: u32,
next: u32,
stack: Vec<u32>
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { curr: 0, next: 1, stack: Vec::new() }
}
pub fn next(&mut self) -> u32 {
let temp = self.curr;
self.curr = self.next;
self.next += temp;
self.stack.push(self.curr);
self.curr
}
pub fn rev(self) -> RevFibIter {
RevFibIter { curr: self.next, next: self.curr + self.next }
}
}
pub struct RevFibIter {
curr: u32,
next: u32
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
let temp = self.next - self.curr;
self.next = self.curr;
self.curr = temp;
if self.curr > 0 {
Some(self.curr)
} else {
None
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let text_vec: Vec<char> = text.chars().collect();
let mut fibwords: Vec<String> = Vec::new();
let mut fibiter = FibIter::new();
let mut counter: usize = 0;
let mut current = fibiter.next() as usize;
while counter + current < text_vec.len() {
fibwords.push(text_vec[counter..(counter + current)].iter().collect());
counter += current;
current = fibiter.next() as usize;
}
if counter < text_vec.len() {
fibwords.push(text_vec[counter..].iter().collect());
}
fibwords
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, String) {
let mut fibwords: Vec<String> = Vec::new();
let text_vec: Vec<char> = text.chars().collect();
let mut fibiter = FibIter::new();
let mut current: usize = fibiter.next() as usize;
let mut counter: usize = 0;
for _ in 0..n {
if (counter + current) > text_vec.len() {
panic!("Cannot split the text into {} fib words", n);
}
fibwords.push(text_vec[counter..(counter + current)].iter().collect());
counter += current;
current = fibiter.next() as usize;
};
let leftovers = if counter < text_vec.len() {
text_vec[counter..].iter().collect()
} else {
String::new()
};
(fibwords, leftovers)
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, String) {
let mut fibwords: Vec<String> = Vec::new();
let text_vec: Vec<char> = text.chars().collect();
let mut fibiter = FibIter::new();
let mut current: usize;
let mut counter: usize = 0;
for _ in 0..n {
current = fibiter.next() as usize;
if (counter + current) > text_vec.len() {
panic!("Cannot split the text into {} fib words", n);
}
fibwords.push(text_vec[counter..(counter + current)].iter().collect());
counter += current;
}
let mut fibiter_rev = fibiter.rev();
for _ in 0..n {
current = match fibiter_rev.next() {
Some(val) => val as usize,
None => break
};
if (counter + current) > text_vec.len() {
panic!("Cannot split the text into {} fib words", n);
}
fibwords.push(text_vec[counter..(counter + current)].iter().collect());
counter += current;
}
let leftovers = if counter < text_vec.len() {
text_vec[counter..].iter().collect()
} else {
String::new()
};
(fibwords, leftovers)
}

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

Compiling solution v0.1.0 (/tmp/d20241104-1739405-14kpv3m/solution)
    Finished test [unoptimized + debuginfo] target(s) in 1.03s
     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_cyrillic ... ok
test solution_test::fib_split_n_ascii_panic ... ok
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 ... ok
test solution_test::fib_split_n_zero ... ok
test solution_test::rev_fib_iter ... FAILED
test solution_test::rev_fib_iter_empty ... ok

failures:

---- 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:36:5


failures:
    solution_test::rev_fib_iter

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

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

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

Александър качи първо решение на 29.10.2024 23:20 (преди 11 месеца)