Redukuj znaky challenge
Zkouškové skončilo, a tak má několikaměsíční abstinace od rustu udělala své. Využil jsem tedy každodenního spamu od "Lucy", která mi každý den cpe CodeFights Challenge of the Day, abych si osvěžil alespoň ty základy, které jsem uměl. Fakt, že nejsem profík, mi snad umožňí mít na věc pohled, který pochopí každý začátečník.
V sobotní výzvě bylo za úkol spočítat čas pro napsání textu za předpokladu, že stisknutí klávesy trvá 75 ms, ale pokud se ruce střídají ('a' je na levé ruce, 'k' je na pravé), pak kažé stisknutí trvá 50 ms. Navíc mezerník může být stisknut oběma rukama, tedy vybereme tu druhou než jsme použili.
První fungující řešení:
use std::collections::HashSet;
enum Side { R, L }
fn alternatingKeys(text: String) -> i32 { // "-> i32" = vrací typ i32
let l_keys: HashSet<char> = [
' ', 'q', 'w', 'e', 'r', 't', 'a', 's', 'd', 'f', 'g', 'z', 'x', 'c', 'v', 'b'
].iter().cloned().collect();
let r_keys: HashSet<char> = [
' ', 'y', 'u', 'i', 'o', 'p', 'h', 'j', 'k', 'l', 'n', 'm'
].iter().cloned().collect();
// předchozí strana klávesnice
let mut side: Option<Side> = None;
let mut sum: i32 = 0;
let mut even = true;
// pokud první znak je mezera, musíme zjistit,
// jestli je výhodnější začít levou nebo pravou rukou,
// resp. zdali je počet mezer před textem sudý nebo lichý
if text.len() > 1 && text.chars().nth(0).unwrap() == ' ' {
for c in text.chars() {
match c {
' ' => { even = !even; },
_ => {
side = Some(if (l_keys.contains(&c) && even) || (r_keys.contains(&c) && !even) { Side::R } else { Side::L });
break;
}
}
}
}
for c in text.chars() {
side = Some(match side {
None => {
sum += 50;
match l_keys.contains(&c) {
true => Side::L,
false => Side::R
}
},
Some(Side::R) => {
match l_keys.contains(&c) {
true => {
sum += 50;
Side::L
},
false => {
sum += 75;
Side::R
}
}
},
Some(Side::L) => {
match r_keys.contains(&c) {
true => {
sum += 50;
Side::R
},
false => {
sum += 75;
Side::L
}
}
},
});
}
sum
}