Решение на Думи на Фибоначи от Георги Йорданов

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

Към профила на Георги Йорданов

Резултати

  • 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

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

Георги качи първо решение на 27.10.2024 19:45 (преди 11 месеца)