Решение на Code Identifier от Петко Георгиев

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

Към профила на Петко Георгиев

Резултати

  • 19 точки от тестове
  • 0 бонус точки
  • 19 точки общо
  • 14 успешни тест(а)
  • 1 неуспешни тест(а)

Код

#[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 = None;
for c in raw.chars() {
if c == '_' && last == Some('_') {
return None
}
last = Some(c);
}
};

В случая е ок да използваш някакъв специфичен символ за "липса на символ", но избора на \0 е малко arbitrary. По-смислено в контекста на типовата система на Rust (и също толкова просто) би било let mut last = None;, последвано от last == Some('_') и 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() != '_' {

Добре си се сетил за последния символ! За нещастие, аз не се сетих за тази ситуация :D. Следващия път и аз ще мисля повече за edge cases, а засега съм добавил в условието, че няма да тестваме този случай.

Кода ти работи, просто и да нямаше тази проверка за последен символ щеше да е ок.

// Check if the trimmed string contains invalid characters
let valid = {
let mut ret = true;
for c in raw.chars() {
if !c.is_alphabetic() && !c.is_digit(10) && c != '_' {
ret = false;
break;
}
}
ret
};
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())
}
}

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

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 коментара)

Петко качи първо решение на 19.10.2018 01:43 (преди почти 7 години)

Петко качи решение на 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())
}
}