Advertisement
Guest User

Untitled

a guest
Dec 21st, 2024
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.32 KB | Source Code | 0 0
  1. use core::hash;
  2. use std::collections::HashSet;
  3.  
  4. use rayon::prelude::*;
  5.  
  6. const DATA: &str = include_str!("../../data/year2024/day_6.txt");
  7.  
  8. pub fn part_1() {
  9.     let (mut x, mut y, mut dx, mut dy) = (0, 0, 0, 0);
  10.     let mut visited = vec![];
  11.     let mut lines = DATA.lines().collect::<Vec<&str>>();
  12.  
  13.     for (i, &data) in lines.iter().enumerate() {
  14.         for j in 0..data.len() {
  15.             let ch = data.chars().nth(j).unwrap();
  16.  
  17.             if ch!='.' && ch!='#' {
  18.                 if ch=='^' {
  19.                     dy = -1;
  20.                 }
  21.                 if ch=='>' {
  22.                     dx = 1;
  23.                 }
  24.                 if ch=='v' {
  25.                     dy = 1;
  26.                 }
  27.                 if ch=='<' {
  28.                     dx = -1;
  29.                 }
  30.  
  31.                 x = j as i32;
  32.                 y = i as i32;
  33.                 visited.push((x, y));
  34.             }
  35.         }
  36.     }
  37.  
  38.     loop {
  39.         if (x>0 && x<(lines[0].len()-1) as i32) && (y>0 && y<(lines.len()-1) as i32) {
  40.             let next = lines[(y+dy) as usize].chars().nth((x+dx) as usize).unwrap();
  41.            
  42.             if next=='#' {
  43.                 if dy==-1 {
  44.                     dy = 0;
  45.                     dx = 1;
  46.                 }
  47.                 else if dy==1 {
  48.                     dy = 0;
  49.                     dx = -1;
  50.                 }
  51.                 else if dx==-1 {
  52.                     dx = 0;
  53.                     dy = -1;
  54.                 }
  55.                 else if dx==1 {
  56.                     dx = 0;
  57.                     dy = 1;
  58.                 }
  59.             }
  60.         }
  61.  
  62.         y += dy;
  63.         x += dx;
  64.  
  65.         if (x<0 || x>=lines[0].len() as i32) || (y<0 || y>=lines.len() as i32) {
  66.             break;
  67.         }
  68.         if !visited.contains(&(x, y)) {
  69.             visited.push((x, y));
  70.         }
  71.     }
  72.  
  73.     println!("Part 1: {}", visited.len());
  74. }
  75.  
  76. pub fn part_2() {
  77.     let mut grid = DATA.lines().map(|x| x.chars().collect()).collect::<Vec<Vec<char>>>();
  78.     let row = grid.len();
  79.     let col = grid[0].len();
  80.     let mut count = 0;
  81.  
  82.     let (mut x, mut y, mut dx, mut dy) = (0i32, 0i32, 0i32, 0i32);
  83.     let (mut x_copy, mut y_copy, mut dx_copy, mut dy_copy) = (0i32, 0i32, 0i32, 0i32);
  84.     let (mut o_x, mut o_y) =(0, 0);
  85.  
  86.     'outer: for (i, vec) in grid.iter().enumerate() {
  87.        for (j, char) in vec.iter().enumerate() {
  88.            match char {
  89.                '^' => dy = -1,
  90.                '>' => dx = 1,
  91.                'v' => dy = 1,
  92.                '<' => dx = -1,
  93.                _ => ()
  94.            }
  95.  
  96.            if *char!='.' && *char!='#' {
  97.                x = j as i32;
  98.                y = i as i32;
  99.                (x_copy,y_copy,dx_copy,dy_copy) = (x,y,dx,dy);
  100.  
  101.                break 'outer;
  102.             }
  103.         }
  104.     }
  105.    
  106.     let (mut prev_i, mut prev_j) = (0, 0);
  107.     for i in 0..row {
  108.         for j in 0..col {
  109.             let mut g = 0;
  110.             (x,y,dx,dy) = (x_copy,y_copy,dx_copy,dy_copy);
  111.  
  112.             if grid[i][j]=='.' {
  113.                 grid[prev_i][prev_j] = '.';
  114.                 grid[i][j] = '0';
  115.                 (prev_i, prev_j) = (i, j);
  116.             }
  117.             else {
  118.                 continue;
  119.             }
  120.  
  121.             loop {
  122.                 //println!("Position: ({}, {}), Direction: ({}, {})", x, y, dx, dy);
  123.                 if ((x+dx)>=0 && (x+dx)<col as i32) && ((y+dy)>=0 && (y+dy)<row as i32) {
  124.                     let next = grid[(y+dy) as usize][(x+dx) as usize];
  125.                    
  126.                     if next == '#' || next=='0' {
  127.                         match (dx, dy) {
  128.                             (0, -1) => { dx = 1; dy = 0; }  
  129.                             (0, 1)  => { dx = -1; dy = 0; }  
  130.                             (-1, 0) => { dx = 0; dy = -1; }
  131.                             (1, 0)  => { dx = 0; dy = 1; }  
  132.                             _       => (),
  133.                         }
  134.                     }
  135.                 }
  136.        
  137.                 y += dy;
  138.                 x += dx;
  139.  
  140.                g+=1;
  141.                if g>25000 {
  142.                     count+=1;
  143.                     break;
  144.                }
  145.        
  146.                 if (x<0 || x>=col as i32) || (y<0 || y>=row as i32) {
  147.                     break;
  148.                 }
  149.             }
  150.         }
  151.     }
  152.  
  153.     println!("Part 2: {count}");
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement