Advertisement
saaoijeefhiuh

2024 day 4

Dec 4th, 2024
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.22 KB | None | 0 0
  1. pub fn part_one(input: &str) -> Option<u32> {
  2.     fn offsets(i: i32, j: i32, d: i32) -> Vec<(u32, i32, i32)> {
  3.         vec![
  4.             (0, i + d, j),
  5.             (1, i + d, j + d),
  6.             (2, i, j + d),
  7.             (3, i - d, j + d),
  8.             (4, i - d, j),
  9.             (5, i - d, j - d),
  10.             (6, i, j - d),
  11.             (7, i + d, j - d),
  12.         ]
  13.     }
  14.  
  15.     let mut counts = HashMap::<(u32, i32, i32), u32>::new();
  16.     input
  17.         .split("\n")
  18.         .enumerate()
  19.         .map(|(i, l)| {
  20.             l.chars()
  21.                 .enumerate()
  22.                 .map(move |(j, c)| match c {
  23.                     'X' => offsets(i as i32, j as i32, 0),
  24.                     'M' => offsets(i as i32, j as i32, 1),
  25.                     'A' => offsets(i as i32, j as i32, 2),
  26.                     'S' => offsets(i as i32, j as i32, 3),
  27.                     _ => vec![],
  28.                 })
  29.                 .flatten()
  30.         })
  31.         .flatten()
  32.         .for_each(|(d, i, j)| *counts.entry((d, i, j)).or_default() += 1);
  33.        
  34.     Some(counts.values().filter(|v| **v == 4).count() as u32)
  35. }
  36.  
  37. pub fn part_two(input: &str) -> Option<u32> {
  38.     fn offsets(i: i32, j: i32, d: i32) -> Vec<(u32, i32, i32)> {
  39.         vec![
  40.             (0, i + d, j + d),
  41.             (1, i + d, j + d),
  42.             (1, i - d, j + d),
  43.             (2, i - d, j + d),
  44.             (2, i - d, j - d),
  45.             (3, i - d, j - d),
  46.             (3, i + d, j - d),
  47.             (0, i + d, j - d),
  48.         ]
  49.     }
  50.  
  51.     let mut counts = HashMap::<(u32, i32, i32), u32>::new();
  52.     input
  53.         .split("\n")
  54.         .enumerate()
  55.         .map(|(i, l)| {
  56.             l.chars()
  57.                 .enumerate()
  58.                 .map(move |(j, c)| match c {
  59.                     'M' => offsets(i as i32, j as i32, -1),
  60.                     'A' => offsets(i as i32, j as i32, 0),
  61.                     'S' => offsets(i as i32, j as i32, 1),
  62.                     _ => vec![],
  63.                 })
  64.                 .flatten()
  65.         })
  66.         .flatten()
  67.         .for_each(|(d, i, j)| *counts.entry((d, i, j)).or_default() += 1);
  68.        
  69.     // A will feature twice in votes, so need 6
  70.     Some(counts.values().filter(|v| **v == 6).count() as u32)
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement