Решение на Думи на Фибоначи от Стоян Генчев
Резултати
- 19 точки от тестове
- 0 бонус точки
- 19 точки общо
- 19 успешни тест(а)
- 1 неуспешни тест(а)
Код
use std::str;
pub struct FibIter {
a: u32,
b: u32,
not_ran_yet: bool,
}
pub struct RevFibIter {
a: u32,
b: u32,
is_exhausted: bool,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { a: 0, b: 1, not_ran_yet: true }
}
pub fn next(&mut self) -> u32 {
if self.not_ran_yet {
self.not_ran_yet = false;
return 1
}
let next_val = self.a + self.b;
let temp = self.a;
self.a = self.b;
self.b = self.b + temp;
next_val
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
a: self.a,
b: self.b,
is_exhausted: self.not_ran_yet
}
}
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.a == 0 && self.b == 1 {
return if self.is_exhausted {
None
} else {
self.is_exhausted = true;
Some(1)
}
}
let temp = self.a;
self.a = self.b - self.a;
self.b = temp;
Some(self.a + self.b)
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let text_chars = text.chars().collect::<Vec<char>>();
let text_chars_len = text_chars.len();
if text_chars_len == 0 {
return Vec::new();
}
let mut fib_iter = FibIter::new();
let mut cur: usize = 0;
let mut next: usize = fib_iter.next() as usize;
let mut result = Vec::new();
loop {
result.push(text_chars[cur..next].iter().collect::<String>());
cur = next;
next = cur + fib_iter.next() as usize;
if cur > text_chars_len - 1 {
break;
}
if next > text_chars_len {
next = text_chars_len;
}
}
result
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let text_chars = text.chars().collect::<Vec<char>>();
let text_chars_len = text_chars.len();
if text_chars_len == 0 {
if n == 0 {
return (Vec::new(), "");
}
panic!("text doesn't contain {} fibonacci words", n);
}
let mut fib_iter = FibIter::new();
let mut cur: usize = 0;
let mut next: usize = fib_iter.next() as usize;
let mut fib_words_bytes_total = 0;
let mut result = Vec::new();
let mut i = 0;
while i < n {
if cur > text_chars_len - 1 || next > text_chars_len {
panic!("text doesn't contain {} fibonacci words", n);
}
let fib_word = text_chars[cur..next].iter().collect::<String>();
fib_words_bytes_total = fib_words_bytes_total + fib_word.bytes().len();
result.push(fib_word);
cur = next;
next = cur + fib_iter.next() as usize;
i = i + 1;
}
(result, &text[fib_words_bytes_total..])
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let text_chars = text.chars().collect::<Vec<char>>();
let text_chars_len = text_chars.len();
if text_chars_len == 0 {
if n == 0 {
return (Vec::new(), "");
}
panic!("text doesn't contain {}*2 fibonacci words", n);
}
let mut fib_iter = FibIter::new();
let mut cur: usize = 0;
let mut next: usize = fib_iter.next() as usize;
let mut fib_words_bytes_total = 0;
let mut result = Vec::new();
let mut i = 0;
while i < n - 1 {
if cur > text_chars_len - 1 || next > text_chars_len {
panic!("text doesn't contain {} fibonacci words", n);
}
let fib_word = text_chars[cur..next].iter().collect::<String>();
fib_words_bytes_total = fib_words_bytes_total + fib_word.bytes().len();
result.push(fib_word);
cur = next;
next = cur + fib_iter.next() as usize;
i = i + 1;
}
let mut rev_fib_iter = fib_iter.rev();
i = 0;
while i <= n {
if cur > text_chars_len - 1 || next > text_chars_len {
panic!("text doesn't contain {} fibonacci words", n);
}
let fib_word = text_chars[cur..next].iter().collect::<String>();
fib_words_bytes_total = fib_words_bytes_total + fib_word.bytes().len();
result.push(fib_word);
cur = next;
match rev_fib_iter.next() {
None => {
break;
}
Some(v) => {
next = cur + v as usize;
}
}
i = i + 1;
}
(result, &text[fib_words_bytes_total..])
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-7cex36/solution) Finished test [unoptimized + debuginfo] target(s) in 0.95s 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 ... FAILED test solution_test::fib_split_n_zero ... ok test solution_test::rev_fib_iter ... ok test solution_test::rev_fib_iter_empty ... ok failures: ---- solution_test::fib_split_n_symmetric_zero stdout ---- thread 'solution_test::fib_split_n_symmetric_zero' panicked at 'attempt to subtract with overflow', src/lib.rs:150:15 failures: solution_test::fib_split_n_symmetric_zero 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`