Решение на Text Info от Радослав Върбанов
Към профила на Радослав Върбанов
Резултати
- 15 точки от тестове
- 0 бонус точки
- 15 точки общо
- 15 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (file:///tmp/d20171026-5817-js3pqr/solution) invalid expression !4836 = !DIExpression(6, 34, 0, 6) invalid expression !4837 = !DIExpression(6, 34, 0, 6) Finished dev [unoptimized + debuginfo] target(s) in 3.78 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
История (2 версии и 3 коментара)
Радослав качи решение на 25.10.2017 22:20 (преди почти 8 години)
Вместо .map(...).filter
, в случая мисля, че директно можеш да ползваш filter
. А ако latin_char
не ти е дефинирано върху self
, а в глобалния scope (забележи, че това е безопасно -- ако я дефинираш с fn
, вместо с pub fn
, тя ще бъде видима само в този модул), то ще можеш да напишеш това: self.text.chars().filter(latin_char).count()
.
Не ти трябва да алокираш вектор тук. Мисля, че спокойно можеш вместо .collect()
, да продължиш със .filter(...).count()
. Това ти избягва алокирането на нова динамична памет за вектора, която ще се използва само за броене.
Този код като че ли се получава малко сложничък. И аз пробвах в един момент с нещо такова, и си мисля, че е по-лесно просто да се направи императивно:
pub fn sentence_count(&self) -> usize {
let mut count = 0;
let mut in_sentence = false;
for c in self.text.chars() {
if !in_sentence && !is_sentence_terminator(c) {
in_sentence = true;
} else if in_sentence && is_sentence_terminator(c) {
in_sentence = false;
count += 1;
}
}
count
}
Алтернативно, ето какво измислих като по-fancy решение:
pub fn sentence_count(&self) -> usize {
self.text
.split_terminator(is_sentence_terminator)
.filter(|s| s.len() > 0)
.count()
}
Нали, това в категория "да видиш някакви други интересни решения".
Вместо
.map(...).filter
, в случая мисля, че директно можеш да ползвашfilter
. А акоlatin_char
не ти е дефинирано върхуself
, а в глобалния scope (забележи, че това е безопасно -- ако я дефинираш сfn
, вместо сpub fn
, тя ще бъде видима само в този модул), то ще можеш да напишеш това:self.text.chars().filter(latin_char).count()
.Не ти трябва да алокираш вектор тук. Мисля, че спокойно можеш вместо
.collect()
, да продължиш със.filter(...).count()
. Това ти избягва алокирането на нова динамична памет за вектора, която ще се използва само за броене.Този код като че ли се получава малко сложничък. И аз пробвах в един момент с нещо такова, и си мисля, че е по-лесно просто да се направи императивно:
Алтернативно, ето какво измислих като по-fancy решение:
Нали, това в категория "да видиш някакви други интересни решения".