Решение на Думи на Фибоначи от Катерина Захариева

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

Към профила на Катерина Захариева

Резултати

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

Код

pub struct FibIter {
f1: u32,
f2: u32,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { f1: 0, f2: 0 }
}
pub fn next(&mut self) -> u32 {
if self.f1 == 0 && self.f2 == 0 {
self.f2 = 1;
return 1;
} else if self.f1 == 0 && self.f2 == 1 {
self.f1 = 1;
return 1;
} else {
let f3: u32 = self.f1 + self.f2;
self.f1 = self.f2;
self.f2 = f3;
return f3;
}
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
fl: self.f2,
fp: self.f1,
}
}
}
pub struct RevFibIter {
fp: u32,
fl: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.fl == 0 {
return None;
} else {
let fnew: u32 = self.fl;
self.fl = self.fp;
self.fp = fnew - self.fl;
return Some(fnew);
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut l: Vec<String> = vec![];
let mut fib = FibIter::new();
let mut fibNumber: u32 = fib.next();
let mut counter: u32 = 1;
let mut word: String = Default::default();
for i in text.chars() {
word.push(i);
if counter == fibNumber {
l.push(word.clone());
word.clear();
counter = 1;
fibNumber = fib.next();
} else {
counter += 1;
}
}
l.push(word);
l
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let mut l: Vec<String> = vec![];
let mut fib = FibIter::new();
let mut fibNumber: u32 = fib.next();
let mut counter: u32 = 1;
let mut word: String = Default::default();
for i in text.chars() {
if l.len() >= (n as usize) {
word.push(i);
} else {
word.push(i);
if counter == fibNumber {
l.push(word.clone());
word.clear();
counter = 1;
fibNumber = fib.next();
} else {
counter += 1;
}
}
}
if l.len() < (n as usize) {
panic!("Не съдържа n думи!")
} else {
let size = word.chars().count();
return (l, &text[(text.chars().count() - size)..]);
}
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let mut l: Vec<String> = vec![];
let mut fib = FibIter::new();
let mut fibNumber: u32 = fib.next();
let mut counter: u32 = 1;
let mut word: String = Default::default();
let mut words = text.chars();
let mut i = words.next();
while i != None {
if l.len() <= (n as usize) {
word.push(i.expect("REASON"));
if counter == fibNumber {
l.push(word.clone());
word.clear();
counter = 1;
fibNumber = fib.next();
} else {
counter += 1;
}
i = words.next();
}
else
{
break;
}
}
let mut fibRev = fib.rev();
let mut fibRevNumber = fibRev.next().expect("REASON");
while i != None {
if l.len() <= (2 * n as usize) {
word.push(i.expect("REASON"));
if counter == fibRevNumber {
l.push(word.clone());
word.clear();
counter = 1;
fibRevNumber = fibRev.next().expect("REASON");
} else {
counter += 1;
}
i = words.next();
}
else
{
break;
}
}
if l.len() < (2 * n as usize) {
panic!("Няма достатъчно думи за да е симертично!")
}
while i != None {
word.push(i.expect("REASON"));
i = words.next();
}
let size = word.chars().count();
return (l, &text[(text.chars().count() - size)..]);
}

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

Compiling solution v0.1.0 (/tmp/d20241104-1739405-11f2e07/solution)
warning: variable `fibNumber` should have a snake case name
  --> src/lib.rs:58:13
   |
58 |     let mut fibNumber: u32 = fib.next();
   |             ^^^^^^^^^ help: convert the identifier to snake case: `fib_number`
   |
   = note: `#[warn(non_snake_case)]` on by default

warning: variable `fibNumber` should have a snake case name
  --> src/lib.rs:82:13
   |
82 |     let mut fibNumber: u32 = fib.next();
   |             ^^^^^^^^^ help: convert the identifier to snake case: `fib_number`

warning: variable `fibNumber` should have a snake case name
   --> src/lib.rs:114:13
    |
114 |     let mut fibNumber: u32 = fib.next();
    |             ^^^^^^^^^ help: convert the identifier to snake case: `fib_number`

warning: variable `fibRev` should have a snake case name
   --> src/lib.rs:139:13
    |
139 |     let mut fibRev = fib.rev();
    |             ^^^^^^ help: convert the identifier to snake case: `fib_rev`

warning: variable `fibRevNumber` should have a snake case name
   --> src/lib.rs:140:13
    |
140 |     let mut fibRevNumber = fibRev.next().expect("REASON");
    |             ^^^^^^^^^^^^ help: convert the identifier to snake case: `fib_rev_number`

warning: `solution` (lib) generated 5 warnings
    Finished test [unoptimized + debuginfo] target(s) in 1.01s
     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_cyrillic ... ok
test solution_test::fib_split_empty ... ok
test solution_test::fib_split_n_ascii ... ok
test solution_test::fib_split_n_ascii_exact ... ok
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 ... FAILED
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 ... 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_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:107:21

---- solution_test::fib_split_n_cyrillic_exact stdout ----
thread 'solution_test::fib_split_n_cyrillic_exact' panicked at 'assertion failed: `(left == right)`
  left: `"_with_"`,
 right: `""`', tests/solution_test.rs:114:5

---- solution_test::fib_split_n_symmetric_ascii stdout ----
thread 'solution_test::fib_split_n_symmetric_ascii' panicked at 'assertion failed: `(left == right)`
  left: `["a", "b", "cd"]`,
 right: `["a", "b"]`', tests/solution_test.rs:136:5

---- solution_test::fib_split_n_symmetric_ascii_exact stdout ----
thread 'solution_test::fib_split_n_symmetric_ascii_exact' panicked at 'Няма достатъчно думи за да е симертично!', src/lib.rs:162:9

---- solution_test::fib_split_n_symmetric_cyrillic stdout ----
thread 'solution_test::fib_split_n_symmetric_cyrillic' panicked at 'assertion failed: `(left == right)`
  left: `["м", "а", "нд"]`,
 right: `["м", "а"]`', tests/solution_test.rs:160:5

---- solution_test::fib_split_n_symmetric_cyrillic_exact stdout ----
thread 'solution_test::fib_split_n_symmetric_cyrillic_exact' panicked at 'Няма достатъчно думи за да е симертично!', src/lib.rs:162:9

---- solution_test::fib_split_n_symmetric_zero stdout ----
thread 'solution_test::fib_split_n_symmetric_zero' panicked at 'assertion failed: `(left == right)`
  left: `["a"]`,
 right: `[]`', tests/solution_test.rs:129:5


failures:
    solution_test::fib_split_n_cyrillic
    solution_test::fib_split_n_cyrillic_exact
    solution_test::fib_split_n_symmetric_ascii
    solution_test::fib_split_n_symmetric_ascii_exact
    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. 13 passed; 7 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

error: test failed, to rerun pass `--test solution_test`

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

Катерина качи първо решение на 31.10.2024 17:39 (преди 11 месеца)

Катерина качи решение на 31.10.2024 17:44 (преди 11 месеца)

pub struct FibIter {
f1: u32,
f2: u32,
}
impl FibIter {
pub fn new() -> FibIter {
FibIter { f1: 0, f2: 0 }
}
pub fn next(&mut self) -> u32 {
if self.f1 == 0 && self.f2 == 0 {
self.f2 = 1;
return 1;
} else if self.f1 == 0 && self.f2 == 1 {
self.f1 = 1;
return 1;
} else {
let f3: u32 = self.f1 + self.f2;
self.f1 = self.f2;
self.f2 = f3;
return f3;
}
}
pub fn rev(self) -> RevFibIter {
RevFibIter {
fl: self.f2,
fp: self.f1,
}
}
}
pub struct RevFibIter {
fp: u32,
fl: u32,
}
impl RevFibIter {
pub fn next(&mut self) -> Option<u32> {
if self.fl == 0 {
return None;
} else {
let fnew: u32 = self.fl;
self.fl = self.fp;
self.fp = fnew - self.fl;
return Some(fnew);
}
}
}
pub fn fib_split(text: &str) -> Vec<String> {
let mut l: Vec<String> = vec![];
let mut fib = FibIter::new();
let mut fibNumber: u32 = fib.next();
let mut counter: u32 = 1;
let mut word: String = Default::default();
for i in text.chars() {
word.push(i);
if counter == fibNumber {
l.push(word.clone());
word.clear();
counter = 1;
fibNumber = fib.next();
} else {
counter += 1;
}
}
l.push(word);
l
}
pub fn fib_split_n(text: &str, n: u32) -> (Vec<String>, &str) {
let mut l: Vec<String> = vec![];
let mut fib = FibIter::new();
let mut fibNumber: u32 = fib.next();
let mut counter: u32 = 1;
let mut word: String = Default::default();
for i in text.chars() {
if l.len() >= (n as usize) {
word.push(i);
} else {
word.push(i);
if counter == fibNumber {
l.push(word.clone());
word.clear();
counter = 1;
fibNumber = fib.next();
} else {
counter += 1;
}
}
}
if l.len() < (n as usize) {
panic!("Не съдържа n думи!")
} else {
let size = word.chars().count();
return (l, &text[(text.chars().count() - size)..]);
}
}
pub fn fib_split_n_symmetric(text: &str, n: u32) -> (Vec<String>, &str) {
let mut l: Vec<String> = vec![];
let mut fib = FibIter::new();
let mut fibNumber: u32 = fib.next();
let mut counter: u32 = 1;
let mut word: String = Default::default();
let mut words = text.chars();
let mut i = words.next();
while i != None {
if l.len() <= (n as usize) {
word.push(i.expect("REASON"));
if counter == fibNumber {
l.push(word.clone());
word.clear();
counter = 1;
fibNumber = fib.next();
} else {
counter += 1;
}
i = words.next();
}
+else
+{
break;
+}
}
let mut fibRev = fib.rev();
let mut fibRevNumber = fibRev.next().expect("REASON");
while i != None {
if l.len() <= (2 * n as usize) {
word.push(i.expect("REASON"));
if counter == fibRevNumber {
l.push(word.clone());
word.clear();
counter = 1;
fibRevNumber = fibRev.next().expect("REASON");
} else {
counter += 1;
}
i = words.next();
}
+else
+{
break;
+}
}
if l.len() < (2 * n as usize) {
panic!("Няма достатъчно думи за да е симертично!")
}
while i != None {
word.push(i.expect("REASON"));
i = words.next();
}
let size = word.chars().count();
return (l, &text[(text.chars().count() - size)..]);
}