Решение на Text Info от Десислава Цветкова

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

Към профила на Десислава Цветкова

Резултати

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

Код

static ENGLISH_ALPHABET: [char; 52] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',];
static BULGARIAN_ALPHABET: [char; 60] = ['А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е', 'Ж', 'ж', 'З', 'з', 'И', 'и', 'Й', 'й', 'К', 'к', 'Л', 'л', 'М', 'м', 'Н', 'н', 'О', 'о', 'П', 'п', 'Р', 'р', 'С', 'с', 'Т', 'т', 'У', 'у', 'Ф', 'ф', 'Х', 'х', 'Ц', 'ц', 'Ч', 'ч', 'Ш', 'ш', 'Щ', 'щ', 'Ъ', 'ъ', 'Ь', 'ь', 'Ю', 'ю', 'Я', 'я',];
static ENDINGS: [char; 3] = ['?', '!', '.'];
pub struct TextInfo<'a> {
content: &'a str,
}
impl<'a> TextInfo<'a> {
pub fn new(s: &'a str) -> Self {
Self {
content: s,
}
}
pub fn char_count(&self) -> usize {
self.content.chars().count()
}
pub fn alphabetic_count(&self) -> usize {
let is_letter = |element: char| -> bool { ENGLISH_ALPHABET.contains(&element) || BULGARIAN_ALPHABET.contains(&element) };
self.count_letters(&is_letter)
}
pub fn latin_letter_count(&self) -> usize {
let is_latin_letter = |element: char| -> bool { ENGLISH_ALPHABET.contains(&element) };
self.count_letters(&is_latin_letter)
}
pub fn cyrillic_letter_count(&self) -> usize {
let is_bulgarian_letter = |element: char| -> bool { BULGARIAN_ALPHABET.contains(&element) };
self.count_letters(&is_bulgarian_letter)
}
fn count_letters(&self, func: &Fn(char) -> bool) -> usize {
let mut count = 0;
for element in self.content.chars() {
if func(element) {
count += 1;
}
}
count
}
pub fn word_count(&self) -> usize {
let is_letter = |&element: &char| -> bool { ENGLISH_ALPHABET.contains(&element) || BULGARIAN_ALPHABET.contains(&element) };
self.content.split(|c: char| !is_letter(&c)).filter(|word| !word.is_empty()).count()
}
pub fn sentence_count(&self) -> usize {
Self::get_endings(self.content).len()
}
fn find_emotion_count(ending_chars: &std::vec::Vec<char>, mark: char) -> usize {
(ending_chars).into_iter().filter(|&ch| *ch == mark).count()
}
pub fn emotion(&self) -> String {
let ending_chars = Self::get_endings(self.content);
match (Self::find_emotion_count(&ending_chars, '!'), Self::find_emotion_count(&ending_chars, '?'), Self::find_emotion_count(&ending_chars, '.')) {
(excl, quest, neutr) if excl > quest && excl > neutr => String::from("😮"),
(excl, quest, neutr) if quest > excl && quest > neutr => String::from("🤔"),
_ => String::from("😐"),
}
}
fn get_endings(content: &str) -> std::vec::Vec<char> {
let mut ending_chars = Vec::new();
let mut is_prev_char_ending = true;
for new_char in content.chars() {
if ENDINGS.contains(&new_char) && !is_prev_char_ending {
ending_chars.push(new_char);
is_prev_char_ending = true;
} else if ENDINGS.contains(&new_char) {
is_prev_char_ending = true;
} else {
is_prev_char_ending = false;
}
}
ending_chars
}
}

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

Compiling solution v0.1.0 (file:///tmp/d20171026-5817-7hs6ak/solution)
invalid expression
!2276 = !DIExpression(6, 34, 0, 6)
invalid expression
!3199 = !DIExpression(6, 34, 0)
invalid expression
!2275 = !DIExpression(6, 34, 0, 6)
invalid expression
!3198 = !DIExpression(6, 34, 0)
    Finished dev [unoptimized + debuginfo] target(s) in 4.10 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

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

Десислава качи първо решение на 24.10.2017 12:29 (преди почти 8 години)

Стабилно решение :). Усещам го като малко джаварско, но може би така ми се струва, щото знам, че си в Астеа :D. Оставил съм ти някои препоръки за промени, ако ти се експериментира.

