Решение на Думи на Фибоначи от Георги Йорданов
Към профила на Георги Йорданов
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 20 успешни тест(а)
- 0 неуспешни тест(а)
Код
#[derive(Debug)]
pub struct FibIter {
prev_prev : u32,
prev : u32,
curr : u32
}
impl FibIter {
pub fn new() -> FibIter {
FibIter {prev_prev : 0, prev : 0, curr : 1}
}
pub fn next(&mut self) -> u32 {
let curr_result = self.curr;
self.prev_prev = self.prev;
self.prev = self.curr;
self.curr = self.prev_prev + self.prev;
curr_result
}
pub fn rev(self) -> RevFibIter {
match self {
FibIter {prev_prev: 0, prev: 0, curr: 1} => RevFibIter { prev_prev: 0, prev: 0, curr: 0},
FibIter {prev_prev: 0, prev: 1, curr: 1} => RevFibIter { prev_prev: 0, prev: 0, curr: 1},
_ => RevFibIter {prev_prev : self.prev - self.prev_prev, prev : self.prev_prev, curr : self.prev}
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut fib: FibIter = FibIter::new();
let mut result : Vec<String> = Vec::new();
let mut it = text.chars().peekable();
while it.peek().is_some() {
let mut curr_str = String::new();
for i in 0..fib.curr {
match it.next() {
Some(val) => curr_str.push(val),
None => break
}
}
result.push(curr_str);
fib.next();
}
result
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib: FibIter = FibIter::new();
let mut vec: Vec<String> = Vec::new();
let split_pos: usize;
let mut it = text.char_indices().peekable();
while vec.len() < n as usize {
let mut curr_str = String::new();
for i in 0..fib.curr {
match it.next() {
Some(val) => curr_str.push(val.1),
None => panic!("Oh no!")
}
}
vec.push(curr_str);
fib.next();
}
// check if splitting at last position (calling unwrap() at None value)
match it.peek() {
Some(val) => split_pos = val.0,
None => split_pos = text.len(),
}
(vec, &text[split_pos..])
}
#[derive(Debug)]
pub struct RevFibIter {
prev_prev : u32,
prev : u32,
curr : u32
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
let curr_result = self.curr;
match self {
RevFibIter { prev_prev: 0, prev: 0 , curr: 0} => None,
RevFibIter { prev_prev: 0, prev: 0 , curr: 1} => {
self.curr = 0;
Some(1)
},
RevFibIter { prev_prev: 0, prev: 1 , curr: 1} => {
self.prev = 0;
Some(1)
},
_ => {
let temp_prev = self.prev;
self.curr = self.prev;
self.prev = self.prev_prev;
self.prev_prev = temp_prev - self.prev_prev;
Some(curr_result)
},
}
}
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib: FibIter = FibIter::new();
let mut vec: Vec<String> = Vec::new();
let split_pos: usize;
let mut it = text.char_indices().peekable();
while vec.len() < n as usize {
let mut curr_str = String::new();
for i in 0..fib.curr {
match it.next() {
Some(val) => curr_str.push(val.1),
None => panic!("Oh no!")
}
}
vec.push(curr_str);
fib.next();
}
let mut rfib = fib.rev();
while vec.len() < (2 * n) as usize {
let mut curr_str = String::new();
for i in 0..rfib.curr {
match it.next() {
Some(val) => curr_str.push(val.1),
None => panic!("Oh double no!")
}
}
vec.push(curr_str);
rfib.next();
}
// check if splitting at last position (calling unwrap() at None value)
match it.peek() {
Some(val) => split_pos = val.0,
None => split_pos = text.len(),
}
(vec, &text[split_pos..])
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-1vnzjuu/solution) warning: unused variable: `i` --> src/lib.rs:47:13 | 47 | for i in 0..fib.curr { | ^ help: if this is intentional, prefix it with an underscore: `_i` | = note: `#[warn(unused_variables)]` on by default warning: unused variable: `i` --> src/lib.rs:74:13 | 74 | for i in 0..fib.curr { | ^ help: if this is intentional, prefix it with an underscore: `_i` warning: unused variable: `i` --> src/lib.rs:143:13 | 143 | for i in 0..fib.curr { | ^ help: if this is intentional, prefix it with an underscore: `_i` warning: unused variable: `i` --> src/lib.rs:160:13 | 160 | for i in 0..rfib.curr { | ^ help: if this is intentional, prefix it with an underscore: `_i` warning: `solution` (lib) generated 4 warnings Finished test [unoptimized + debuginfo] target(s) in 1.15s 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_n_ascii ... ok test solution_test::fib_split_empty ... 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 ... 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_cyrillic_exact ... 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 ... ok test solution_test::rev_fib_iter_empty ... ok test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s