Пламен качи първо решение на 28.10.2024 16:02 (преди 11 месеца)
Извинявай, някакси съм пропуснал да ти пиша по-рано. Решението ти не се компилира с пълния тест.
Функциите fib_split
, fib_split_n
и fib_split_n_symmetric
трябва да са свободни функции. Само new
, next
и rev
трябва да са методи на FibIter
.
Здрасти, преди малко си говорехме относно решението ми. Не се комплираше, защото функции бяха в impl блока на FibIter. Долу е правилното решение, като единствената разликата е че съм извадил функциите от този impl блок.
pub struct FibIter { curr_value: u32, prev_value: u32, }
pub struct RevFibIter { curr_value: u32, prev_value: u32, }
impl RevFibIter { pub fn next(&mut self) -> Option { if self.curr_value < 1 { return None; }
let temp = self.prev_value - self.curr_value;
self.prev_value = self.curr_value;
self.curr_value = temp;
Some(self.prev_value)
}
}
impl FibIter { pub fn new() -> FibIter { FibIter {curr_value: 1, prev_value: 0} }
pub fn rev(self) -> RevFibIter {
RevFibIter {prev_value: self.curr_value, curr_value: self.prev_value}
}
pub fn next(&mut self) -> u32 {
let temp = self.curr_value + self.prev_value;
self.prev_value = self.curr_value;
self.curr_value = temp;
self.prev_value
}
} fn get_word_cutoff(added_chars_count: &mut usize, word_len: usize, chars: &Vec::) -> String { let word_end = *added_chars_count + word_len;
let word: String = if word_end < chars.len() {
chars[*added_chars_count..word_end].into_iter().collect()
} else {
chars[*added_chars_count..].into_iter().collect()
};
*added_chars_count += word_len;
word
}
fn get_word_safely(added_chars_count: &mut usize, added_bites_size: &mut usize, word_len: usize, chars: &Vec::<char>) -> String {
let word_end = *added_chars_count + word_len;
if word_end > chars.len() {
panic!("Низът е твърде кратък!");
}
let word: String = chars[*added_chars_count..word_end].into_iter().collect();
*added_chars_count += word_len;
*added_bites_size += word.len();
word
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut fib_iter = FibIter::new();
let mut words = Vec::<String>::new();
let chars: Vec<char> = text.chars().collect();
let mut added_chars_count= 0;
while added_chars_count < chars.len() {
let word_len = fib_iter.next() as usize;
let word = get_word_cutoff(&mut added_chars_count, word_len, &chars);
words.push(word);
}
words
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib_iter = FibIter::new();
let mut words = Vec::<String>::new();
let chars: Vec<char> = text.chars().collect();
let mut added_chars_count = 0;
let mut added_bites_size = 0;
for _ in 0..n {
let word_len = fib_iter.next() as usize;
let word = get_word_safely(&mut added_chars_count, &mut added_bites_size, word_len, &chars);
words.push(word);
}
(words, &text[added_bites_size..])
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let mut fib_iter = FibIter::new();
let mut words = Vec::<String>::new();
let chars: Vec<char> = text.chars().collect();
let mut added_chars_count = 0;
let mut added_bites_size = 0;
for _ in 0..n {
let word_len = fib_iter.next() as usize;
let word = get_word_safely(&mut added_chars_count, &mut added_bites_size, word_len, &chars);
words.push(word);
}
let mut rev_fib_iter = fib_iter.rev();
while let Some(word_len) = rev_fib_iter.next() {
let word = get_word_safely(&mut added_chars_count, &mut added_bites_size, word_len as usize, &chars);
words.push(word);
}
(words, &text[added_bites_size..])
}