Решение на Думи на Фибоначи от Михаил Цанков

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

Към профила на Михаил Цанков

Резултати

  • 18 точки от тестове
  • 0 бонус точки
  • 18 точки общо
  • 18 успешни тест(а)
  • 2 неуспешни тест(а)

Код

pub struct FibIter {
prev: u32,
cur: u32,
}
trait Iterator {
fn next_optional(&mut self) -> Option<u32>;
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { prev: 0, cur: 1 }
}
pub fn next(&mut self) -> u32 {
(self.cur, self.prev) = (self.cur + self.prev, self.cur);
self.prev
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
cur: self.prev,
prev: self.cur,
}
}
}
impl Iterator for FibIter {
fn next_optional(&mut self) -> Option<u32> {
Some(self.next())
}
}
pub struct RevFibIter {
prev: u32,
cur: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
match self.cur {
0 => None,
_ => {
(self.cur, self.prev) = (self.prev - self.cur, self.cur);
Some(self.prev)
}
}
}
}
impl Iterator for RevFibIter {
fn next_optional(&mut self) -> Option<u32> {
self.next()
}
}
fn split_n(text: &str, n: Option<usize>, iter: &mut dyn Iterator) -> (Vec<String>, String) {
let mut result = Vec::new();
let mut chars = text.chars();
while n == None || result.len() < n.unwrap() {
let c = match chars.next() {
Some(c) => c,
None => break,
};
result.push(String::from(c));
let end = match iter.next_optional() {
Some(v) => v,
None => break,
};
for _ in 1..end {
match chars.next() {
None => break,
Some(c) => result.last_mut().unwrap().push(c),
}
}
}
if n != None && result.len() < n.unwrap() {
panic!("Just no words for this input!");
}
(result, chars.collect())
}
pub fn fib_split(text: &str) -> Vec<String> {
split_n(text, None, &mut FibIter::new()).0
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, String) {
split_n(text, Some(n as usize), &mut FibIter::new())
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, String) {
let mut iter = FibIter::new();
let size = Some(n as usize);
let (fib_split, fib_left_text) = split_n(text, size, &mut iter);
let (rev_fib_split, rev_fib_left_text) = split_n(&fib_left_text, size, &mut iter.rev());
let parts = [&fib_split[..], &rev_fib_split[..]].concat();
(parts, rev_fib_left_text)
}

Лог от изпълнението

Compiling solution v0.1.0 (/tmp/d20241104-1739405-1466c4p/solution)
    Finished test [unoptimized + debuginfo] target(s) in 0.96s
     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_cyrillic_panic ... FAILED
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_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 'Just no words for this input!', src/lib.rs:83: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`

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

Михаил качи първо решение на 30.10.2024 22:36 (преди 11 месеца)