Решение на Думи на Фибоначи от Димитър Тагарев
Към профила на Димитър Тагарев
Резултати
- 14 точки от тестове
- 0 бонус точки
- 14 точки общо
- 14 успешни тест(а)
- 6 неуспешни тест(а)
Код
pub struct FibIter {
last: u32,
prev: u32,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { last: 0, prev: 0 }
}
pub fn next(&mut self) -> u32 {
if self.prev == 0 {
self.prev = 1;
return 1;
}
let new_num = self.last + self.prev;
self.last = self.prev;
self.prev = new_num;
new_num
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
prev: self.last,
current: self.prev,
}
}
}
pub struct RevFibIter {
prev: u32,
current: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
let ret = self.current;
let new_num: i32 = self.current as i32 - self.prev as i32;
if new_num < 0 {
return None;
}
self.current = self.prev;
self.prev = new_num as u32;
Some(ret)
}
}
enum FibIters {
Iter(FibIter),
IterRev(RevFibIter),
}
impl FibIters {
fn get_next(&mut self) -> Option<u32> {
match self {
FibIters::Iter(a) => Some(a.next()),
FibIters::IterRev(b) => b.next(),
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut res: Vec<String> = vec![];
let mut fib_iter = FibIter::new();
let mut curr_string: Vec<char> = vec![];
let mut num_collected: i32 = fib_iter.next() as i32;
for c in text.chars() {
if num_collected == 0 {
res.push(curr_string.iter().collect());
curr_string.clear();
num_collected = fib_iter.next() as i32;
}
curr_string.push(c);
num_collected -= 1;
}
if num_collected != 0 && !curr_string.is_empty() {
res.push(curr_string.iter().collect());
}
res
}
fn fib_split_n_iter(mut iter: FibIters, text: &str, n: u32) -> (Vec<String>, &str) {
let mut res: Vec<String> = vec![];
let mut curr_string: Vec<char> = vec![];
let mut sections = n as i32;
let mut processed_chars = 0;
let mut num_collected: i32 = {
let this = iter.get_next();
match this {
Some(val) => val,
None => return (res, &text[processed_chars..]),
}
} as i32;
for c in text.chars() {
if num_collected == 0 {
res.push(curr_string.iter().collect());
curr_string.clear();
sections -= 1;
num_collected = {
let this = iter.get_next();
match this {
Some(val) => val,
None => return (res, &text[processed_chars..]),
}
} as i32;
}
if sections == 0 {
break;
}
curr_string.push(c);
num_collected -= 1;
processed_chars += c.len_utf8();
}
if sections != 0 {
panic!("String too short");
}
(res, &text[processed_chars..])
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let fib_iter = FibIter::new();
let enum_fib_iter = FibIters::Iter(fib_iter);
fib_split_n_iter(enum_fib_iter, text, n)
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let enum_fib_iter = FibIters::Iter(FibIter::new());
let mut res = fib_split_n_iter(enum_fib_iter, text, n);
let mut fib_iter = FibIter::new();
for _ in 0..n {
fib_iter.next();
}
let enum_rev_fib_iter = FibIters::IterRev(fib_iter.rev());
let mut rev_res = fib_split_n_iter(enum_rev_fib_iter, res.1, n);
res.0.append(&mut rev_res.0);
(res.0, rev_res.1)
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-erlruy/solution) Finished test [unoptimized + debuginfo] target(s) in 1.17s 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 ... FAILED test solution_test::fib_split_n_ascii_panic ... ok test solution_test::fib_split_n_cyrillic ... ok test solution_test::fib_split_n_cyrillic_exact ... 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 ... 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 ... ok test solution_test::rev_fib_iter_empty ... FAILED failures: ---- solution_test::fib_split_n_ascii_exact stdout ---- thread 'solution_test::fib_split_n_ascii_exact' panicked at 'String too short', src/lib.rs:129:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ---- solution_test::fib_split_n_cyrillic_exact stdout ---- thread 'solution_test::fib_split_n_cyrillic_exact' panicked at 'String too short', src/lib.rs:129:9 ---- solution_test::fib_split_n_symmetric_ascii_exact stdout ---- thread 'solution_test::fib_split_n_symmetric_ascii_exact' panicked at 'String too short', src/lib.rs:129:9 ---- solution_test::fib_split_n_symmetric_cyrillic_exact stdout ---- thread 'solution_test::fib_split_n_symmetric_cyrillic_exact' panicked at 'String too short', src/lib.rs:129:9 ---- solution_test::fib_split_n_symmetric_zero stdout ---- thread 'solution_test::fib_split_n_symmetric_zero' panicked at 'String too short', src/lib.rs:129:9 ---- solution_test::rev_fib_iter_empty stdout ---- thread 'solution_test::rev_fib_iter_empty' panicked at 'assertion failed: `(left == right)` left: `Some(0)`, right: `None`', tests/solution_test.rs:43:5 failures: solution_test::fib_split_n_ascii_exact solution_test::fib_split_n_cyrillic_exact 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_empty test result: FAILED. 14 passed; 6 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--test solution_test`