Решение на Text Info от Ангел Ангелов

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

Към профила на Ангел Ангелов

Резултати

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

Код

use std::cmp::max;
pub struct TextInfo {
char_count: usize,
latin_letter_count: usize,
cyrillic_letter_count: usize,
word_count: usize,
sentence_count: usize,
emotion: String
}
impl TextInfo {
pub fn new(s: &str) -> Self {
let mut char_count = 0_usize;
let mut cyrillic_letter_count = 0_usize;
let mut latin_letter_count = 0_usize;
let mut word_count = 0_usize;
for c in s.chars() {
char_count += 1;
if is_cyrillic(c) {
cyrillic_letter_count += 1;
}
if is_latin(c) {
latin_letter_count += 1;
}
};
for _word in s.split(|c: char| is_alphabetic(c)).filter(|w| !w.is_empty()) {
word_count += 1
}
let (sentence_count, emotion) = analyze_sentences(s);
Self {
char_count: char_count,
latin_letter_count: latin_letter_count,
cyrillic_letter_count: cyrillic_letter_count,
word_count: word_count,
sentence_count: sentence_count,
emotion: emotion
}
}
pub fn char_count(self: &TextInfo) -> usize {
self.char_count
}
pub fn alphabetic_count(&self) -> usize {
self.cyrillic_letter_count + self.latin_letter_count
}
pub fn latin_letter_count(&self) -> usize {
self.latin_letter_count
}
pub fn cyrillic_letter_count(&self) -> usize {
self.cyrillic_letter_count
}
pub fn word_count(&self) -> usize {
self.word_count
}
pub fn sentence_count(&self) -> usize {
self.sentence_count
}
pub fn emotion(&self) -> String {
self.emotion.clone()
}
}
fn is_alphabetic(c: char) -> bool {
is_latin(c) || is_cyrillic(c)
}
fn is_cyrillic(c: char) -> bool {
c >= 'а' && c <= 'я'
}
fn is_latin(c: char) -> bool {
c >= 'a' && c <= 'z'
}
fn analyze_sentences(s: &str) -> (usize, String) {
let mut sentence_count_dot = 0_usize;
let mut sentence_count_exclamation = 0_usize;
let mut sentence_count_question = 0_usize;
let mut prev = '\0';
for c in s.chars() {
if prev != '\0' && prev != '.' && prev != '?' && prev != '!' {
if c == '.' {
sentence_count_dot += 1
}
if c == '!' {
sentence_count_exclamation += 1
}
if c == '?' {
sentence_count_question += 1
}
}
prev = c
}
let emotion =
if sentence_count_exclamation > max(sentence_count_question, sentence_count_dot) {
"😮"
} else if sentence_count_question > max(sentence_count_exclamation, sentence_count_dot) {
"🤔"
} else {
"😐"
};
let sentence_count = sentence_count_dot + sentence_count_exclamation + sentence_count_question;
(sentence_count, String::from(emotion))
}

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

Compiling solution v0.1.0 (file:///tmp/d20171026-5817-134fkmw/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 3.55 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 ... FAILED
test solution_test::test_alpha_count_2 ... ok
test solution_test::test_char_count ... ok
test solution_test::test_cyrillic_letter_count ... FAILED
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 ... FAILED
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 ... FAILED
test solution_test::test_word_count_2 ... FAILED
test solution_test::test_word_count_3 ... FAILED

failures:

---- solution_test::test_alpha_count stdout ----
	thread 'solution_test::test_alpha_count' panicked at 'assertion failed: `(left == right)`
  left: `8`,
 right: `4`', tests/solution_test.rs:20:4
note: Run with `RUST_BACKTRACE=1` for a backtrace.

---- solution_test::test_cyrillic_letter_count stdout ----
	thread 'solution_test::test_cyrillic_letter_count' panicked at 'assertion failed: `(left == right)`
  left: `6`,
 right: `4`', tests/solution_test.rs:32:4

---- solution_test::test_latin_letter_count stdout ----
	thread 'solution_test::test_latin_letter_count' panicked at 'assertion failed: `(left == right)`
  left: `6`,
 right: `3`', tests/solution_test.rs:38:4

---- solution_test::test_word_count stdout ----
	thread 'solution_test::test_word_count' panicked at 'assertion failed: `(left == right)`
  left: `4`,
 right: `5`', tests/solution_test.rs:44:4

---- solution_test::test_word_count_2 stdout ----
	thread 'solution_test::test_word_count_2' panicked at 'assertion failed: `(left == right)`
  left: `9`,
 right: `10`', tests/solution_test.rs:50:4

---- solution_test::test_word_count_3 stdout ----
	thread 'solution_test::test_word_count_3' panicked at 'assertion failed: `(left == right)`
  left: `7`,
 right: `8`', tests/solution_test.rs:56:4


failures:
    solution_test::test_alpha_count
    solution_test::test_cyrillic_letter_count
    solution_test::test_latin_letter_count
    solution_test::test_word_count
    solution_test::test_word_count_2
    solution_test::test_word_count_3

test result: FAILED. 9 passed; 6 failed; 0 ignored; 0 measured; 0 filtered out

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

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

Ангел качи първо решение на 21.10.2017 12:19 (преди почти 8 години)

Кода изглежда добре. Помисли обаче дали си покрил достатъчно случаи. Базовия тест, който ви дадохме, е само за sanity check проверка, ще тестваме по-обстойно, когато оценяваме. Пробвай да си напишеш собствени тестове, и помисли какви по-интересни примери ти би могъл да измислиш, които да счупят кода ти.