Advertisement
Guest User

Untitled

a guest
Dec 20th, 2024
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.27 KB | None | 0 0
  1. use grid::Grid;
  2.  
  3. const  ADJACENTS: [(i16, i16); 4] = [
  4.     (0, -1),
  5.     (1, 0),
  6.     (0, 1),
  7.     (-1, 0),
  8. ];
  9.  
  10. const PICOSECONDS: i16 = 100;
  11.  
  12. fn main() {
  13.     let time = std::time::Instant::now();
  14.  
  15.     let input: Vec<_> = include_str!("../input.txt").lines().collect();
  16.     let mut grid: Grid<char> = Grid::new(input.len(), input[0].len());
  17.     let mut end: Option<(i16, i16)> = None;
  18.  
  19.     for (y, row) in input.into_iter().enumerate() {
  20.         for (x, c) in row.chars().enumerate() {
  21.             grid[(y, x)] = c;
  22.  
  23.             if c == 'E' {
  24.                 end = Some((x as i16, y as i16));
  25.             }
  26.         }
  27.     }
  28.  
  29.     let mut distances: Grid<Option<i16>> = Grid::new(grid.rows(), grid.cols());
  30.     distances.fill(None);
  31.  
  32.     let mut next = Some(end.unwrap().clone());
  33.     let mut distance = 0;
  34.     let mut cheats = 0;
  35.  
  36.     loop {
  37.         if next.is_none() {
  38.             break;
  39.         }
  40.  
  41.         let (cx, cy) = next.unwrap();
  42.         next = None;
  43.  
  44.         distances[(cy as usize, cx as usize)] = Some(distance);
  45.  
  46.         for (xd, yd) in ADJACENTS {
  47.             let x = cx + xd;
  48.             let y = cy + yd;
  49.  
  50.             if let Some(cell) = grid.get(y, x) {
  51.                 match cell {
  52.                     '#' => if distance >= PICOSECONDS {
  53.                         let tx = x + xd;
  54.                         let ty = y + yd;
  55.                         if let Some(&Some(dist)) = distances.get(ty, tx) {
  56.                             if distance - dist - 2 >= PICOSECONDS {
  57.                                 cheats += 1;
  58.                             }
  59.                         }
  60.                     },
  61.                     '.' | 'S' => {
  62.                         grid[(y as usize, x as usize)] = 'O';
  63.                         next = Some((x, y));
  64.                     },
  65.                     'O' | 'E' => (),
  66.                     _ => unimplemented!()
  67.                 }
  68.             }
  69.         }
  70.  
  71.         distance += 1;
  72.     }
  73.  
  74.     println!("Time elapsed: {:?}", time.elapsed());
  75.     println!("Cheats: {}", cheats);
  76.  
  77.     // // For debugging Grid<char>:
  78.     // let grid_out = grid.iter_rows()
  79.     //     .map(|row| row.into_iter().collect::<String>())
  80.     //     .collect::<Vec<String>>()
  81.     //     .join("\n");
  82.     // println!("Grid:\n{}", grid_out);
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement