Решение на Думи на Фибоначи от Камен Младенов

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

Към профила на Камен Младенов

Резултати

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

Код

pub struct FibIter {
f0: u32,
f1: u32,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { f0: 1, f1: 1, }
}
pub fn next(&mut self) -> u32 {
let f0 = self.f0;
// 1 2 |-> 2 3
self.f0 = self.f1;
self.f1 += f0;
f0
}
pub fn rev(self) -> RevFibIter {
RevFibIter { f0: self.f1 - self.f0, f1: self.f0 }
}
fn inc(&mut self) -> Option<usize> {
Option::Some(self.next() as usize)
}
}
struct Split {
start: usize,
end: usize,
count: u32,
fib: Option<FibIter>,
rfib: Option<RevFibIter>,
n: u32,
symmetric: bool,
}
impl Split {
fn new(n: u32, symmetric: bool) -> Split {
let mut fib = FibIter::new();
Split { start: 0, end: fib.inc().unwrap(), count: 0, fib: Option::Some(fib), rfib: Option::None, n: n, symmetric: symmetric }
}
fn inc(&mut self) {
if self.symmetric && self.n == self.count {
self.rfib = Option::Some(self.fib.take().unwrap().rev());
}
self.start = self.end;
self.end += match self.fib {
Some(_) => self. fib.as_mut().unwrap().inc().unwrap(),
None => self.rfib.as_mut().unwrap().inc().unwrap()
};
self.count += 1;
}
}
fn _fib_split(text: &str, n: u32, panic: bool, symmetric: bool) -> (Vec<String>, &str) {
let mut out: Vec<String> = Vec::new();
let mut sp = Split::new(n, symmetric);
// ( panic -> sp.count < n)
while sp.end <= text.len() && (!panic || sp.count < n) {
out.push(text[sp.start..sp.end].to_string());
sp.inc();
}
if panic && sp.count < n {
panic!("Split into {} our of {} words!", sp.count, n);
}
(out, &text[sp.start..])
}
pub fn fib_split(text: &str) -> Vec<String> {
_fib_split(text, 0, false, false).0
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
_fib_split(text, n, true, false)
}
pub struct RevFibIter {
f0: u32,
f1: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.f1 == 1 {
return Option::None;
}
// 2 3 |-> 1 2
let f0 = self.f0;
self.f0 = self.f1 - self.f0;
self.f1 = f0;
Option::Some(self.f1)
}
fn inc(&mut self) -> Option<usize> {
let val = self.next();
match val {
Option::Some(_) => Option::Some(val.unwrap() as usize),
Option::None => Option::None,
}
}
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
_fib_split(text, n, true, true)
}

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

Compiling solution v0.1.0 (/tmp/d20241104-1739405-1legh4a/solution)
    Finished test [unoptimized + debuginfo] target(s) in 0.90s
     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 ... FAILED
test solution_test::fib_split_cyrillic ... FAILED
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 ... FAILED
test solution_test::fib_split_n_cyrillic_exact ... FAILED
test solution_test::fib_split_n_cyrillic_panic ... ok
test solution_test::fib_split_n_symmetric_ascii_exact ... FAILED
test solution_test::fib_split_n_symmetric_ascii ... FAILED
test solution_test::fib_split_n_symmetric_ascii_panic ... FAILED
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_zero ... ok
test solution_test::fib_split_n_symmetric_cyrillic_panic ... ok
test solution_test::fib_split_n_zero ... ok
test solution_test::rev_fib_iter ... FAILED
test solution_test::rev_fib_iter_empty ... ok

failures:

---- solution_test::fib_split_ascii stdout ----
thread 'solution_test::fib_split_ascii' panicked at 'assertion failed: `(left == right)`
  left: `["a", "b", "cd", "123"]`,
 right: `["a", "b", "cd", "123", "456"]`', tests/solution_test.rs:55:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

---- solution_test::fib_split_cyrillic stdout ----
thread 'solution_test::fib_split_cyrillic' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа с грозде`', src/lib.rs:64:18

---- solution_test::fib_split_n_cyrillic stdout ----
thread 'solution_test::fib_split_n_cyrillic' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа_with_грозде`', src/lib.rs:64:18

---- solution_test::fib_split_n_cyrillic_exact stdout ----
thread 'solution_test::fib_split_n_cyrillic_exact' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа_with_`', src/lib.rs:64:18

---- solution_test::fib_split_n_symmetric_ascii_exact stdout ----
thread 'solution_test::fib_split_n_symmetric_ascii_exact' panicked at 'assertion failed: `(left == right)`
  left: `["a", "b", "cd"]`,
 right: `["a", "b", "cd", "12", "3", "4"]`', tests/solution_test.rs:147:5

---- solution_test::fib_split_n_symmetric_ascii stdout ----
thread 'solution_test::fib_split_n_symmetric_ascii' panicked at 'assertion failed: `(left == right)`
  left: `["a"]`,
 right: `["a", "b"]`', tests/solution_test.rs:136:5

---- solution_test::fib_split_n_symmetric_ascii_panic stdout ----
thread 'solution_test::fib_split_n_symmetric_ascii_panic' panicked at 'Split into 0 our of 1 words!', src/lib.rs:69:9
thread 'solution_test::fib_split_n_symmetric_ascii_panic' panicked at 'assertion failed: catch_unwind(|| fib_split_n_symmetric(\"abcd_1234\", 4)).is_err()', tests/solution_test.rs:154:5

---- solution_test::fib_split_n_symmetric_cyrillic stdout ----
thread 'solution_test::fib_split_n_symmetric_cyrillic' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа_with_грозде`', src/lib.rs:64:18

---- solution_test::fib_split_n_symmetric_cyrillic_exact stdout ----
thread 'solution_test::fib_split_n_symmetric_cyrillic_exact' panicked at 'byte index 1 is not a char boundary; it is inside 'м' (bytes 0..2) of `манджа_with_гр`', src/lib.rs:64:18

---- solution_test::rev_fib_iter stdout ----
thread 'solution_test::rev_fib_iter' panicked at 'assertion failed: `(left == right)`
  left: `None`,
 right: `Some(1)`', tests/solution_test.rs:34:5


failures:
    solution_test::fib_split_ascii
    solution_test::fib_split_cyrillic
    solution_test::fib_split_n_cyrillic
    solution_test::fib_split_n_cyrillic_exact
    solution_test::fib_split_n_symmetric_ascii
    solution_test::fib_split_n_symmetric_ascii_exact
    solution_test::fib_split_n_symmetric_ascii_panic
    solution_test::fib_split_n_symmetric_cyrillic
    solution_test::fib_split_n_symmetric_cyrillic_exact
    solution_test::rev_fib_iter

test result: FAILED. 10 passed; 10 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

error: test failed, to rerun pass `--test solution_test`

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

Камен качи първо решение на 29.10.2024 19:26 (преди 11 месеца)