hexadecimal
1. Readme
十六进制
使用第一原理,将用字符串表示的十六进制数,(例如”10af8c”),转换为其十进制等效数(即,不可以使用内置或外部库来完成转换)。
在 Web 上,我们使用十六进制表示颜色,例如( green: 008000, teal: 008080, navy: 000080)。
程序应该处理无效十六进制字符串。
资源
计算机科学的所有http://www.wolframalpha.com/examples/NumberBases.html
2. 开始你的表演
3. 测试代码查看
# #![allow(unused_variables)] #fn main() { #[test] fn test_hex_1_is_decimal_1() { assert_eq!(Some(1), hex_to_int("1")); } #[test] //#[ignore] fn test_hex_c_is_decimal_12() { assert_eq!(Some(12), hex_to_int("c")); } #[test] //#[ignore] fn test_hex_10_is_decimal_16() { assert_eq!(Some(16), hex_to_int("10")); } #[test] //#[ignore] fn test_hex_af_is_decimal_175() { assert_eq!(Some(175), hex_to_int("af")); } #[test] //#[ignore] fn test_hex_100_is_decimal_256() { assert_eq!(Some(256), hex_to_int("100")); } #[test] //#[ignore] fn test_hex_19ace_is_decimal_105166() { assert_eq!(Some(105166), hex_to_int("19ace")); } #[test] //#[ignore] fn test_invalid_hex_is_none() { assert_eq!(None, hex_to_int("carrot")); } #[test] //#[ignore] fn test_black() { assert_eq!(Some(0), hex_to_int("0000000")); } #[test] //#[ignore] fn test_white() { assert_eq!(Some(16777215), hex_to_int("ffffff")); } #[test] //#[ignore] fn test_yellow() { assert_eq!(Some(16776960), hex_to_int("ffff00")); } #}
4. 答案
# #![allow(unused_variables)] #fn main() { fn parse_hex_digit(c: char) -> Option<i64> { match c { '0' => Some(0), '1' => Some(1), '2' => Some(2), '3' => Some(3), '4' => Some(4), '5' => Some(5), '6' => Some(6), '7' => Some(7), '8' => Some(8), '9' => Some(9), 'a' => Some(10), 'b' => Some(11), 'c' => Some(12), 'd' => Some(13), 'e' => Some(14), 'f' => Some(15), _ => None, } } pub fn hex_to_int(string: &str) -> Option<i64> { let base: i64 = 16; string .chars() .rev() .enumerate() .fold(Some(0), |acc, (pos, c)| { parse_hex_digit(c).and_then(|n| acc.map(|acc| acc + n * base.pow(pos as u32))) }) } #}