Решение на Думи на Фибоначи от Силвия Земеделска
Към профила на Силвия Земеделска
Резултати
- 14 точки от тестове
- 0 бонус точки
- 14 точки общо
- 14 успешни тест(а)
- 6 неуспешни тест(а)
Код
pub struct FibIter {
curr: u32,
next: u32,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { curr: 1, next: 1 }
}
pub fn new_fib_iter(n: u32) -> FibIter {
let mut curr = 1;
let mut next = 1;
while curr < n {
let temp = curr;
curr += next;
next = temp;
}
FibIter { curr: curr, next: curr + next}
}
pub fn next(&mut self) -> u32 {
let temp: u32 = self.curr;
self.curr = self.next;
self.next = temp + self.curr;
temp
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
curr: self.curr,
prev: self.next - self.curr,
}
}
}
pub struct RevFibIter {
curr: u32,
prev: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
let curr = self.curr;
if curr == 0 {
return None;
}
let new_curr = self.prev;
if self.curr > self.prev {
self.prev = self.curr - self.prev;
} else {
self.prev = 0;
}
self.curr = new_curr;
Some(curr)
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut fib_iter = FibIter::new();
let mut result = Vec::new();
let mut chars = text.chars();
let mut curr_word = String::new();
let mut curr_fib_num = fib_iter.next() as usize;
'outer: for _ in 0..{
for _ in 0..curr_fib_num {
if let Some(c) = chars.next() {
curr_word.push(c);
} else {
break 'outer;
}
}
result.push(curr_word.clone());
curr_fib_num = fib_iter.next() as usize;
curr_word.clear();
}
if !curr_word.is_empty() {
result.push(curr_word);
}
result
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, String) {
let mut fib_iter = FibIter::new();
let mut result = Vec::new();
let mut chars = text.chars();
for _ in 0..n {
let curr_fib_num = fib_iter.next() as usize;
let mut curr_word = String::new();
for _ in 0..curr_fib_num {
if let Some(c) = chars.next() {
curr_word.push(c);
} else {
panic!("Text too short.😞");
}
}
result.push(curr_word.clone());
}
let ending_text: String = chars.collect();
(result, ending_text)
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, String) {
let (mut fib_sym_sequence, mut remaining_text) = fib_split_n(text, n);
let mut rev_fib_iter = FibIter::new_fib_iter(n).rev();
let mut chars = remaining_text.chars();
for _ in 0..n {
if let Some(fib_num) = rev_fib_iter.next() {
let curr_fib_num = fib_num as usize;
let mut curr_word = String::new();
for _ in 0..curr_fib_num {
if let Some(c) = chars.next() {
curr_word.push(c);
} else {
panic!("Text too short for second half.😞");
}
}
fib_sym_sequence.push(curr_word);
}
}
remaining_text = chars.collect();
(fib_sym_sequence, remaining_text)
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-1pnwm81/solution) Finished test [unoptimized + debuginfo] target(s) in 0.91s 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_ascii_panic ... ok test solution_test::fib_split_n_cyrillic ... 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 ... FAILED 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 ... FAILED 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 ... ok test solution_test::fib_split_n_zero ... ok test solution_test::rev_fib_iter ... FAILED test solution_test::rev_fib_iter_empty ... FAILED failures: ---- solution_test::fib_split_n_symmetric_ascii stdout ---- thread 'solution_test::fib_split_n_symmetric_ascii' panicked at 'assertion failed: `(left == right)` left: `["a", "b", "cd", "1"]`, right: `["a", "b", "c", "d"]`', tests/solution_test.rs:140:5 ---- solution_test::fib_split_n_symmetric_ascii_exact stdout ---- thread 'solution_test::fib_split_n_symmetric_ascii_exact' panicked at 'Text too short for second half.😞', src/lib.rs:129:21 ---- solution_test::fib_split_n_symmetric_cyrillic stdout ---- thread 'solution_test::fib_split_n_symmetric_cyrillic' panicked at 'assertion failed: `(left == right)` left: `["м", "а", "нд", "жа_", "with_", "гро", "зд", "е"]`, right: `["м", "а", "нд", "жа_", "wit", "h_", "г", "р"]`', tests/solution_test.rs:164:5 ---- solution_test::fib_split_n_symmetric_cyrillic_exact stdout ---- thread 'solution_test::fib_split_n_symmetric_cyrillic_exact' panicked at 'Text too short for second half.😞', src/lib.rs:129:21 ---- solution_test::rev_fib_iter stdout ---- thread 'solution_test::rev_fib_iter' panicked at 'assertion failed: `(left == right)` left: `Some(21)`, right: `Some(13)`', tests/solution_test.rs:28:5 ---- solution_test::rev_fib_iter_empty stdout ---- thread 'solution_test::rev_fib_iter_empty' panicked at 'assertion failed: `(left == right)` left: `Some(1)`, right: `None`', tests/solution_test.rs:43:5 failures: solution_test::fib_split_n_symmetric_ascii solution_test::fib_split_n_symmetric_ascii_exact solution_test::fib_split_n_symmetric_cyrillic solution_test::fib_split_n_symmetric_cyrillic_exact solution_test::rev_fib_iter 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`