diff options
Diffstat (limited to 'day8/src/main.rs')
-rw-r--r-- | day8/src/main.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/day8/src/main.rs b/day8/src/main.rs new file mode 100644 index 0000000..8e90063 --- /dev/null +++ b/day8/src/main.rs | |||
@@ -0,0 +1,81 @@ | |||
1 | use std::fs; | ||
2 | use std::path::Path; | ||
3 | use std::collections::HashMap; | ||
4 | |||
5 | /* AOC21 Day 8: https://adventofcode.com/2021/day/8 */ | ||
6 | fn main() { | ||
7 | let input = Path::new("resources").join("input.txt"); | ||
8 | let content = fs::read_to_string(input).expect("Unable to read input file"); | ||
9 | println!("Ex1: The result is {}", ex1(&content)); | ||
10 | println!("Ex2: The result is {}", ex2(&content)); | ||
11 | } | ||
12 | |||
13 | fn ex1(content: &str) -> usize { | ||
14 | content.lines().flat_map( | ||
15 | |l| l.split_once(" | ").expect("Malformed input").1.split_whitespace().map(|d| d.len()) | ||
16 | ).filter(|&x| x == 2 || x == 3 || x == 4 || x == 7).count() | ||
17 | } | ||
18 | |||
19 | #[inline] | ||
20 | fn parse_pattern(pattern: &str) -> (usize,u8) { | ||
21 | (pattern.len(), pattern.bytes().fold(0, |a, b| a + (1 << (b - b'a')))) | ||
22 | } | ||
23 | |||
24 | fn decode_patterns(patterns: &[(usize,u8)]) -> HashMap<u8,u32> { | ||
25 | let mut map = [0; 10]; | ||
26 | patterns.iter().for_each(|(l,e)| { | ||
27 | match l { | ||
28 | 2 => map[1] = *e, | ||
29 | 3 => map[7] = *e, | ||
30 | 4 => map[4] = *e, | ||
31 | 7 => map[8] = *e, | ||
32 | _ => {} | ||
33 | } | ||
34 | }); | ||
35 | patterns.iter().for_each(|(l,e)| { | ||
36 | match l { | ||
37 | 5 if (e & map[1]).count_ones() == 2 => map[3] = *e, | ||
38 | 5 if (e & map[4]).count_ones() == 2 => map[2] = *e, | ||
39 | 5 => map[5] = *e, | ||
40 | 6 if (e & map[4]).count_ones() == 4 => map[9] = *e, | ||
41 | 6 if (e & map[1]).count_ones() == 2 => map[0] = *e, | ||
42 | 6 => map[6] = *e, | ||
43 | _ => {} | ||
44 | } | ||
45 | }); | ||
46 | map.iter().enumerate().fold(HashMap::new(),|mut m, (i,v)| { m.insert(*v, i as u32); m }) | ||
47 | } | ||
48 | |||
49 | fn ex2(content: &str) -> u32 { | ||
50 | content.lines().map(|l| { | ||
51 | let (patterns, digits) = l.split_once(" | ").expect("Malformed input"); | ||
52 | let patterns = decode_patterns(&patterns.split_whitespace().map(|p| parse_pattern(p)).collect::<Vec<(usize,u8)>>()); | ||
53 | digits.split_whitespace().map(|p| patterns.get(&parse_pattern(p).1).unwrap()).fold(0, |a,d| (a*10)+d) | ||
54 | }).sum() | ||
55 | } | ||
56 | |||
57 | #[cfg(test)] | ||
58 | mod tests { | ||
59 | use super::*; | ||
60 | |||
61 | const INPUT: &str = "be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe | ||
62 | edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc | ||
63 | fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg | ||
64 | fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb | ||
65 | aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea | ||
66 | fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb | ||
67 | dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe | ||
68 | bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef | ||
69 | egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb | ||
70 | gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce"; | ||
71 | |||
72 | #[test] | ||
73 | fn example1() { | ||
74 | assert_eq!(26, ex1(INPUT)) | ||
75 | } | ||
76 | |||
77 | #[test] | ||
78 | fn example2() { | ||
79 | assert_eq!(61229, ex2(INPUT)) | ||
80 | } | ||
81 | } | ||