Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extern crate itertools;
- use itertools::Itertools;
- fn get_pins(observed: &str) -> Vec<String> {
- let combos = vec![
- vec![0, 8],
- vec![1, 2, 4],
- vec![2, 1, 3, 5],
- vec![3, 2, 6],
- vec![4, 1, 5, 7],
- vec![5, 2, 4, 6, 8],
- vec![6, 3, 5, 9],
- vec![7, 4, 8],
- vec![8, 0, 5, 9, 7],
- vec![9, 8, 6],
- vec![0, 8],
- ];
- let digits: Vec<_> = observed.chars().map(|c| c.to_digit(10).unwrap()).collect();
- let mut possible = vec![];
- for n in digits {
- possible.push(&combos[n as usize]);
- }
- let mut ret: Vec<String> = possible[0].iter().map(|x| x.to_string()).collect();
- for p in 1..possible.len() {
- let r: Vec<_> = ret
- .clone()
- .iter()
- .cartesian_product(possible[p].iter())
- .fold(vec![], |mut vec, (ref a, ref b)| {
- vec.push(format!("{}{}", a, b));
- vec
- });
- ret = r;
- }
- ret
- }
- #[test]
- fn length_test() {
- let v = vec![
- ("8", vec!["5", "7", "8", "9", "0"]),
- (
- "11",
- vec!["11", "22", "44", "12", "21", "14", "41", "24", "42"],
- ),
- (
- "369",
- vec![
- "339", "366", "399", "658", "636", "258", "268", "669", "668", "266", "369", "398",
- "256", "296", "259", "368", "638", "396", "238", "356", "659", "639", "666", "359",
- "336", "299", "338", "696", "269", "358", "656", "698", "699", "298", "236", "239",
- ],
- ),
- ];
- for (num, exp) in v {
- assert_eq!(get_pins(num).len(), exp.len())
- }
- }
Add Comment
Please, Sign In to add comment