d06 - but very inefficient
This commit is contained in:
		
							parent
							
								
									18dc6dd714
								
							
						
					
					
						commit
						686ec4ed0e
					
				
					 1 changed files with 108 additions and 6 deletions
				
			
		
							
								
								
									
										114
									
								
								src/days/d06.rs
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								src/days/d06.rs
									
									
									
									
									
								
							| 
						 | 
					@ -1,7 +1,14 @@
 | 
				
			||||||
use std::fs;
 | 
					use std::{
 | 
				
			||||||
 | 
					    collections::{HashMap, HashSet},
 | 
				
			||||||
 | 
					    fs,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use rayon::iter::{
 | 
				
			||||||
 | 
					    IndexedParallelIterator, IntoParallelRefIterator, ParallelBridge, ParallelIterator,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn solve() {
 | 
					pub fn solve() {
 | 
				
			||||||
    let path = "res/06/example";
 | 
					    let path = "res/06/input";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let contents = fs::read_to_string(path).expect("Something went wrong reading the file");
 | 
					    let contents = fs::read_to_string(path).expect("Something went wrong reading the file");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,22 +24,117 @@ pub fn solve() {
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
        .collect();
 | 
					        .collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut pos: (usize, usize) = contents
 | 
					    let init_pos: (isize, isize) = contents
 | 
				
			||||||
        .lines()
 | 
					        .lines()
 | 
				
			||||||
        .enumerate()
 | 
					        .enumerate()
 | 
				
			||||||
        .find(|(_, line)| line.contains("^"))
 | 
					        .find(|(_, line)| line.contains("^"))
 | 
				
			||||||
        .map(|(x, line)| (x, line.chars().position(|c| c == '^').unwrap()))
 | 
					        .map(|(x, line)| {
 | 
				
			||||||
 | 
					            (
 | 
				
			||||||
 | 
					                x as isize,
 | 
				
			||||||
 | 
					                line.chars().position(|c| c == '^').unwrap() as isize,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
        .unwrap();
 | 
					        .unwrap();
 | 
				
			||||||
 | 
					    let mut pos = init_pos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut dir: (isize, isize) = (-1, 0);
 | 
					    let mut dir: (isize, isize) = (-1, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut guard_positions: Vec<(usize, usize)> = vec![];
 | 
					    let mut guard_positions: HashSet<(isize, isize)> = HashSet::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // let the guard move until he leaves the map
 | 
					    // let the guard move until he leaves the map
 | 
				
			||||||
 | 
					    while pos.0 >= 0 && pos.0 < map.len() as isize && pos.1 >= 0 && pos.1 < map[0].len() as isize {
 | 
				
			||||||
 | 
					        // check if we need to turn right
 | 
				
			||||||
 | 
					        if map[pos.0 as usize][pos.1 as usize] {
 | 
				
			||||||
 | 
					            pos.0 = pos.0 - dir.0;
 | 
				
			||||||
 | 
					            pos.1 = pos.1 - dir.1;
 | 
				
			||||||
 | 
					            dir = match dir {
 | 
				
			||||||
 | 
					                (-1, 0) => (0, 1),
 | 
				
			||||||
 | 
					                (0, 1) => (1, 0),
 | 
				
			||||||
 | 
					                (1, 0) => (0, -1),
 | 
				
			||||||
 | 
					                (0, -1) => (-1, 0),
 | 
				
			||||||
 | 
					                _ => panic!(),
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let result: usize = 0;
 | 
					        // add guard position
 | 
				
			||||||
 | 
					        guard_positions.insert(pos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // move guard
 | 
				
			||||||
 | 
					        pos.0 += dir.0;
 | 
				
			||||||
 | 
					        pos.1 += dir.1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let result: usize = guard_positions.len();
 | 
				
			||||||
    println!("Result 1: {}", result);
 | 
					    println!("Result 1: {}", result);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut obstacle_positions: HashSet<(isize, isize)> = HashSet::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let obstacle_positions: Vec<Vec<(isize, isize)>> = map
 | 
				
			||||||
 | 
					        .iter()
 | 
				
			||||||
 | 
					        .enumerate()
 | 
				
			||||||
 | 
					        .par_bridge()
 | 
				
			||||||
 | 
					        .map(|(i, row)| {
 | 
				
			||||||
 | 
					            row.iter()
 | 
				
			||||||
 | 
					                .enumerate()
 | 
				
			||||||
 | 
					                .filter(|(j, cell)| {
 | 
				
			||||||
 | 
					                    if !*cell && (i as isize, *j as isize) != init_pos {
 | 
				
			||||||
 | 
					                        let mut new_map = map.clone();
 | 
				
			||||||
 | 
					                        new_map[i][*j] = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        let mut dir: (isize, isize) = (-1, 0);
 | 
				
			||||||
 | 
					                        let mut pos = init_pos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        let mut positions: HashMap<(isize, isize), usize> = HashMap::new();
 | 
				
			||||||
 | 
					                        let mut cyclic = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        while pos.0 >= 0
 | 
				
			||||||
 | 
					                            && pos.0 < map.len() as isize
 | 
				
			||||||
 | 
					                            && pos.1 >= 0
 | 
				
			||||||
 | 
					                            && pos.1 < map[0].len() as isize
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            // check if we need to turn right
 | 
				
			||||||
 | 
					                            if new_map[pos.0 as usize][pos.1 as usize] {
 | 
				
			||||||
 | 
					                                pos.0 = pos.0 - dir.0;
 | 
				
			||||||
 | 
					                                pos.1 = pos.1 - dir.1;
 | 
				
			||||||
 | 
					                                dir = match dir {
 | 
				
			||||||
 | 
					                                    (-1, 0) => (0, 1),
 | 
				
			||||||
 | 
					                                    (0, 1) => (1, 0),
 | 
				
			||||||
 | 
					                                    (1, 0) => (0, -1),
 | 
				
			||||||
 | 
					                                    (0, -1) => (-1, 0),
 | 
				
			||||||
 | 
					                                    _ => panic!(),
 | 
				
			||||||
 | 
					                                };
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            // move guard
 | 
				
			||||||
 | 
					                            pos.0 += dir.0;
 | 
				
			||||||
 | 
					                            pos.1 += dir.1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            if positions.contains_key(&pos) {
 | 
				
			||||||
 | 
					                                *positions.get_mut(&pos).unwrap() += 1;
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
 | 
					                                positions.insert(pos, 1);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            if *positions.get(&pos).unwrap() == 5 {
 | 
				
			||||||
 | 
					                                cyclic = true;
 | 
				
			||||||
 | 
					                                break;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if cyclic {
 | 
				
			||||||
 | 
					                            return true;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    false
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					                .map(|(j, _)| (i as isize, j as isize))
 | 
				
			||||||
 | 
					                .collect()
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let obstacle_positions: HashSet<(isize, isize)> =
 | 
				
			||||||
 | 
					        obstacle_positions.into_iter().flatten().collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let result: usize = obstacle_positions.len();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    println!("Result 2: {}", result);
 | 
					    println!("Result 2: {}", result);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue