Решение на Думи на Фибоначи от Стоян Дарджиков
Към профила на Стоян Дарджиков
Резултати
- 18 точки от тестове
- 0 бонус точки
- 18 точки общо
- 18 успешни тест(а)
- 2 неуспешни тест(а)
Код
pub struct FibIter {
first_fib: u32,
second_fib: u32,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter {first_fib: 0, second_fib: 0}
}
pub fn next(&mut self) -> u32 {
if self.second_fib == 0 {
self.second_fib += 1;
return 1;
}
let res = self.first_fib + self.second_fib;
self.first_fib = self.second_fib;
self.second_fib = res;
return res;
}
pub fn rev(self) -> RevFibIter {
RevFibIter{greater_fib: self.second_fib, lesser_fib: self.first_fib}
}
}
pub struct RevFibIter {
greater_fib: u32,
lesser_fib: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.greater_fib == 0 {
return None;
}
let res = self.greater_fib;
self.greater_fib = self.lesser_fib;
self.lesser_fib = res - self.lesser_fib;
return Some(res);
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut vec: Vec<String> = Vec::new();
let mut fib_iter = FibIter::new();
let mut char_iter = text.chars();
loop {
let fib_num = fib_iter.next();
let mut str = String::new();
let mut ended: bool = false;
for _i in 0..fib_num {
let option = char_iter.next();
match option {
None => { ended = true; break},
Some(ch) => str.push(ch),
}
}
if !str.is_empty() {
vec.push(str);
}
if ended {break;}
}
return vec;
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let mut vec: Vec<String> = Vec::new();
let mut fib_iter = FibIter::new();
let mut char_iter = text.chars();
let mut bytes_passed = 0;
for _i in 0..n {
let fib_num = fib_iter.next();
let mut str = String::new();
let mut ended: bool = false;
for _i in 0..fib_num {
let option = char_iter.next();
match option {
None => {
ended = true;
break
},
Some(ch) => {
str.push(ch);
bytes_passed += ch.len_utf8();
}
}
}
if !str.is_empty() {
vec.push(str);
}
if ended {break;}
}
if vec.len() != n as usize
{
panic!("Not enough characters to split");
}
let remaining_str = &text[bytes_passed..];
return (vec, remaining_str);
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let mut vec: Vec<String> = Vec::new();
let mut fib_iter = FibIter::new();
let mut char_iter = text.chars();
let mut bytes_passed = 0;
for _i in 0..n {
let fib_num = fib_iter.next();
let mut str = String::new();
let mut ended: bool = false;
for _i in 0..fib_num {
let option = char_iter.next();
match option {
None => {
ended = true;
break
},
Some(ch) => {
str.push(ch);
bytes_passed += ch.len_utf8();
}
}
}
if !str.is_empty() {
vec.push(str);
}
if ended {break;}
}
if vec.len() != n as usize
{
panic!("Not enough characters to split");
}
let mut revfib_iter = fib_iter.rev();
for _i in n..n*2 {
let fib_num_option = revfib_iter.next();
let fib_num = match fib_num_option {
Some(num) => num,
None => {0} // 0 защото този код е недостижим, заради имплементацията на FibIter::rev() и RevFibIter
};
let mut str = String::new();
let mut ended: bool = false;
for _i in 0..fib_num {
let option = char_iter.next();
match option {
None => {
ended = true;
break
},
Some(ch) => {
str.push(ch);
bytes_passed += ch.len_utf8();
}
}
}
if !str.is_empty() {
vec.push(str);
}
if ended {break;}
}
if vec.len() != (n*2) as usize
{
panic!("Not enough characters to split");
}
let remaining_str = &text[bytes_passed..];
return (vec, remaining_str);
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-19gvl4v/solution) Finished test [unoptimized + debuginfo] target(s) in 0.93s 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 ... FAILED test solution_test::fib_split_n_cyrillic_exact ... ok test solution_test::fib_split_n_symmetric_ascii ... ok test solution_test::fib_split_n_cyrillic_panic ... FAILED 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 ... ok test solution_test::rev_fib_iter_empty ... ok failures: ---- solution_test::fib_split_n_ascii_panic stdout ---- thread 'solution_test::fib_split_n_ascii_panic' panicked at 'Not enough characters to split', src/lib.rs:98:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread 'solution_test::fib_split_n_ascii_panic' panicked at 'assertion failed: catch_unwind(|| fib_split_n(\"abcd_123\", 5)).is_err()', tests/solution_test.rs:96:5 ---- solution_test::fib_split_n_cyrillic_panic stdout ---- thread 'solution_test::fib_split_n_cyrillic_panic' panicked at 'assertion failed: catch_unwind(|| fib_split_n(\"манджа_with_грозде\", 6)).is_err()', tests/solution_test.rs:119:5 failures: solution_test::fib_split_n_ascii_panic solution_test::fib_split_n_cyrillic_panic test result: FAILED. 18 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--test solution_test`