Решение на Text Info от Биляна Добрева

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

Към профила на Биляна Добрева

Резултати

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

Код

#[derive(Debug)]
pub struct TextInfo {
s: String,
}
impl TextInfo {
pub fn new(s: &str)->Self {
Self {
s: String::from(s),
}
}
pub fn char_count(&self)->usize {
if self.s=="" {
return 0;
}
let mut i: usize = 0;
let mut chars = (&self.s).chars();
while chars.as_str()!="" {
chars.next();
i= i + 1;
}
return i;
}

Този метод (и методите по-надолу) може да се пренапише да е доста по-кратък и по-чист. Като за начало, не би трябвало да имаш нужда от if self.s == "", предвид, че започваш от i равно на 0, и ако нямаш символи, просто ще го върнеш без промяна.

Не е нужно и да вземаш reference към (&self.s), когато му викаш chars метода. Да, технически погледнато този метод е дефиниран на &str, но rust auto-dereference-ва String типа и ще викне метода на &str-то отдолу. Споменавали сме това, ще говорим пак за него по-натам.

Не е нужно и да проверяваш chars.as_str() != "". Това работи, но конвертира итератора до низ и прави текстово сравнение, където други методи биха били концептуално доста по-прости. Примерно, while chars.count() > 0, while !chars.next().is_none(), или даже while let Some(_) = chars.next(). Или, както си направила по-долу, for _ in chars :). А, в конкретния случай, връщането на self.s.chars().count() би ти решило задачата.

Качили сме по-обстоен тест в rust-homework репо-то (https://github.com/fmi/rust-homework/tree/master/01). Ако искаш, изтегли си го, и пробвай да рефакторираш методи, докато тестовете ти минават.

pub fn alphabetic_count(&self) -> usize {
if self.s=="" {
return 0;
}
let mut i: usize = 0;
for c in self.s.chars() {
if (c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='А'&&c<='я'){
i = i + 1;
}
}
return i;
}
pub fn latin_letter_count(&self) -> usize {
if self.s=="" {
return 0;
}
let mut i: usize = 0;
for c in self.s.chars() {
if (c>='A'&&c<='Z')||(c>='a'&&c<='z') {
i = i + 1;
}
}
return i;
}
pub fn cyrillic_letter_count(&self) -> usize {
if self.s=="" {
return 0;
}
let i: usize = self.alphabetic_count() - self.latin_letter_count();
return i;
}
pub fn word_count(&self)-> usize {
let mut br: usize = 0;
let mut chars = (&self.s).chars();
while chars.as_str()!="" {
if word(chars.as_str()) {
br = br + 1;
while word(chars.as_str()) {
chars.next();
}
}
else {
chars.next();
}
}
return br;
}
pub fn sentence_count(&self) -> usize {
let mut br: usize = 0;
let mut chars = (&self.s).chars();
if chars.as_str()=="" {
return 0;
}
if !(end_of_sentence(chars.as_str())) {
while chars.as_str()!="" {
if end_of_sentence(chars.as_str()) {
br = br + 1;
while end_of_sentence(chars.as_str()) {
chars.next();
}
}
else {
chars.next();
}
}
}
return br;
}
pub fn emotion(&self) -> String {
let mut br1: usize = 0;
let mut br2: usize = 0;
let mut br3: usize = 0;
let mut chars = (&self.s).chars();
while chars.as_str()!="" {
if end_of_sentence(chars.as_str()) {
if end_of_sentence_with_emotion(chars.as_str()) == String::from("😐") {
br1 = br1 + 1;
while end_of_sentence_with_emotion(chars.as_str()) == String::from("😐") {
chars.next();
}
}
if end_of_sentence_with_emotion(chars.as_str()) == String::from("😮") {
br2 = br2 + 1;
while end_of_sentence_with_emotion(chars.as_str()) == String::from("😮") {
chars.next();
}
}
if end_of_sentence_with_emotion(chars.as_str()) == String::from("🤔") {
br3 = br3 + 1;
while end_of_sentence_with_emotion(chars.as_str()) == String::from("🤔") {
chars.next();
}
}
}
else {
chars.next();
}
}
if br2>br1&&br2>br3 {
return String::from("😮");
}
if br3>br1&&br3>br2 {
return String::from("🤔");
}
return String::from("😐");
}
}
pub fn word(s1 : &str)-> bool {
if s1=="" {
return false;
}
else {
let mut i:usize = 0;
for c in s1.chars() {
if (c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='А'&&c<='я') {
i = i + 1;
}
else {
break;
}
}
if i == 0 {
return false;
}
else {
return true;
}
}
}
pub fn end_of_sentence(s1 : &str)-> bool {
if s1=="" {
return false;
}
else {
let mut flag: bool = false;
for c in s1.chars() {
if c=='.'||c=='!'||c=='?' {
flag = true;
}
break;
}
return flag;
}
}
pub fn end_of_sentence_with_emotion(s1 : &str)-> String {
let mut flag2: bool = false;
let mut flag3: bool = false;
for c in s1.chars() {
if c=='!' {
flag2 = true;
}
if c=='?' {
flag3 = true;
}
break;
}
if flag2 {
return String::from("😮");
}
if flag3 {
return String::from("🤔");
}
return String::from("😐");
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
}
}

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

Compiling solution v0.1.0 (file:///tmp/d20171026-5817-1avxadb/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 3.43 secs
     Running target/debug/deps/solution-f5dd4e94aa395cae

running 1 test
test tests::it_works ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-c3b431457e2a7a27

running 15 tests
test solution_test::test_alpha_count ... ok
test solution_test::test_alpha_count_2 ... ok
test solution_test::test_char_count ... ok
test solution_test::test_cyrillic_letter_count ... ok
test solution_test::test_emotions ... ok
test solution_test::test_emotions_repeated_punctuation ... ok
test solution_test::test_empty_string ... ok
test solution_test::test_latin_letter_count ... ok
test solution_test::test_sentence_count ... ok
test solution_test::test_sentence_count_2 ... ok
test solution_test::test_triple_dots_count ... ok
test solution_test::test_unicode_char_count ... ok
test solution_test::test_word_count ... ok
test solution_test::test_word_count_2 ... ok
test solution_test::test_word_count_3 ... ok

test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests solution

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

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

Биляна качи първо решение на 25.10.2017 00:59 (преди почти 8 години)