Десислава качи решение на 24.10.2017 16:48 (преди почти 8 години)

static ENGLISH_ALPHABET: [char; 52] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',];
static BULGARIAN_ALPHABET: [char; 60] = ['А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е', 'Ж', 'ж', 'З', 'з', 'И', 'и', 'Й', 'й', 'К', 'к', 'Л', 'л', 'М', 'м', 'Н', 'н', 'О', 'о', 'П', 'п', 'Р', 'р', 'С', 'с', 'Т', 'т', 'У', 'у', 'Ф', 'ф', 'Х', 'х', 'Ц', 'ц', 'Ч', 'ч', 'Ш', 'ш', 'Щ', 'щ', 'Ъ', 'ъ', 'Ь', 'ь', 'Ю', 'ю', 'Я', 'я',];
static ENDINGS: [char; 3] = ['?', '!', '.'];
pub struct TextInfo<'a> {
content: &'a str,
}
impl<'a> TextInfo<'a> {
pub fn new(s: &'a str) -> Self {
Self {
content: s,
}
}
pub fn char_count(&self) -> usize {
self.content.chars().count()
}
pub fn alphabetic_count(&self) -> usize {
let is_letter = |element: char| -> bool { ENGLISH_ALPHABET.contains(&element) || BULGARIAN_ALPHABET.contains(&element) };
self.count_letters(&is_letter)
}
pub fn latin_letter_count(&self) -> usize {
let is_latin_letter = |element: char| -> bool { ENGLISH_ALPHABET.contains(&element) };
self.count_letters(&is_latin_letter)
}
pub fn cyrillic_letter_count(&self) -> usize {
let is_bulgarian_letter = |element: char| -> bool { BULGARIAN_ALPHABET.contains(&element) };
self.count_letters(&is_bulgarian_letter)
}
fn count_letters(&self, func: &Fn(char) -> bool) -> usize {
let mut count = 0;
for element in self.content.chars() {
if func(element) {
count += 1;
}
}
count
}
pub fn word_count(&self) -> usize {
let is_letter = |&element: &char| -> bool { ENGLISH_ALPHABET.contains(&element) || BULGARIAN_ALPHABET.contains(&element) };
- let words: Vec<&str> = self.content.split(|c: char| !is_letter(&c)).filter(|word| !word.is_empty()).collect();
- words.len()
+ self.content.split(|c: char| !is_letter(&c)).filter(|word| !word.is_empty()).count()
}
pub fn sentence_count(&self) -> usize {
Self::get_endings(self.content).len()
}
+ fn find_emotion_count(ending_chars: &std::vec::Vec<char>, mark: char) -> usize {
+ (ending_chars).into_iter().filter(|&ch| *ch == mark).count()
+ }
+
pub fn emotion(&self) -> String {
let ending_chars = Self::get_endings(self.content);
- let exclamation_count:usize = (&ending_chars).into_iter().filter(|&ch| *ch == '!').collect::<Vec<&char>>().len();
- let question_count:usize = (&ending_chars).into_iter().filter(|&ch| *ch == '?').collect::<Vec<&char>>().len();
- let neutral_count:usize = (&ending_chars).into_iter().filter(|&ch| *ch == '.').collect::<Vec<&char>>().len();
- match (exclamation_count, question_count, neutral_count) {
+ match (Self::find_emotion_count(&ending_chars, '!'), Self::find_emotion_count(&ending_chars, '?'), Self::find_emotion_count(&ending_chars, '.')) {
(excl, quest, neutr) if excl > quest && excl > neutr => String::from("😮"),
(excl, quest, neutr) if quest > excl && quest > neutr => String::from("🤔"),
_ => String::from("😐"),
}
}
fn get_endings(content: &str) -> std::vec::Vec<char> {
let mut ending_chars = Vec::new();
let mut is_prev_char_ending = true;
for new_char in content.chars() {
if ENDINGS.contains(&new_char) && !is_prev_char_ending {
- ending_chars.push(new_char.clone());
+ ending_chars.push(new_char);
is_prev_char_ending = true;
} else if ENDINGS.contains(&new_char) {
is_prev_char_ending = true;
} else {
is_prev_char_ending = false;
}
}
ending_chars
}
}