Решение на Думи на Фибоначи от Пламен Стойнев

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

Към профила на Пламен Стойнев

Резултати

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

Код

pub struct FibIter {
pub size: u32,
pub nums: Vec<u32>,
pub current: u32,
}
impl FibIter {
pub fn new(size: u32) -> FibIter {
let mut nums = Vec::new();
nums.push(1);
nums.push(1);
for i in 2..size {
nums.push(nums[i as usize - 1] + nums[i as usize - 2]);
}
FibIter {
size,
nums,
current: 0,
}
}
pub fn next(&mut self) -> u32 {
if self.current < self.size {
let result = self.nums[self.current as usize];
self.current += 1;
result
} else {
panic!("Out of bounds");
}
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
size: self.size,
nums: self.nums,
current: 0,
}
}
}
pub struct RevFibIter {
pub size: u32,
pub nums: Vec<u32>,
pub current: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.current < self.size {
let result = self.nums[self.current as usize];
self.current += 1;
Some(result)
} else {
None
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut result = Vec::new();
let mut iter = FibIter::new(text.len() as u32);
let mut fib_num = iter.next();
let size = text.len();
let mut i = 0;
let mut j: usize = fib_num as usize;
while i < size {
println!("i: {}, j: {}", i, j);
if j >= size {
result.push(text[i..].to_string());
break;
}
let mut temp = String::new();
temp.push_str(&text[i..j]);
result.push(temp);
i = j;
fib_num = iter.next();
j = j + fib_num as usize;
}
result
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let mut parts = Vec::new();
let mut remaining_text = text;
let mut fib_iter = FibIter::new(n);
let mut count = 0;
while count < n {
let fib_len = fib_iter.next();
if remaining_text.len() <= fib_len as usize {
break;
}
let part = &remaining_text[..fib_len as usize];
parts.push(part.to_string());
remaining_text = &remaining_text[fib_len as usize..];
count += 1;
}
(parts, remaining_text)
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let mut parts = Vec::new();
let mut remaining_text = text;
let mut fib_iter = FibIter::new(n);
let mut count = 0;
while count < n {
let fib_len = fib_iter.next();
if remaining_text.len() <= fib_len as usize {
break;
}
let part = &remaining_text[..fib_len as usize];
parts.push(part.to_string());
remaining_text = &remaining_text[fib_len as usize..];
count += 1;
}
(parts, remaining_text)
}

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

Compiling solution v0.1.0 (/tmp/d20241104-1739405-1xgoasb/solution)
error[E0061]: this function takes 1 argument but 0 arguments were supplied
 --> tests/solution_test.rs:8:24
  |
8 |     let mut fib_iter = FibIter::new();
  |                        ^^^^^^^^^^^^-- an argument of type `u32` is missing
  |
note: associated function defined here
 --> /tmp/d20241104-1739405-1xgoasb/solution/src/lib.rs:8:12
  |
8 |     pub fn new(size: u32) -> FibIter {
  |            ^^^
help: provide the argument
  |
8 |     let mut fib_iter = FibIter::new(/* u32 */);
  |                                    ~~~~~~~~~~~

error[E0061]: this function takes 1 argument but 0 arguments were supplied
  --> tests/solution_test.rs:21:24
   |
21 |     let mut fib_iter = FibIter::new();
   |                        ^^^^^^^^^^^^-- an argument of type `u32` is missing
   |
note: associated function defined here
  --> /tmp/d20241104-1739405-1xgoasb/solution/src/lib.rs:8:12
   |
8  |     pub fn new(size: u32) -> FibIter {
   |            ^^^
help: provide the argument
   |
21 |     let mut fib_iter = FibIter::new(/* u32 */);
   |                                    ~~~~~~~~~~~

error[E0061]: this function takes 1 argument but 0 arguments were supplied
  --> tests/solution_test.rs:41:20
   |
41 |     let fib_iter = FibIter::new();
   |                    ^^^^^^^^^^^^-- an argument of type `u32` is missing
   |
note: associated function defined here
  --> /tmp/d20241104-1739405-1xgoasb/solution/src/lib.rs:8:12
   |
8  |     pub fn new(size: u32) -> FibIter {
   |            ^^^
help: provide the argument
   |
41 |     let fib_iter = FibIter::new(/* u32 */);
   |                                ~~~~~~~~~~~

For more information about this error, try `rustc --explain E0061`.
error: could not compile `solution` due to 3 previous errors

История (1 версия и 2 коментара)

Пламен качи първо решение на 30.10.2024 13:02 (преди 11 месеца)

Решението ти не се компилира с пълния тест. Не можеш да променяш сигнатурите на функциите. FibIter::new() не приема аргумент. Идеята на структурата е да е безкраен генератор - помисли как би могъл да я имплементираш без size параметър.

Алтернативно, ако не можеш да се сетиш, можеш да направиш това:

impl FibIter {
    pub fn new() -> FibIter { todo!() }
    pub fn with_size(size: u32) -> FibIter { /* текущуя код */ }

Т.е. да оставиш new функцията неимплементирана и да си направиш друг конструктор, който да използваш в имплементацията на fib_* функциите. Ще загубиш няколко точки от тестовете, които проверяват FibIter директно, но ще получиш точки за fib_* функциите. (todo!() макрото е еквиваленто на panic!("not yet implemented")).

С две думи не е нужно да имплементираш всички функции от условието, можеш да оставиш някои с todo!(). Но трябва да съществуват със същите сигнатури, иначе тестовете не се компилират и ще получиш 0 точки.

Видях току-що коментара, за което се извинявам за малко бавния ми отговор, но малко повечко задачки ми се насъбраха и малко лични не предсказуеми произшествия станах, ето репението без size

pub struct FibIter { pub current: u32, pub prev: u32, }

impl FibIter { pub fn new() -> FibIter { FibIter { current: 0, prev: 0, } }

pub fn next(&mut self) -> u32 {
    if self.current == 0 {
        self.current = 1;
        self.prev = 0;
    } else {
        let temp = self.current;
        self.current = self.current + self.prev;
        self.prev = temp;
    }

    self.current
}

pub fn rev(self) -> RevFibIter {
    RevFibIter {
        size: self.current,
        nums: vec![self.current],
        current: 0,
    }
}

}

pub struct RevFibIter { size: u32, nums: Vec, current: u32, }

impl RevFibIter { pub fn next(&mut self) -> Option { if self.current < self.size { let result = self.nums[self.current as usize]; self.current += 1; Some(result) } else { None } } }

pub fn fib_split(text: &str) -> Vec { let mut result = Vec::new(); let mut iter = FibIter::new(); let mut fib_num = iter.next(); let size = text.len(); let mut i = 0; let mut j: usize = fib_num as usize;

while i < size {

    if j >= size {
        result.push(text[i..].to_string());
        break;
    }
    let mut temp = String::new();
    temp.push_str(&text[i..j]);
    result.push(temp);
    i = j;
    fib_num = iter.next();
    j = j + fib_num as usize;
}

result

}

pub fn fib_split_n(text: &str, n: u32) -> (Vec, &str) { let mut parts = Vec::new(); let mut remaining_text = text; let mut fib_iter = FibIter::new(); let mut count = 0;

while count < n {
    let fib_len = fib_iter.next();
    if remaining_text.len() <= fib_len as usize {
        break;
    }

    let part = &remaining_text[..fib_len as usize];
    parts.push(part.to_string());

    remaining_text = &remaining_text[fib_len as usize..];
    count += 1;
}

(parts, remaining_text)

}

pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec, &str) { let mut parts = Vec::new(); let mut remaining_text = text; let mut fib_iter = FibIter::new(); let mut count = 0;

while count < n {
    let fib_len = fib_iter.next();
    if remaining_text.len() <= fib_len as usize {
        break;
    }

    let part = &remaining_text[..fib_len as usize];
    parts.push(part.to_string());

    remaining_text = &remaining_text[fib_len as usize..];
    count += 1;
}

(parts, remaining_text)

}

fn main() { }

[test]

pub fn test_basic() { let mut fib_iter = FibIter::new(); fib_iter.next();

let mut rev_fib_iter: RevFibIter = fib_iter.rev();
rev_fib_iter.next();

let _words: Vec<String> = fib_split("Fibonacci words!");

let (_words, _rest): (Vec<String>, &str) =
    fib_split_n("Lorem ipsum dolor sit amet, consectetur adipiscing elit.", 1);

let (_words, _rest): (Vec<String>, &str) =
    fib_split_n_symmetric("Lorem ipsum dolor sit amet, consectetur adipiscing elit.", 1);

}