Решение на Думи на Фибоначи от Симеон Георгиев
Към профила на Симеон Георгиев
Резултати
- 12 точки от тестове
- 0 бонус точки
- 12 точки общо
- 12 успешни тест(а)
- 8 неуспешни тест(а)
Код
pub struct FibIter {
fib_0: u32,
fib_1: u32
}
impl FibIter {
pub fn new() -> FibIter {
FibIter {
fib_0: 1,
fib_1: 1
}
}
pub fn next(&mut self) -> u32 {
let next = self.fib_0;
let fib_2 = self.fib_0 + self.fib_1;
self.fib_0 = self.fib_1;
self.fib_1 = fib_2;
next
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
fib_n: self.fib_1 - self.fib_0,
fib_n_minus_1: self.fib_0 - (self.fib_1 - self.fib_0)
}
}
}
pub struct RevFibIter {
fib_n_minus_1: u32,
fib_n: u32
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
let next = self.fib_n;
let fib_n_minus_2 = self.fib_n - self.fib_n_minus_1;
self.fib_n = self.fib_n_minus_1;
self.fib_n_minus_1 = fib_n_minus_2;
if next != 0 {
Some(next)
} else {
None
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut split_text: Vec<String> = Vec::new();
let mut fib = FibIter::new();
// https://doc.rust-lang.org/std/iter/trait.Iterator.html
let mut chars_iter = text.chars();
loop {
let next_fib = fib.next();
let next_split: String = chars_iter.by_ref().take(next_fib as usize).collect::<String>();
if !next_split.is_empty() {
split_text.push(next_split);
} else {
break
}
}
split_text
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, String) {
if n == 0 {
panic!("n is zero");
}
let mut split_text: Vec<String> = Vec::new();
let mut fib = FibIter::new();
let mut fib_counter = 1;
let mut chars_iter = text.chars();
let remaining_text: String = loop {
let next_fib = fib.next();
let next_split: String = chars_iter.by_ref().take(next_fib as usize).collect::<String>();
if fib_counter > n {
break next_split
}
if !next_split.is_empty() {
split_text.push(next_split);
fib_counter += 1;
} else {
panic!("text isn't n fib words long");
}
};
(split_text, remaining_text)
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, String) {
if n == 0 {
panic!("n is zero");
}
let mut split_text: Vec<String> = Vec::new();
let mut fib = FibIter::new();
let mut fib_counter = 0;
let mut chars_iter = text.chars();
while fib_counter < n {
let next_fib = fib.next();
let next_split: String = chars_iter.by_ref().take(next_fib as usize).collect::<String>();
if !next_split.is_empty() {
split_text.push(next_split);
} else {
panic!("text isn't n fib words long");
}
fib_counter += 1;
}
let mut rev_fib = fib.rev();
fib_counter = 0;
while fib_counter < n {
let next_fib = rev_fib.next().expect("doesnt have symetric words");
let next_split: String = chars_iter.by_ref().take(next_fib as usize).collect::<String>();
if !next_split.is_empty() {
split_text.push(next_split);
} else {
panic!("text isn't n fib words long");
}
fib_counter += 1;
}
(split_text, chars_iter.collect::<String>())
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-1jaf1ay/solution) Finished test [unoptimized + debuginfo] target(s) in 0.88s 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 ... FAILED test solution_test::fib_split_n_ascii_exact ... ok test solution_test::fib_split_n_ascii_panic ... FAILED test solution_test::fib_split_n_cyrillic ... 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 ... FAILED test solution_test::fib_split_n_zero ... FAILED test solution_test::rev_fib_iter ... FAILED test solution_test::rev_fib_iter_empty ... FAILED failures: ---- solution_test::fib_split_n_ascii stdout ---- thread 'solution_test::fib_split_n_ascii' panicked at 'assertion failed: `(left == right)` left: `"b"`, right: `"bcd_123"`', tests/solution_test.rs:79:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ---- solution_test::fib_split_n_ascii_panic stdout ---- thread 'solution_test::fib_split_n_ascii_panic' panicked at 'text isn't n fib words long', src/lib.rs:100:13 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 stdout ---- thread 'solution_test::fib_split_n_cyrillic' panicked at 'assertion failed: `(left == right)` left: `"а"`, right: `"анджа_with_грозде"`', tests/solution_test.rs:103: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 ---- solution_test::fib_split_n_symmetric_zero stdout ---- thread 'solution_test::fib_split_n_symmetric_zero' panicked at 'n is zero', src/lib.rs:109:9 ---- solution_test::fib_split_n_zero stdout ---- thread 'solution_test::fib_split_n_zero' panicked at 'n is zero', src/lib.rs:78:9 ---- solution_test::rev_fib_iter stdout ---- thread 'solution_test::rev_fib_iter' panicked at 'attempt to subtract with overflow', src/lib.rs:41:29 ---- solution_test::rev_fib_iter_empty stdout ---- thread 'solution_test::rev_fib_iter_empty' panicked at 'attempt to subtract with overflow', src/lib.rs:41:29 failures: solution_test::fib_split_n_ascii solution_test::fib_split_n_ascii_panic solution_test::fib_split_n_cyrillic solution_test::fib_split_n_cyrillic_panic solution_test::fib_split_n_symmetric_zero solution_test::fib_split_n_zero solution_test::rev_fib_iter solution_test::rev_fib_iter_empty test result: FAILED. 12 passed; 8 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--test solution_test`