Text Info

Предадени решения

Краен срок:
25.10.2017 23:00
Точки:
15

Срокът за предаване на решения е отминал

extern crate solution;
use self::solution::TextInfo;
#[test]
fn test_char_count() {
let t = TextInfo::new("123456789");
assert_eq!(9, t.char_count());
}
#[test]
fn test_unicode_char_count() {
let t = TextInfo::new("abcd-абвг");
assert_eq!(4 + 1 + 4, t.char_count());
}
#[test]
fn test_alpha_count() {
let t = TextInfo::new(" AbCd-АбВг- ");
assert_eq!(4 + 4, t.alphabetic_count());
}
#[test]
fn test_alpha_count_2() {
let t = TextInfo::new("1. one, 2) две, 3-> three");
assert_eq!(3 + 3 + 5, t.alphabetic_count());
}
#[test]
fn test_cyrillic_letter_count() {
let t = TextInfo::new("юя-1-abc-АбВг");
assert_eq!(2 + 4, t.cyrillic_letter_count());
}
#[test]
fn test_latin_letter_count() {
let t = TextInfo::new("abc-абвг-XYZ");
assert_eq!(3 + 3, t.latin_letter_count());
}
#[test]
fn test_word_count() {
let t = TextInfo::new(" На баба ми хвърчилото! ");
assert_eq!(4, t.word_count());
}
#[test]
fn test_word_count_2() {
let t = TextInfo::new("Здравей, как си, приятелю? Как, добре ли я караш?");
assert_eq!(9, t.word_count());
}
#[test]
fn test_word_count_3() {
let t = TextInfo::new("Да видим кой е по-по-най!");
assert_eq!(7, t.word_count());
}
#[test]
fn test_empty_string() {
let t = TextInfo::new("");
assert_eq!(0, t.char_count());
assert_eq!(0, t.alphabetic_count());
assert_eq!(0, t.latin_letter_count());
assert_eq!(0, t.cyrillic_letter_count());
assert_eq!(0, t.word_count());
assert_eq!(0, t.sentence_count());
assert_eq!("😐", t.emotion());
}
#[test]
fn test_sentence_count() {
let t = TextInfo::new("Баба ти само Rust е писала 1 време. Assembly language, uphill 2 ways! Кви са тия несериозни неща? Амаха.");
assert_eq!(4, t.sentence_count());
}
#[test]
fn test_sentence_count_2() {
let t = TextInfo::new("Да видим сега: следват ли студентите указания; Ще игнорират ли -- тази -- пунктуация?");
assert_eq!(1, t.sentence_count());
}
#[test]
fn test_triple_dots_count() {
let t = TextInfo::new("Somewhere... Over the rainbow...");
assert_eq!(2, t.sentence_count());
}
#[test]
fn test_emotions() {
let t = TextInfo::new("Explosion! WOOO!");
assert_eq!("😮", t.emotion());
let t = TextInfo::new("Wtf? What do?");
assert_eq!("🤔", t.emotion());
let t = TextInfo::new("Bang! Wait. What?");
assert_eq!("😐", t.emotion());
}
#[test]
fn test_emotions_repeated_punctuation() {
let t = TextInfo::new("Explosion!! WOO! hey????");
assert_eq!("😮", t.emotion());
let t = TextInfo::new("Wtf?? Wat? What do!!!!");
assert_eq!("🤔", t.emotion());
let t = TextInfo::new("Bang! Wait... What?");
assert_eq!("😐", t.emotion());
}

С първата задачка, ще ви накараме да изследвате текст и да ни дадете някаква информация за него. Колко думи или изречения съдържа? Има ли кирилица? Какво емоджи най-добре представя текста? 🤔

Дефинирайте си тип TextInfo. Няма значение за нас какви полета има, важното е да има асоцииран метод new, който приема &str. Примерна дефиниция може да изглежда така:

pub struct TextInfo {
    // каквито полета смятате, че ви трябват
}

impl TextInfo {
    pub fn new(s: &str) -> Self {
        // инициализирайте каквото ви трябва от подадения &str
    }
}

Освен асоциирания new метод, който ще използваме, за да си алокираме TextInfo, очакваме този тип да отговаря на следните методи:

pub fn char_count(&self) -> usize

Броя на символите в текста. Забележете, че говорим за "char"-ове, не за байтове.

pub fn alphabetic_count(&self) -> usize

Броя на буквите в текста. Това включва букви от латинската азбука или (българския subset на) кирилицата. Приемете, че това ще са единствените две азбуки, с които ще тестваме. Не се включват числа, или пунктуация.

pub fn latin_letter_count(&self) -> usize

Броя на буквите на латиница в текста. Не се включват нито числа, нито пунктуация.

pub fn cyrillic_letter_count(&self) -> usize

Броя на буквите на (българския subset на) кирилица в текста. Не се включват нито числа, нито пунктуация. Ако искате да поддържате не-само-българска кирилица, неща като Э или Ы, може да го направите, но няма да имаме такива низове в тестовете.

pub fn word_count(&self) -> usize

Броя на думите в текста. "Думи" са просто поредица от букви (кирилица/латиница), разделени от не-букви. Примери:

  • Баба,дядо са две думи
  • Баба и дядо са три думи
  • ~*_1-баба-x-дядо-1_*~ са три думи ("баба", "x", "дядо")

pub fn sentence_count(&self) -> usize

Колко на брой изречения има в текста?

"Изречение" се дефинира като поредица от не-пунктуационни символи (поне един), която е последвана от един или повече пунктуационни символи: "?", "!", ".". Приемете, че тези поредици от символи са единствената пунктуация, която ни интересува като броим изречения.

Примери за изречения:

  • One, two, and three! -> 1 изречение
  • Huh? What's this?? -> 2 изречения
  • Hmm... Hm, Hm, Hmm. -> 2 изречения

pub fn emotion(&self) -> String

Каква е overall емоцията на текста?

Искаме да напишете невронна мрежа, тренирана с данни от интернет форуми, която да прави sentiment analysis... Всъщност не, просто бройте изречения, които завършват на определена пунктуация.

  • Изречение, което завършва на "!" → 😮 (Face with open mouth)
  • Изречение, което завършва на "?" → 🤔 (Thinking face)
  • Изречение, което завършва на "." → 😐 (Neutral face)

Пребройте емоциите.

  • Ако има повече 😮 от другите две емоции, върнете String със съдържание "😮".
  • Ако има повече 🤔 от другите две емоции, върнете String със съдържание "🤔".
  • Иначе, върнете String със съдържание "😐".

За целите на задачата, повторена пунктуация в рамките на едно изречение се брои за една "емоция". Тоест, в този пример:

"Compiler error!! Oh, no... What just happened?"

Имаме "!!", което се превежда до едно-единствено 😮. Имаме "...", което значи едно 😐. Имаме и "?", което си е 🤔. Общия емоционален баланс е 1:1:1 -- тъй като нито една не е по-голяма от останалите две, връщаме 😐.

За комбинации от терминиращи пунктуационни символи, като "?!?", няма да проверяваме. Ако искате да имплементирате специално решение за този случай, направете го, но няма да имаме тестове за него.


Внимавайте всички типове и методи, които ни трябват, да бъдат маркирани като pub, за да могат тестовете ни да ги викат. Прочетете и общия guide за писане на домашни.

Задължително прочетете (или си припомнете): Указания за предаване на домашни