Advertisement
saaoijeefhiuh

2024 day 11

Dec 11th, 2024
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.41 KB | None | 0 0
  1. fn solve(input: &str, steps: u64) -> u64 {
  2.     fn split(s: u64) -> Vec<u64> {
  3.         if s == 0 {
  4.             vec![1]
  5.         } else {
  6.             let digits = s.checked_ilog10().unwrap_or(0) + 1;
  7.             if digits % 2 == 0 {
  8.                 let op = 10_u64.pow(digits / 2);
  9.                 vec![s / op, s % op]
  10.             } else {
  11.                 vec![s * 2024]
  12.             }
  13.         }
  14.     }
  15.  
  16.     (0..steps)
  17.         .fold(
  18.             input
  19.                 .split(" ")
  20.                 .filter_map(|s| s.parse::<u64>().ok())
  21.                 .map(|s| (s, 1))
  22.                 .collect(),
  23.             |stones: Vec<(u64, u64)>, _| {
  24.                 let mut sorted_stones = stones
  25.                     .into_iter()
  26.                     .flat_map(|(s, c)| split(s).into_iter().map(move |n| (n, c)))
  27.                     .collect::<Vec<(u64, u64)>>();
  28.  
  29.                 sorted_stones.sort_by(|(a, _), (b, _)| a.cmp(b));
  30.  
  31.                 sorted_stones
  32.                     .into_iter()
  33.                     .chunk_by(|(s, _)| *s)
  34.                     .into_iter()
  35.                     .map(|(s, g)| (s, g.map(|(_, c)| c).sum()))
  36.                     .collect()
  37.             },
  38.         )
  39.         .iter()
  40.         .map(|(_, c)| c)
  41.         .sum::<u64>()
  42. }
  43.  
  44. pub fn part_one(input: &str) -> Option<u64> {
  45.     Some(solve(input, 25))
  46. }
  47.  
  48. pub fn part_two(input: &str) -> Option<u64> {
  49.     Some(solve(input, 75))
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement