Решение на Думи на Фибоначи от Василен Петков
Резултати
- 13 точки от тестове
- 0 бонус точки
- 13 точки общо
- 13 успешни тест(а)
- 7 неуспешни тест(а)
Код
// Структура за итериране на числата на Фибоначи
pub struct FibIter {
current_number: u32,
next_number: u32,
}
impl FibIter {
//new създава нова инстанция, която ще итерира по редицата, започвайки от F0
pub fn new() -> FibIter {
FibIter { current_number: 1, next_number: 1 }
}
//next връща следващото число от редицата. При първото извикване трябва да върне F0, после F1 и т.н.
pub fn next(&mut self) -> u32 {
let result = self.current_number;
let new_next = self.current_number + self.next_number;
self.current_number = self.next_number;
self.next_number = new_next;
result
}
}
// Функция, която разделя текста на думи с дължини, базирани на числата на Фибоначи
pub fn fib_split(text: &str) -> Vec<String> {
let mut fib_iter = FibIter::new();
let mut result = Vec::new();
let mut start_index = 0;
// Докато имаме текст, продължаваме да делим на думи
while start_index < text.len() {
let length = fib_iter.next() as usize;
let mut end_index = start_index + length;
if end_index > text.len() {
end_index = text.len();
}
result.push(text[start_index..end_index].to_string());
start_index = end_index;
}
result
}
// Функция, която разделя текста на първите `n` думи и връща остатъка
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib_iter = FibIter::new();
let mut result = Vec::new();
let mut start_index = 0;
for _ in 0..n {
let length = fib_iter.next() as usize;
let end_index = start_index + length;
if end_index > text.len() {
panic!("Текстът не е достатъчно дълъг!");
}
result.push(text[start_index..end_index].to_string());
start_index = end_index;
}
(result, &text[start_index..])
}
// Структура за обратно итериране на Фибоначи числата
pub struct RevFibIter {
sequence: Vec<u32>,
index: usize,
}
impl FibIter {
// Метод, който връща нова инстанция на RevFibIter, започваща от последното число на FibIter
pub fn rev(mut self) -> RevFibIter {
let mut sequence = Vec::new();
while let Some(fib_number) = Some(self.next()) {
sequence.push(fib_number);
if sequence.len() > 1 && sequence[sequence.len() - 1] < sequence[sequence.len() - 2] {
break;
}
}
let index = sequence.len() as usize - 1;
RevFibIter { sequence, index }
}
}
impl RevFibIter {
// Метод, който връща следващото число от Фибоначи редицата в обратен ред
pub fn next(&mut self) -> Option<u32> {
let result = self.sequence[self.index as usize];
self.index -= 1;
Some(result)
}
}
// Функция, която разделя текста на симетрични Фибоначи думи
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib_iter = FibIter::new();
let mut result = Vec::new();
let mut start_index = 0;
let mut lengths = Vec::new();
for _ in 0..n {
lengths.push(fib_iter.next() as usize);
}
for &length in &lengths {
let end_index = start_index + length;
if end_index > text.len() {
panic!("Текстът не е достатъчно дълъг!");
}
result.push(text[start_index..end_index].to_string());
start_index = end_index;
}
for &length in lengths.iter().rev() {
let end_index = start_index + length;
if end_index > text.len() {
panic!("Текстът не е достатъчно дълъг!");
}
result.push(text[start_index..end_index].to_string());
start_index = end_index;
}
(result, &text[start_index..])
}
fn main() {
let text = "Fibonacci words";
println!("{:?}", fib_split(text));
println!("{:?}", fib_split_n("Lorem ipsum dolor sit amet.", 6));
println!("{:?}", fib_split_n_symmetric("Lorem ipsum dolor sit amet.", 5));
println!("{:?}", fib_split_n_symmetric("Hello world! This is my first Rust Program!",6));
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-1ros90d/solution) warning: function `main` is never used --> src/lib.rs:134:4 | 134 | fn main() { | ^^^^ | = note: `#[warn(dead_code)]` on by default warning: `solution` (lib) generated 1 warning Finished test [unoptimized + debuginfo] target(s) in 1.10s 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_empty ... ok test solution_test::fib_split_cyrillic ... FAILED test solution_test::fib_split_n_ascii ... ok test solution_test::fib_split_n_ascii_exact ... ok test solution_test::fib_split_n_cyrillic ... FAILED test solution_test::fib_split_n_ascii_panic ... ok 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 ... ok 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_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:38:17 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ---- 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:58:19 ---- 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:58:19 ---- 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:116:19 ---- 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:116:19 ---- solution_test::rev_fib_iter stdout ---- thread 'solution_test::rev_fib_iter' panicked at 'attempt to add with overflow', src/lib.rs:17:22 ---- solution_test::rev_fib_iter_empty stdout ---- thread 'solution_test::rev_fib_iter_empty' panicked at 'attempt to add with overflow', src/lib.rs:17:22 failures: solution_test::fib_split_cyrillic solution_test::fib_split_n_cyrillic solution_test::fib_split_n_cyrillic_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. 13 passed; 7 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--test solution_test`