Решение на Text Info от Йоана Николова
Резултати
- 14 точки от тестове
- 0 бонус точки
- 14 точки общо
- 14 успешни тест(а)
- 1 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (file:///tmp/d20171026-5817-1uzdc88/solution) Finished dev [unoptimized + debuginfo] target(s) in 3.28 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 ... FAILED 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 failures: ---- solution_test::test_alpha_count_2 stdout ---- thread 'solution_test::test_alpha_count_2' panicked at 'assertion failed: `(left == right)` left: `11`, right: `12`', tests/solution_test.rs:26:4 note: Run with `RUST_BACKTRACE=1` for a backtrace. failures: solution_test::test_alpha_count_2 test result: FAILED. 14 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out error: test failed, to rerun pass '--test solution_test'
История (2 версии и 4 коментара)
Йоана качи решение на 25.10.2017 21:41 (преди почти 8 години)
#[derive(Debug)]
pub struct TextInfo {
name: String,
}
impl TextInfo{
pub fn new(s: &str) -> TextInfo{
TextInfo{
name: String::from(s),
}
}
pub fn char_count(&self) -> usize{
self.name.chars().count()
}
pub fn alphabetic_count(&self) -> usize{
let mut counter: usize = 0;
for ch in self.name.chars() {
if alphabetic_char(ch) && !(ch.is_digit(10)){
- counter = counter + 1;
+ counter += 1;
}
}
counter
}
pub fn latin_letter_count(&self) -> usize{
let mut counter: usize = 0;
for ch in self.name.chars(){
if ((ch <= 'Z' && ch >= 'A') || (ch <= 'z' && ch >= 'a')) && alphabetic_char(ch){
- counter = counter + 1;
+ counter += 1;
}
}
counter
}
pub fn cyrillic_letter_count(&self) -> usize{
let mut counter: usize = 0;
for ch in self.name.chars(){
if (ch <= 'Я' && ch >= 'А') || (ch <= 'я' && ch >= 'а'){
- counter = counter + 1;
+ counter += 1;
}
}
counter
}
pub fn word_count(&self) -> usize{
let mut used_non_alpha: bool = true;
let mut counter = 0;
for ch in self.name.chars(){
if alphabetic_char(ch) && !(ch.is_digit(10)){
if used_non_alpha == true{
- counter = counter +1;
+ counter += 1;
}
used_non_alpha = false;
}
else{
used_non_alpha = true;
}
}
counter
}
pub fn sentence_count(&self) -> usize{
let mut used_alpha: bool = false;
let mut counter = 0;
for ch in self.name.chars(){
if end_sentence_char(ch){
if used_alpha == true{
- counter = counter + 1;
+ counter += 1;
}
used_alpha = false;
}
else {
used_alpha = true;
}
}
counter
}
pub fn emotion(&self) -> String{
let mut surprise = 0;
let mut thinking = 0;
let mut neutral = 0;
let mut used_alpha = false;
for ch in self.name.chars(){
if end_sentence_char(ch){
if used_alpha == true{
match ch{
'.' => neutral = neutral + 1,
'!' => surprise = surprise + 1,
'?' => thinking = thinking + 1,
_ => neutral = neutral + 1,// i don't get this need, but rust wants it and denies it
За този случай има специално макро https://doc.rust-lang.org/std/macro.unreachable.html вместо чист panic!
.
}
}
used_alpha = false;
}
else{
used_alpha = true;
}
}
if surprise > thinking && surprise > neutral {
return String::from("😮");
}else if thinking > surprise && thinking > neutral{
return String::from("🤔");
}
else {
return String::from("😐");
}
}
}
pub fn alphabetic_char(ch: char) -> bool{
match ch{
'.' => false,
'!' => false,
',' => false,
'?' => false,
'/' => false,
'-' => false,
'(' => false,
')' => false,
';' => false,
'+' => false,
'=' => false,
' ' => false,
'*' => false,
'_' => false,
'~' => false,
'`' => false,
'\'' => false,
_ => true,
}
}
pub fn end_sentence_char(ch: char) -> bool{
match ch{
'.' => true,
'!' => true,
'?' => true,
_ => false,
}
}
Мда, Rust няма как да знае, че всички възможни символи са пробвани. Ти знаеш, понеже проверяваш
end_sentence_char
. Прост начин да избегнеш излишния ред, е да го промениш поне на_ => (),
. Иначе изглежда като че ли този ред може да се случи, а всъщност, не може. Един друг колега беше сложил тамpanic!()
, понеже ако кода е стигнал там, със сигурност програмиста е допуснал грешка :). Но ще говорим за error handling по-нататък, и ще обсъдим такива неща.Може ли да се направи това по-елегантно? Има различни варианти, и вероятно ще ви покажем няколко на петъчната лекция.
За този случай има специално макро https://doc.rust-lang.org/std/macro.unreachable.html вместо чист
panic!
.Хмм, сигурна ли си, че си покрила всички възможни символи, които не са азбучни? Имаш
/
, но като че ли нямаш\
, например ;).Помисли дали няма по-reliable начин да решиш този проблем.