Решение на Думи на Фибоначи от Силвия Земеделска

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

Към профила на Силвия Земеделска

Резултати

  • 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`

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

Силвия качи първо решение на 31.10.2024 11:06 (преди 11 месеца)