Решение на Text Info от Николай Коцев

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

Към профила на Николай Коцев

Резултати

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

Код

mod char_helpers {
// I'm not using ranges, because `contains` is experimental feature and I'm
// not sure if you are going to enable it for the tests.
/// Returns `true` if `charecter` is in [a-zA-Z]
pub fn is_latin(character: char) -> bool {
(character >= 'a' && character <= 'z') ||
(character >= 'A' && character <= 'Z')
}
/// Returns `true` if `character` is part of the Cyrillic or Cyrillic
/// Supplement blocks.
pub fn is_cyrillic(character: char) -> bool {
// \u{0400} is the first codepoint in Cyrillic block and \u{052F} is
// the last codepoint in the Cyrillic Supplement block
character >= '\u{0400}' && character <= '\u{052F}'
}
/// Returns `true` if `character` is alphabetic in the definition of
/// of the task
pub fn is_alphabetic(character : char) -> bool {
is_latin(character) || is_cyrillic(character)
}
pub fn is_alphanumeric(character : char) -> bool {
is_alphabetic(character) || (character >= '0' && character <= '9')
}
pub fn is_separator(character: char) -> bool {
!is_alphabetic(character)
}
pub fn is_sentence_separator(character: char) -> bool {
character == '.' || character == '!' || character == '?'
}
}
#[derive(Debug)]
pub struct TextInfo {
char_cnt: usize,
alpha_cnt: usize,
latin_cnt: usize,
cyrillic_cnt: usize,
word_cnt: usize,
sentence_cnt: usize,
emotion_type: char
}
impl TextInfo {
fn emotion_for(counter : (usize, usize, usize)) -> char {
let emoticon;
if counter.2 > counter.0 && counter.2 > counter.1 {
emoticon = '😮';
}
else if counter.1 > counter.0 && counter.1 >= counter.2 {
emoticon = '🤔';
}
else {
emoticon = '😐';
}
emoticon
}

Тук не е нужно да си създаваш локална променлива. Тъй като if клаузата е expression, можеш да напишеш нещо такова:

if counter.2 > counter.0 && counter.2 > counter.1 {
    '😮'
} else if counter.1 > counter.0 && counter.1 >= counter.2 {
    '🤔'
} else {
    '😐';
}

Разбира се, може би си я написал с цел документация/четимост, in which case, fair enough. Но ако е така, може да подобриш четимостта на кода, ако преименуваш counter полето, или директно приемеш три аргумента -- не е лесно да се разбере какво значи counter.0 в този контекст.

fn emotion_counter_incrementer(counter: &mut (usize, usize, usize),
character: char) -> () {
if character == '.' { counter.0 += 1 }
if character == '?' { counter.1 += 1 }
if character == '!' { counter.2 += 1 }
}
pub fn new(source: &str) -> Self {
let mut char_cnt : usize = 0;
let mut alpha_cnt: usize = 0;
let mut latin_cnt: usize = 0;
let mut cyrillic_cnt: usize = 0;
let mut word_cnt: usize = 0;
let mut sentence_cnt: usize = 0;
let mut emotion_cnt = (0_usize, 0_usize, 0_usize);
let mut in_word: bool = false;
let mut in_sentence: bool = false;
for character in source.chars() {
char_cnt += 1;
if ::char_helpers::is_alphabetic(character) { alpha_cnt += 1; }
if ::char_helpers::is_latin(character) { latin_cnt += 1; }
if ::char_helpers::is_cyrillic(character) { cyrillic_cnt += 1; }
if ::char_helpers::is_alphabetic(character) && !in_word {
word_cnt += 1;
in_word = true;
}
if ::char_helpers::is_separator(character) && in_word {
in_word = false;
}
if ::char_helpers::is_alphanumeric(character) && !in_sentence {
sentence_cnt += 1;
in_sentence = true;
}
if ::char_helpers::is_sentence_separator(character) && in_sentence {
in_sentence = false;
Self::emotion_counter_incrementer(&mut emotion_cnt, character);
}
}
Self {
char_cnt: char_cnt,
alpha_cnt: alpha_cnt,
latin_cnt: latin_cnt,
cyrillic_cnt: cyrillic_cnt,
word_cnt: word_cnt,
sentence_cnt: sentence_cnt,
emotion_type: Self::emotion_for(emotion_cnt)
}
}
pub fn char_count(&self) -> usize { self.char_cnt }
pub fn alphabetic_count(&self) -> usize { self.alpha_cnt }
pub fn latin_letter_count(&self) -> usize { self.latin_cnt }
pub fn cyrillic_letter_count(&self) -> usize { self.cyrillic_cnt }
pub fn word_count(&self) -> usize { self.word_cnt }
pub fn sentence_count(&self) -> usize { self.sentence_cnt }
pub fn emotion(&self) -> String { self.emotion_type.to_string() }
}

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

Compiling solution v0.1.0 (file:///tmp/d20171026-5817-1ukh7zb/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 3.13 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 коментара)

Николай качи първо решение на 25.10.2017 09:21 (преди почти 8 години)