Решение на Думи на Фибоначи от Божидар Виденов

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

Към профила на Божидар Виденов

Резултати

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

Код

pub struct FibIter {
curr_num: u32,
idx: u32,
}
impl FibIter {
pub fn new() -> FibIter {
Self {
curr_num: 1,
idx: 0,
}
}
pub fn next(&mut self) -> u32 {
self.idx += 1;
//NOTE: This formula is from entering f(0) = 1, f(1) = 1, f(n) = f(n-1)+f(n-2) in wolfram alpha,
//then clicking on the *Recurrence equation solution*(because the first equation you get is
//uses fibonacci number and lucas number.
//I could do it using for cycle and keeping the last two parameters but this seemed more
//interesting
let idx_float = f64::from(self.idx);
let sqrt_5 = 5.0_f64.sqrt();
let a = 0.5 * (1.0 + sqrt_5);
let b = 2.0 / (1.0 + sqrt_5);
let term1 = a.powi(self.idx.try_into().unwrap());
let term2 = b.powi(self.idx.try_into().unwrap());
let cos_term = (idx_float as f64 * 3.1415927/* PI */).cos();
let numerator = term1 + term2 * cos_term + (term1 - term2 * cos_term) / sqrt_5;
let result = numerator / 2.0;
self.curr_num = result.round() as u32;
self.curr_num
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
curr_num: self.curr_num,
idx: self.idx,
}
}
}
pub struct RevFibIter {
curr_num: u32,
idx: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.idx == 0 {
return None;
}
self.idx -= 1;
//NOTE: check the comment on FibIter::next()
let idx_float = f64::from(self.idx);
let sqrt_5 = 5.0_f64.sqrt();
let a = 0.5 * (1.0 + sqrt_5);
let b = 2.0 / (1.0 + sqrt_5);
let term1 = a.powi(self.idx.try_into().unwrap());
let term2 = b.powi(self.idx.try_into().unwrap());
let cos_term = (idx_float as f64 * 3.1415927/* PI */).cos();
let numerator = term1 + term2 * cos_term + (term1 - term2 * cos_term) / sqrt_5;
let result = numerator / 2.0;
self.curr_num = result.round() as u32;
Some(self.curr_num)
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut fib_iter = FibIter::new();
let mut res: Vec<String> = Vec::new();
let mut curr_start_idx = 0;
for i in 0..text.len() {
let curr_num: usize = fib_iter.curr_num.try_into().unwrap();
if i - curr_start_idx == curr_num {
res.push(text[curr_start_idx..i].to_string());
curr_start_idx = i;
fib_iter.next();
}
}
res.push(text[curr_start_idx..].to_string());
return res;
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib_iter = FibIter::new();
let mut res: Vec<String> = Vec::new();
let mut curr_start_idx = 0;
let mut split_counter = 0;
for i in 0..text.len() {
let curr_num: usize = fib_iter.curr_num.try_into().unwrap();
if i - curr_start_idx == curr_num {
res.push(text[curr_start_idx..i].to_string());
curr_start_idx = i;
fib_iter.next();
split_counter += 1;
}
if split_counter == n {
break;
}
}
if split_counter < n {
panic!("The text could not be split properly");
}
return (res, &text[curr_start_idx..]);
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib_iter = FibIter::new();
let mut res: Vec<String> = Vec::new();
let mut curr_start_idx = 0;
let mut split_counter: i64 = 0;
for i in 0..text.len() {
let curr_num: usize = fib_iter.curr_num.try_into().unwrap();
if i - curr_start_idx == curr_num {
res.push(text[curr_start_idx..i].to_string());
curr_start_idx = i;
if split_counter == (n - 1).try_into().unwrap() {
break;
}
fib_iter.next();
split_counter += 1;
}
}
if split_counter < (n - 1).try_into().unwrap() {
panic!("The text could not be split properly");
}
let mut rev_fib_iter = fib_iter.rev();
for i in curr_start_idx..text.len() {
let curr_num: usize = rev_fib_iter.curr_num.try_into().unwrap();
if i - curr_start_idx == curr_num {
res.push(text[curr_start_idx..i].to_string());
curr_start_idx = i;
split_counter -= 1;
if rev_fib_iter.next() == None {
break;
}
}
}
if split_counter > 0 {
panic!("The text could not be split properly");
}
return (res, &text[curr_start_idx..]);
}

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

Compiling solution v0.1.0 (/tmp/d20241104-1739405-9qpnky/solution)
    Finished test [unoptimized + debuginfo] target(s) in 0.99s
     Running tests/solution_test.rs (target/debug/deps/solution_test-1428e1090729d165)

running 20 tests
test solution_test::fib_split_ascii ... ok
test solution_test::fib_iter ... 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 ... FAILED
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 ... ok
test solution_test::fib_split_n_symmetric_ascii_exact ... 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_cyrillic_panic ... ok
test solution_test::fib_split_n_symmetric_zero ... FAILED
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_iter stdout ----
thread 'solution_test::fib_iter' panicked at 'assertion failed: `(left == right)`
  left: `2`,
 right: `1`', tests/solution_test.rs:11: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:86:22

---- solution_test::fib_split_n_ascii_exact stdout ----
thread 'solution_test::fib_split_n_ascii_exact' panicked at 'The text could not be split properly', src/lib.rs:117:9

---- 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:106:22

---- 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:106:22

---- 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", "12", "3"]`,
 right: `["a", "b", "cd", "12", "3", "4"]`', tests/solution_test.rs:147:5

---- solution_test::fib_split_n_symmetric_ascii_panic stdout ----
thread 'solution_test::fib_split_n_symmetric_ascii_panic' panicked at 'assertion failed: catch_unwind(|| fib_split_n_symmetric(\"\", 1)).is_err()', tests/solution_test.rs:153: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:132:22

---- 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:132:22

---- solution_test::fib_split_n_symmetric_zero stdout ----
thread 'solution_test::fib_split_n_symmetric_zero' panicked at 'attempt to subtract with overflow', src/lib.rs:142:24


failures:
    solution_test::fib_iter
    solution_test::fib_split_cyrillic
    solution_test::fib_split_n_ascii_exact
    solution_test::fib_split_n_cyrillic
    solution_test::fib_split_n_cyrillic_exact
    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::fib_split_n_symmetric_zero

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 коментара)

Божидар качи първо решение на 28.10.2024 21:13 (преди 11 месеца)