Guest User

Untitled

a guest
Dec 8th, 2021
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.18 KB | None | 0 0
  1. use std::collections::HashSet;
  2.  
  3. fn decode(inputs: &[HashSet<char>], element: &HashSet<char>) -> usize {
  4.     let length = element.len();
  5.     if length == inputs[0].len() {
  6.         return 1;
  7.     } else if length == inputs[1].len() {
  8.         return 7;
  9.     } else if length == inputs[2].len() {
  10.         return 4;
  11.     } else if length == inputs[9].len() {
  12.         return 8;
  13.     }
  14.  
  15.     if length == 5 {
  16.         if inputs[0].difference(element).count() == 0 {
  17.             return 3;
  18.         } else if inputs[2].difference(element).count() == 1 {
  19.             return 5;
  20.         } else {
  21.             return 2;
  22.         }
  23.     }
  24.     if inputs[0].difference(element).count() > 0 {
  25.         return 6;
  26.     } else if inputs[2].difference(element).count() > 0 {
  27.         return 0;
  28.     } else {
  29.         return 9;
  30.     }
  31. }
  32.  
  33. fn aoc_08_part02(input: &mut [(Vec<HashSet<char>>, Vec<HashSet<char>>)]) -> usize {
  34.     let mut result = 0;
  35.  
  36.     for (first, last) in input.iter_mut() {
  37.         // Sorting the input makes it WAY more easier...
  38.         first.sort_unstable_by_key(|l| l.len());
  39.  
  40.         // Now we try to decode...
  41.         result += last.iter().map(|element| decode(&first, element))
  42.             .fold(0, |acc, val| acc * 10 + val);
  43.     }
  44.  
  45.     result
  46. }
  47.  
  48. fn aoc_08_part01(input: &[(Vec<HashSet<char>>, Vec<HashSet<char>>)]) -> usize {
  49.     input.iter().map(|(_first, last)| {
  50.         last.iter().filter_map(|element| {
  51.             let l = element.len();
  52.             if l == 2 || l == 3 || l == 4 || l == 7 {
  53.                 return Some(l);
  54.             }
  55.             None
  56.         }).count()
  57.     }).sum()
  58. }
  59.  
  60. fn main() {
  61.     let mut s = include_str!("../input.txt").lines().map(|l| {
  62.         let before_after = l.split_once(" | ").unwrap_or(("", ""));
  63.         (
  64.             before_after.0.split_whitespace().map(|d| d.chars().collect::<HashSet<_>>()).collect(),
  65.             before_after.1.split_whitespace().map(|d| d.chars().collect::<HashSet<_>>()).collect()
  66.         )
  67.     }).collect::<Vec<(Vec<HashSet<char>>, Vec<HashSet<char>>)>>();
  68.  
  69.     let result = aoc_08_part01(&s);
  70.     println!("Result {}", result);
  71.  
  72.     let result = aoc_08_part02(&mut s);
  73.     println!("Result {}", result);
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment