Решение на Text Info от Александър Иванов

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

Към профила на Александър Иванов

Резултати

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

Код

use std::collections::HashMap;
pub struct TextInfo {
s: String
}
impl TextInfo {
pub fn new(s: &str) -> Self {
TextInfo { s: s.to_string() }
}
pub fn char_count(&self) -> usize {
self.s.chars().count()
}
pub fn alphabetic_count(&self) -> usize {
self.s.chars().filter(|c| is_alpha(c.clone())).count()

Не би трябвало да е нужно да викаш clone на char, понеже (съм почти сигурен, че) е тип, който се копира. Ако имаш желание, експериментирай да видиш дали можеш да го избегнеш.

Използвай го като повод да седнеш и да пишеш по кода, и може и по инерция да подобриш и "VERY LAME" нещата по-долу ;).

}
pub fn latin_letter_count(&self) -> usize {
self.s.chars().filter(|c| is_latin(c.clone())).count()
}
pub fn cyrillic_letter_count(&self) -> usize {
self.s.chars().filter(|c| is_cyrillic(c.clone())).count()
}
pub fn word_count(&self) -> usize {
self.s.split(|c| !is_alpha(c)).filter(|w| w.len() > 0).count()
}
pub fn sentence_count(&self) -> usize {
(self.s.clone() + " .").replace("...", ".").split(is_punctuation).filter(|s| s.len() > 0).count() - 1
}
pub fn emotion(&self) -> String {
// VERY LAME
// fix it when i have time
let mut sentence_length = 0usize;
let mut emotions: [usize; 3] = [0, 0, 0];
let symbols: [&str; 3] = ["😮", "🤔", "😐"];
let punctuation_emotions: HashMap<char, usize> =
[('!', 0), ('?', 1), ('.', 2)].iter().cloned().collect();
let mut last = ' ';
for c in self.s.chars() {
if c == last {
continue;
} else if is_punctuation(c) && sentence_length > 0 {
emotions[punctuation_emotions[&c]] += 1;
sentence_length = 0;
} else {
sentence_length += 1;
}
last = c;
}
if emotions[0] > emotions[1] && emotions[0] > emotions[2] {
symbols[0].to_string()
} else if emotions[1] > emotions[0] && emotions[1] > emotions[2] {
symbols[1].to_string()
} else {
symbols[2].to_string()
}
}
}
fn is_punctuation(c: char) -> bool {
c == '.' || c == '?' || c == '!'
}
fn is_alpha(c: char) -> bool {
is_latin(c) || is_cyrillic(c)
}
fn is_latin(c: char) -> bool {
c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'
}
fn is_cyrillic(c: char) -> bool {
// should be good enough
c >= 'а' && c <= 'я' || c >= 'А' && c <= 'Я'
}

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

Compiling solution v0.1.0 (file:///tmp/d20171026-5817-f0yzeu/solution)
invalid expression
!4607 = !DIExpression(6, 34, 0, 6)
invalid expression
!4610 = !DIExpression(6, 34, 8, 6)
invalid expression
!4608 = !DIExpression(6, 34, 0, 6)
invalid expression
!4611 = !DIExpression(6, 34, 8, 6)
    Finished dev [unoptimized + debuginfo] target(s) in 5.11 secs
     Running target/debug/deps/solution-f5dd4e94aa395cae

running 0 tests

test result: ok. 0 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 версия и 2 коментара)

Александър качи първо решение на 23.10.2017 11:54 (преди почти 8 години)