Решение на Думи на Фибоначи от Стилиян Иванов
Резултати
- 16 точки от тестове
- 0 бонус точки
- 16 точки общо
- 16 успешни тест(а)
- 4 неуспешни тест(а)
Код
pub struct FibIter {
previous: u32,
current: u32,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter {
previous: 0,
current: 1,
}
}
pub fn next(&mut self) -> u32 {
let next = self.previous + self.current;
self.previous = self.current;
self.current = next;
self.previous
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
previous: self.current,
current: self.previous,
}
}
}
pub struct RevFibIter {
previous: u32,
current: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.current == 0 {
return None;
}
let next = self.previous - self.current;
self.previous = self.current;
self.current = next;
Some(self.previous)
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let chars: Vec<char> = text.chars().collect();
let mut words: Vec<String> = Vec::new();
let mut fib_iter: FibIter = FibIter::new();
let mut index: usize = 0;
let length: usize = chars.len();
while index < length {
let word_length: usize = fib_iter.next().try_into().unwrap();
if index + word_length >= length {
words.push(chars[index..].iter().collect());
break;
}
else {
words.push(chars[index..index + word_length].iter().collect());
index += word_length;
}
}
words
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let chars: Vec<char> = text.chars().collect();
let mut words: Vec<String> = Vec::new();
let mut fib_iter: FibIter = FibIter::new();
let mut index_chars: usize = 0;
let mut index_bytes: usize = 0;
let length: usize = chars.len();
for _ in 0..n {
let word_length: usize = fib_iter.next().try_into().unwrap();
if index_chars + word_length >= length {
panic!("The given text is not long enough for {:?} words", n);
}
else {
let word: String = chars[index_chars..index_chars + word_length].iter().collect();
index_bytes += word.len();
words.push(word);
index_chars += word_length;
}
}
(words, &text[index_bytes..])
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let chars: Vec<char> = text.chars().collect();
let mut words: Vec<String> = Vec::new();
let mut fib_iter: FibIter = FibIter::new();
let mut index_chars: usize = 0;
let mut index_bytes: usize = 0;
let length: usize = chars.len();
for _ in 0..n {
let word_length: usize = fib_iter.next().try_into().unwrap();
if index_chars + word_length >= length {
panic!("The given text is not long enough for {:?} symmetric words", n);
}
else {
let word: String = chars[index_chars..index_chars + word_length].iter().collect();
index_bytes += word.len();
words.push(word);
index_chars += word_length;
}
}
let mut rev_fib_iter: RevFibIter = fib_iter.rev();
for _ in 0..n {
let word_length: usize = match rev_fib_iter.next() {
Some(value) => value as usize,
None => {
break;
}
};
if index_chars + word_length >= length {
panic!("The given text is not long enough for {:?} symmetric words", n);
}
else {
let word: String = chars[index_chars..index_chars + word_length].iter().collect();
index_bytes += word.len();
words.push(word);
index_chars += word_length;
}
}
(words, &text[index_bytes..])
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241104-1739405-12rh90x/solution) Finished test [unoptimized + debuginfo] target(s) in 0.94s 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 ... 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 ... 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 ... FAILED 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 ... FAILED test solution_test::fib_split_n_symmetric_cyrillic_panic ... ok test solution_test::fib_split_n_symmetric_zero ... ok test solution_test::rev_fib_iter ... ok test solution_test::fib_split_n_zero ... ok test solution_test::rev_fib_iter_empty ... ok failures: ---- solution_test::fib_split_n_ascii_exact stdout ---- thread 'solution_test::fib_split_n_ascii_exact' panicked at 'The given text is not long enough for 5 words', src/lib.rs:79:13 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ---- solution_test::fib_split_n_cyrillic_exact stdout ---- thread 'solution_test::fib_split_n_cyrillic_exact' panicked at 'The given text is not long enough for 5 words', src/lib.rs:79:13 ---- solution_test::fib_split_n_symmetric_ascii_exact stdout ---- thread 'solution_test::fib_split_n_symmetric_ascii_exact' panicked at 'The given text is not long enough for 3 symmetric words', src/lib.rs:124:13 ---- solution_test::fib_split_n_symmetric_cyrillic_exact stdout ---- thread 'solution_test::fib_split_n_symmetric_cyrillic_exact' panicked at 'The given text is not long enough for 4 symmetric words', src/lib.rs:124:13 failures: solution_test::fib_split_n_ascii_exact solution_test::fib_split_n_cyrillic_exact solution_test::fib_split_n_symmetric_ascii_exact solution_test::fib_split_n_symmetric_cyrillic_exact test result: FAILED. 16 passed; 4 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--test solution_test`