From 64e22194d39d2914db1e3bf93c90de9e0791d9b3 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Fri, 1 Dec 2023 09:21:16 +0100 Subject: chore: reorganize project structure --- 2021/day08/src/main.rs | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 2021/day08/src/main.rs (limited to '2021/day08/src') diff --git a/2021/day08/src/main.rs b/2021/day08/src/main.rs new file mode 100644 index 0000000..8e90063 --- /dev/null +++ b/2021/day08/src/main.rs @@ -0,0 +1,81 @@ +use std::fs; +use std::path::Path; +use std::collections::HashMap; + +/* AOC21 Day 8: https://adventofcode.com/2021/day/8 */ +fn main() { + let input = Path::new("resources").join("input.txt"); + let content = fs::read_to_string(input).expect("Unable to read input file"); + println!("Ex1: The result is {}", ex1(&content)); + println!("Ex2: The result is {}", ex2(&content)); +} + +fn ex1(content: &str) -> usize { + content.lines().flat_map( + |l| l.split_once(" | ").expect("Malformed input").1.split_whitespace().map(|d| d.len()) + ).filter(|&x| x == 2 || x == 3 || x == 4 || x == 7).count() +} + +#[inline] +fn parse_pattern(pattern: &str) -> (usize,u8) { + (pattern.len(), pattern.bytes().fold(0, |a, b| a + (1 << (b - b'a')))) +} + +fn decode_patterns(patterns: &[(usize,u8)]) -> HashMap { + let mut map = [0; 10]; + patterns.iter().for_each(|(l,e)| { + match l { + 2 => map[1] = *e, + 3 => map[7] = *e, + 4 => map[4] = *e, + 7 => map[8] = *e, + _ => {} + } + }); + patterns.iter().for_each(|(l,e)| { + match l { + 5 if (e & map[1]).count_ones() == 2 => map[3] = *e, + 5 if (e & map[4]).count_ones() == 2 => map[2] = *e, + 5 => map[5] = *e, + 6 if (e & map[4]).count_ones() == 4 => map[9] = *e, + 6 if (e & map[1]).count_ones() == 2 => map[0] = *e, + 6 => map[6] = *e, + _ => {} + } + }); + map.iter().enumerate().fold(HashMap::new(),|mut m, (i,v)| { m.insert(*v, i as u32); m }) +} + +fn ex2(content: &str) -> u32 { + content.lines().map(|l| { + let (patterns, digits) = l.split_once(" | ").expect("Malformed input"); + let patterns = decode_patterns(&patterns.split_whitespace().map(|p| parse_pattern(p)).collect::>()); + digits.split_whitespace().map(|p| patterns.get(&parse_pattern(p).1).unwrap()).fold(0, |a,d| (a*10)+d) + }).sum() +} + +#[cfg(test)] +mod tests { + use super::*; + + const INPUT: &str = "be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe +edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc +fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg +fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb +aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea +fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb +dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe +bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef +egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb +gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce"; + + #[test] + fn example1() { + assert_eq!(26, ex1(INPUT)) + } + + #[test] + fn example2() { + assert_eq!(61229, ex2(INPUT)) + } +} -- cgit v1.2.3