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()
}

#}



填充/相关