ETL
1. Readme
ETL
ETL,是英文 Extract-Transform-Load
的缩写,用来描述将数据从来源端经过萃取、转置、加载至目的端的过程
ETL
提取转换负载(ETL)是一种很有意思的说法,”我们在这个系统中有一些遗留的遗留数据,现在我们需要在这个闪亮的新系统中使用,所以我们将迁移它.”
(通常情况下,接下来是,”我们只需要运行一次就好啦。”之后,通常会有很多怒拍额头,并抱怨自身有多么愚蠢。
目标
我们将从遗留系统中,提取一些拼字游戏分数.
旧的系统存储每一个字母的列表:
- 1 分:”A”,”E”,”I”,”O”,”U”,”L”,”N”,”R”,”S”,”T”,
- 2 分:”D”,”G”,
- 3 分:”B”、”C”、”M”、”P”,
- 4 分:”F”、”H”、”V”、”W”、”Y”,
- 5 分:”K”,
- 8 分:”J”,”X”,
- 10 分:”Q”,”Z”,
闪亮的新拼写系统存储每个字母的分数,这使得计算一个单词的分数更快、更容易。它也把字母存为小写字母,而不考虑输入字母的情况:
- “a” 值 1 分.
- “b” 值 3 分.
- “c” 值 3 分.
- “d” 值 2 分.
- 等.
你的任务,你应该选择接受它, 应将遗留数据格式,转换成闪亮的新格式。
笔记
关于得分的最后一点是,Scrabble 这款游戏在世界各地,多个国家,每种语言都有自己独特的得分表。例如,在毛利(Māori)语版本的游戏中,”E”得分为 2 分,而在夏威夷语版本中为 4 分。
资源
JunpStab 实验室团队http://jumpstartlab.com
2. 开始你的表演
use std::collections::BTreeMap; pub fn transform(h: &BTreeMap<i32, Vec<char>>) -> BTreeMap<char, i32> { unimplemented!("How will you transform the tree {:?}?", h) }
3. 测试代码查看
# #![allow(unused_variables)] #fn main() { #[test] fn test_transform_one_value() { let input = input_from(&[(1, vec!['A'])]); let expected = expected_from(&[('a', 1)]); assert_eq!(expected, transform(&input)); } #[test] //#[ignore] fn test_transform_more_values() { let input = input_from(&[(1, vec!['A', 'E', 'I', 'O', 'U'])]); let expected = expected_from(&[('a', 1), ('e', 1), ('i', 1), ('o', 1), ('u', 1)]); assert_eq!(expected, transform(&input)); } #[test] //#[ignore] fn test_more_keys() { let input = input_from(&[(1, vec!['A', 'E']), (2, vec!['D', 'G'])]); let expected = expected_from(&[('a', 1), ('e', 1), ('d', 2), ('g', 2)]); assert_eq!(expected, transform(&input)); } #[test] //#[ignore] fn test_full_dataset() { let input = input_from(&[ (1, vec!['A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T']), (2, vec!['D', 'G']), (3, vec!['B', 'C', 'M', 'P']), (4, vec!['F', 'H', 'V', 'W', 'Y']), (5, vec!['K']), (8, vec!['J', 'X']), (10, vec!['Q', 'Z']), ]); let expected = expected_from(&[ ('a', 1), ('b', 3), ('c', 3), ('d', 2), ('e', 1), ('f', 4), ('g', 2), ('h', 4), ('i', 1), ('j', 8), ('k', 5), ('l', 1), ('m', 3), ('n', 1), ('o', 1), ('p', 3), ('q', 10), ('r', 1), ('s', 1), ('t', 1), ('u', 1), ('v', 4), ('w', 4), ('x', 8), ('y', 4), ('z', 10), ]); assert_eq!(expected, transform(&input)); } fn input_from(v: &[(i32, Vec<char>)]) -> BTreeMap<i32, Vec<char>> { v.iter().cloned().collect() } fn expected_from(v: &[(char, i32)]) -> BTreeMap<char, i32> { v.iter().cloned().collect() } #}
4. 答案
# #![allow(unused_variables)] #fn main() { use std::collections::BTreeMap; pub fn transform(input: &BTreeMap<i32, Vec<char>>) -> BTreeMap<char, i32> { input .iter() .flat_map(|(&n, vec)| vec.iter().map(move |c| (c.to_ascii_lowercase(), n))) .collect() } #}