Решение на Text Info от Димитър Николов

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

Към профила на Димитър Николов

Резултати

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

Код

#[derive(Debug)]
pub struct TextInfo {
my_str: String,
}
impl TextInfo {
// Allocation
pub fn new( s: &str ) -> TextInfo {
TextInfo {
my_str: String::from( s ),
}
}
// Char count
pub fn char_count( &self ) -> usize {
self.my_str.chars().count()
}
// Letter count
pub fn alphabetic_count( &self ) -> usize {
let mut count = 0_usize;
for ch in self.my_str.chars() {
if ch.is_alphabetic() {
count += 1;
}
}
count
}
// Latin letter count
pub fn latin_letter_count( &self ) -> usize {
let mut count = 0_usize;
for ch in self.my_str.chars() {
if ( ch >= 'a' && ch <= 'z' )
|| ( ch >= 'A' && ch <= 'Z' ) {
count += 1;
}
}
count
}
// Cyrillic letter count
pub fn cyrillic_letter_count( &self ) -> usize {
let mut count = 0_usize;
for ch in self.my_str.chars() {
if ( ch >= 'а' && ch <= 'я' )
|| ( ch >= 'А' && ch <= 'Я' ) {
count += 1;
}
}
count
}
// Word count
pub fn word_count( &self ) -> usize {
let mut count = 0_usize;
let mut is_over = false;
for ch in self.my_str.chars() {
if ( is_over == false )
&& ( ch == ' ' || ch == ',' || ch == '!' || ch == '.' || ch == '?' ) {
count += 1;
is_over = true;
}
if ( is_over == true )
&& ( ch != ' ' && ch != ',' && ch != '!' && ch != '.' && ch != '?' ) {
is_over = false;
}
}
count - 1
}
// Sentance count
pub fn sentence_count( &self ) -> usize {
let mut count = 0_usize;
let mut is_over = false;
for ch in self.my_str.chars() {
if ( is_over == false )
&& ( ch == '!' || ch == '.' || ch == '?' ) {
count += 1;
is_over = true;
}
if ( is_over == true )
&& ( ch != '!' && ch != '.' && ch != '?' ) {
is_over = false;
}
}
count
}
// Emotion gauge
// Treats multiple symbols like "!?!" by judging the last value or in this case '!'
pub fn emotion( &self ) -> String {
// .
let mut count_dot = 0_u32;
// !
let mut count_excl = 0_u32;
// ?
let mut count_ques = 0_u32;
let mut temp_char : char;
let mut is_over = false;
for (pos, ch) in self.my_str.chars().enumerate() {
if ( is_over == false )
&& ( ch == '!' || ch == '.' || ch == '?' ) {
is_over = true;
}
if ( is_over == true )
&& ( ch != '!' && ch != '.' && ch != '?' ) {
temp_char = self.my_str.chars().nth(pos - 1).unwrap();
match temp_char {
'.' => count_dot += 1,
'!' => count_excl += 1,
'?' => count_ques += 1,
// WTF does it want me to do this case?
// I left this great piece of code there to substitute doing nothing.
_ => count_ques = count_ques

Rust няма как да знае, че си проверил за всички възможни символи по-горе с (ch != '!'..... Всъщност, ти дори не използваш ch, а вземаш символа наново (не съм сигурен защо), но както и да е. В случай, че има някакъв ръкав, който не може да се стигне, това може да се комуникира с макроса unreachable!: https://doc.rust-lang.org/1.3.0/std/macro.unreachable!.html. Ако кода някога удари там, ще гръмне, така че ще знаеш, че имаш някаква грешка.

}
is_over = false;
}
}
if count_excl > count_dot {
if count_excl > count_ques {
String::from( "😮" )
}
else {
String::from( "🤔" )
}
}
else {
if count_ques > count_dot {
String::from( "🤔" )
}
else {
String::from( "😐" )
}
}
}
}

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

Compiling solution v0.1.0 (file:///tmp/d20171026-5817-sdjs6z/solution)
invalid expression
!1230 = !DIExpression(6, 34, 0, 6)
invalid expression
!1229 = !DIExpression(6, 34, 0, 6)
    Finished dev [unoptimized + debuginfo] target(s) in 3.40 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 ... FAILED
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 ... FAILED
test solution_test::test_word_count_3 ... FAILED

failures:

---- solution_test::test_empty_string stdout ----
	thread 'solution_test::test_empty_string' panicked at 'attempt to subtract with overflow', src/lib.rs:78:9
note: Run with `RUST_BACKTRACE=1` for a backtrace.

---- solution_test::test_word_count_2 stdout ----
	thread 'solution_test::test_word_count_2' panicked at 'assertion failed: `(left == right)`
  left: `9`,
 right: `8`', 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: `4`', tests/solution_test.rs:56:4


failures:
    solution_test::test_empty_string
    solution_test::test_word_count_2
    solution_test::test_word_count_3

test result: FAILED. 12 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out

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

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

Димитър качи първо решение на 25.10.2017 22:37 (преди почти 8 години)