Scrabble Score
1. Readme
拼字母的分数
给出一个单词,计算该单词的字母的分数.
字母价值
你需要这些:
26个英文字母 对应有多少分
A, E, I, O, U, L, N, R, S, T 1
D, G 2
B, C, M, P 3
F, H, V, W, Y 4
K 5
J, X 8
Q, Z 10
例子
“cabbage”的得分值应为 14 分:
- C , 就得 3 分
- A , 就得 1 分,两次
- B , 就得 3 分,两次
- G , 就得 2 分
- E , 就得 1 分
总计:
3 + 2*1 + 2*3 + 2 + 1
- =
3 + 2 + 6 + 3
- =
5 + 9
- = 14
扩展
- 您可以玩,双重或三重字母.
- 你可以玩,一个双重或三个单词.
资源
受到 Extreme Startup 游戏的启发https://github.com/rchatley/extreme_startup
2. 开始你的表演
/// Compute the Scrabble score for a word. pub fn score(word: &str) -> u64 { unimplemented!("Score {} in Scrabble.", word); }
3. 测试代码查看
# #![allow(unused_variables)] #fn main() { #[test] fn a_is_worth_one_point() { assert_eq!(score("a"), 1); } #[test] //#[ignore] fn scoring_is_case_insensitive() { assert_eq!(score("A"), 1); } #[test] //#[ignore] fn f_is_worth_four() { assert_eq!(score("f"), 4); } #[test] //#[ignore] fn two_one_point_letters_make_a_two_point_word() { assert_eq!(score("at"), 2); } #[test] //#[ignore] fn three_letter_word() { assert_eq!(score("zoo"), 12); } #[test] //#[ignore] fn medium_word() { assert_eq!(score("street"), 6); } #[test] //#[ignore] fn longer_words_with_valuable_letters() { assert_eq!(score("quirky"), 22); } #[test] //#[ignore] fn long_mixed_case_word() { assert_eq!(score("OxyphenButazone"), 41); } #[test] //#[ignore] fn non_english_scrabble_letters_do_not_score() { assert_eq!(score("pinata"), 8, "'n' should score 1"); assert_eq!(score("piñata"), 7, "'ñ' should score 0"); } #[test] //#[ignore] fn empty_words_are_worth_zero() { assert_eq!(score(""), 0); } #[test] //#[ignore] fn all_letters_work() { assert_eq!(score("abcdefghijklmnopqrstuvwxyz"), 87); } #[test] //#[ignore] fn german_letters_do_not_score() { assert_eq!(score("STRASSE"), 7, "\"SS\" should score 2"); assert_eq!(score("STRAßE"), 5, "'ß' should score 0"); } #}
4. 答案
# #![allow(unused_variables)] #fn main() { use std::collections::HashMap; pub fn score(word: &str) -> u16 { let values = dictionary(); word.to_lowercase() .chars() .map(|c| values.get(&c).clone()) .fold(0, |score, v| score + v.unwrap_or(&0)) } fn dictionary() -> HashMap<char, u16> { let mut values = HashMap::new(); values.insert('a', 1); values.insert('b', 3); values.insert('c', 3); values.insert('d', 2); values.insert('e', 1); values.insert('f', 4); values.insert('g', 2); values.insert('h', 4); values.insert('i', 1); values.insert('j', 8); values.insert('k', 5); values.insert('l', 1); values.insert('m', 3); values.insert('n', 1); values.insert('o', 1); values.insert('p', 3); values.insert('q', 10); values.insert('r', 1); values.insert('s', 1); values.insert('t', 1); values.insert('u', 1); values.insert('v', 4); values.insert('w', 4); values.insert('x', 8); values.insert('y', 4); values.insert('z', 10); values } #}