Решение на Code Identifier от Петко Георгиев
Резултати
- 19 точки от тестове
- 0 бонус точки
- 19 точки общо
- 14 успешни тест(а)
- 1 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20190123-22631-7kqmfd/solution) Finished dev [unoptimized + debuginfo] target(s) in 4.74s Running target/debug/deps/solution-2e785d603b538f71 running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out Running target/debug/deps/solution_test-29808948fb50ed3a running 15 tests test solution_test::test_both_static_and_dynamic_strings ... ok test solution_test::test_camelcase_basic ... ok test solution_test::test_cyrillic1 ... ok test solution_test::test_digits1 ... ok test solution_test::test_digits2 ... ok test solution_test::test_digits3 ... FAILED test solution_test::test_kebabcase_basic ... ok test solution_test::test_multibyte_uppercase ... ok test solution_test::test_normalize_case1 ... ok test solution_test::test_normalize_case2 ... ok test solution_test::test_screaming_snakecase_basic ... ok test solution_test::test_titlecase_basic ... ok test solution_test::test_underscore_basic ... ok test solution_test::test_validity ... ok test solution_test::test_whitespace ... ok failures: ---- solution_test::test_digits3 stdout ---- thread 'solution_test::test_digits3' panicked at 'called `Option::unwrap()` on a `None` value', libcore/option.rs:355:21 note: Run with `RUST_BACKTRACE=1` for a backtrace. failures: solution_test::test_digits3 test result: FAILED. 14 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out error: test failed, to rerun pass '--test solution_test'
История (2 версии и 2 коментара)
Петко качи решение на 24.10.2018 14:12 (преди почти 7 години)
#[derive(Debug)]
pub struct CodeIdentifier {
raw: String,
}
impl CodeIdentifier {
pub fn new(raw: &str) -> Option<Self> {
let raw = raw.trim();
// Make sure it doesn't contain dashes
if raw.contains('-') {
return None
}
// Check if the input string contains two or
// more consecutive underscores
// For example foo__bar shouldn't be legal
{
- let mut last = '\0';
+ let mut last = None;
for c in raw.chars() {
- if c == '_' && last == '_' {
+ if c == '_' && last == Some('_') {
return None
}
- last = c;
+ last = Some(c);
}
};
// Check if the first character is alphabetic and
// the last one is not an underscore
if let Some(c) = raw.chars().next() {
if c.is_alphabetic() && raw.chars().last().unwrap() != '_' {
- // Check if the trimmed string contains whitespaces
- let contains_whitespaces = {
- let mut ret = false;
+ // Check if the trimmed string contains invalid characters
+ let valid = {
+ let mut ret = true;
for c in raw.chars() {
- if c.is_whitespace() {
- ret = true;
+ if !c.is_alphabetic() && !c.is_digit(10) && c != '_' {
+ ret = false;
break;
}
}
ret
};
- if !contains_whitespaces {
+ if valid {
return Some(Self {
raw: raw.to_lowercase(),
});
}
}
}
None
}
pub fn camelcase(&self) -> String {
let mut ret = String::new();
let mut i = self.raw.chars();
while let Some(c) = i.next() {
if c == '_' {
for c in i.next().unwrap().to_uppercase() {
ret.push(c);
}
} else {
ret.push(c);
}
}
ret
}
pub fn titlecase(&self) -> String {
let mut ret = String::new();
let mut i = self.raw.chars();
for c in i.next().unwrap().to_uppercase() {
ret.push(c);
}
while let Some(c) = i.next() {
if c == '_' {
for c in i.next().unwrap().to_uppercase() {
ret.push(c);
}
} else {
ret.push(c);
}
}
ret
}
pub fn kebabcase(&self) -> String {
self.raw.chars().map(|c| if c == '_' { '-' } else { c }).collect()
}
pub fn underscore(&self) -> String {
String::clone(&self.raw)
}
pub fn screaming_snakecase(&self) -> String {
String::clone(&self.raw.to_uppercase())
}
}
В случая е ок да използваш някакъв специфичен символ за "липса на символ", но избора на
\0
е малко arbitrary. По-смислено в контекста на типовата система на Rust (и също толкова просто) би билоlet mut last = None;
, последвано отlast == Some('_')
иlast = Some(c);
.Добре си се сетил за последния символ! За нещастие, аз не се сетих за тази ситуация :D. Следващия път и аз ще мисля повече за edge cases, а засега съм добавил в условието, че няма да тестваме този случай.
Кода ти работи, просто и да нямаше тази проверка за последен символ щеше да е ок.