From 663fd765a756b5284bf582fe9f837944ad14a78b Mon Sep 17 00:00:00 2001 From: JonOfUs Date: Sat, 16 Dec 2023 15:46:34 +0100 Subject: [PATCH] d16 --- res/16/example | 10 +++++ res/16/input | 110 ++++++++++++++++++++++++++++++++++++++++++++++++ src/days/d16.rs | 104 ++++++++++++++++++++++++++++++++++++++++++--- src/days/d17.rs | 2 - src/days/d18.rs | 2 - src/days/d19.rs | 2 - src/days/d20.rs | 2 - src/days/d21.rs | 2 - src/days/d22.rs | 2 - src/days/d23.rs | 2 - src/days/d24.rs | 2 - src/days/d25.rs | 2 - src/main.rs | 2 +- 13 files changed, 220 insertions(+), 24 deletions(-) create mode 100644 res/16/input diff --git a/res/16/example b/res/16/example index e69de29..c78b2e7 100644 --- a/res/16/example +++ b/res/16/example @@ -0,0 +1,10 @@ +.|...\.... +|.-.\..... +.....|-... +........|. +.......... +.........\ +..../.\\.. +.-.-/..|.. +.|....-|.\ +..//.|.... \ No newline at end of file diff --git a/res/16/input b/res/16/input new file mode 100644 index 0000000..1db0f08 --- /dev/null +++ b/res/16/input @@ -0,0 +1,110 @@ +\./....\../......................|............../-.......|....................|....../|\..../.............\... +...........|.-.............|.././........../........................./...........||.....................-....\ +...............\.............-...................-............/.|...|.......-...............................-. +.......................................\..|-.../\....../.........|............/...|.....-.|...........\...|... +............/.-..|...\........|...........-......................\.........-........\....../....|.........|... +................-...........-|....\.................-........\........\...|.././......./...................... +......................-....../.-........../........\....../..../.............-..........|.|.................|. +...|....................|.|../.......\.......|.......-...............|.......\......\....................|\... +.........\.............|.......-.....................|....................|..................-.......\-...\... +.../............-........../.||..../........-...../-.........-......./......\........|........................ +....|..../.../../.....\..............-.-................../........|...../....\....\...................|...... +.......\..-..................|..../..........|....................-............/...................\|../...... +..-.\................../................../....\........./...\.\/.............................\|.............. +.......-...............................-.......|....................|......................../...........|/... +................|...\-....-.......|/......./.......................|../.\-...-....../...\........\......\.|... +.....................-.......-....-................|.............-........-....................\....../....-.. +\..|.|....-......../......../.../...................|.....................\..--...............-.......||...... +.....-.\.....................-...\............../....\.......-/../|...|......../..\..................../...... +....|...\......................|...|.../...|...............\...........-........................|.......--.-.. +......\....|.-...........\................................|.................\..............\..|............... +...................||..................\|...................|....\............-....../........\.../.....-...-. +....................................|....|......./.\..................../..............|../.............\..... +......|...\./......../......|....\..././.......|...............................-.........../.-..\............. +.|.../....|.................-..............|..................\....../..........-..........|...|......|./..... +.........|.........../..\...|....../...................................................-...................... +../....|/.............|.........../....................\.......\............./.........../.......-.........\-. +................\....................\.....-..|............-......-|...............\......\...-............... +..........|..........|...........|.../.............................-......\.....|\.........\.\.............../ +.........................../...........\.............|................../.-.......-....././\.........-........ +\....\................../..../.............-../......|.\.........-./..\........./............................. +.\..../..............|........../.......\........|.-.-........//\.......|.....-.../..-.....-...........-...... +.......|................\.....................\.............-........./..................-...-...........\.... +....../.......-......././.-.....|..........|.........|..........\............................/................ +................\......\................\\.\..\........\.................................\......-/.....-...... +..-...../......-.......................................|.................|......-.-...-.....\....../...-...... +........................\....|.....\....|............................\..............\.......................\. +............................/|...|........\.\....\......-|......................|.....|.\-...-......-......... +\..|...........................\.................\.-................../................./..../.\.............. +|.../.............\...............................|..|..-......-.......-.......|..\../.........-...........|.. +...........|................\............................../.......................|..../-|................... +...\.|.\..................|.\-/....../-/..|/............\......../\.\...........\\.......-....-\.............. +.................................-......./..-............|..\../..................................|/./|..../.. +.../..../........|-.........|.....|..............-.................../.....|-.......|.....|...............\... +-..-...................//............................./.........-...............-.........|.../...........\... +.............././\......|..............\..................|...............-............................-...... +/.........|/.....-../|......-.........|..-.-...........-........|..........-.................................. +.............\.......|/........../.....|.......-....-....../......-...................-....|........\......... +\...|.|.../..|....../....-.........................-..............|.....\.......-........\........-....|...... +-.-..\..........|........................./..........|..-./...........................|...........-........-.. +....\./..............-.........|......./.-..............-.-../\........|..|.........-..............\...\.../.. +..|...........\...../......../.../.........\....../....-..................................|/............-...|. +.../.........|..-................|..........|....\/..........|..|\.......|...........|........................ +........../.............\...\.............................-...................|................-...-.......... +.....................-.................................../../.............................-../................ +.-........./......|........-...../...................\..|-........-...\..........././||....................... +.........|../../.....-...........-....-..-...|.............................\.................................. +...................-.....\......../............./...............-.......\.........../........|............../. +.|\.............................................-.........-....|.....\..................-..-.......\.......... +/................/....\.........\|...............-.............|......./...........-.....\........-.......--.. +..........-........\........\-...\....\\........../...|./.........................\.....|.................\../ +............................-.|............................\...\../..........................\......./...../.. +.....//.......|..\.........-..\.........-....\..-..\.....-.....//.../......................................... +................................|....|..\............/|./.\....|.............-..\|................./.......... +.....|.......-.............-../...../.........|../.....................|........................./.....|...... +.-...\...../................\.-........|..|...|...|.........\|......|...../...../..........\................|. +.../../............-.........|................\.....\....-...................../.../...........-...|...../|... +..-..........-.......-.............\..............-..............\.......|.................................... +..|................/........................-...................../.................................|......../ +...../........\......./....../......||.......|-...............-.....-............../../....................... +...\..../...................-........\.........\............................/....|.........-..........-....... +.../................\....\..|-...........................\.-..-......|.|.-/.....-............./............... +../............\...........................-../....|....................-..............|........./......|...\\ +.........................\..................|..\........................./....................\............... +/.............|.....................-.....\.....-..|............/..........|./...|....-...-....|-....../...... +.\.-.....\............././.........................\..........-......................|........\............... +........\../............../......\.....\..-............|............\............../..|....................... +....-../....\..................................-......../...|................................................- +.......................\............-...................../.........\............-../.........\/..|../....-/|. +..../.............|....../............-.|......../.....................|...../..|.....-.............../....... +....................|\...........-...................................../.......................-...-..|..\.|/. +......................-....-\........../..............\.......-....\.....|...............\.........-.......... +.|......../.....|.........||.................../.....\...|.........\........../........\............../....... +.-............/-..........-...........\..........\.......-.................................................... +.....|/....-.../......-......................../.|./...\.......\/......./......../..\...../...|...|.........\- +.............../..\.../-......|\\......../............../............|/......................./.......\....... +.....\.-./....../............/..-................../....\..................-.................|.......-/..-.... +.-................-..-...........................-..|............-.................../...........-...........| +-......\......|......\............../.............../...-/.../....\.........................-.....|.....-..... +.......\.....--.-............................\..........-./........||......|..\...../..../................|... +.............-.....|..../.......|............|....................-......\.............../|...............|... +............|........../........|....................-....|....../.........\..........-........-..-........... +..............|.................-....|...........\.|.../.........../..........-......\|.............\..-...... +......-............\.......\....................................................|\..\.......................-. +................||...........\...-\/..|..............\.........................../.......\.|.............|...| +....-...................-...../....|............\.../.........-..../....\........../..../.|..........\........ +........-.....\........../....|.........\......./...........\.......-..|............../...........-..|........ +.................../.....-...........|....-...\......\...|...|...........................\.......||......\|... +......-.........|.....\....-..........|.......\....\..................................../........|...|./...... +..................\.........../.............../.................../.........-.......-..../............/\.../.. +........\...\...\....../.......\\........../............../.-.................../........|..............-..... +....../........................|................-.-......-....|......\\.-...-.|..........|..../............... +/.......-.....|.....\...................|...../..............|......|.../....................\.....|.......... +|.\....-...............|/....|........../....................................\.-............................/. +.......................-...............-.|...................|......\.....-\..|.......-......./\.....-......-. +................................|../.................................-........-...................|........... +.....-.........\..-................./...........|...............|....................\/../../........|.-...... +............................../......./.\/........./..|..............|.......................\................ +......./.-.......\...........-...............|............|.............|..........|.|..........|.........--.. +............-..............-.............\./...|.....|................|..........|/.............\............. +.../....................-........-.................../.....\.............-...................\................ diff --git a/src/days/d16.rs b/src/days/d16.rs index e3af137..58ea590 100644 --- a/src/days/d16.rs +++ b/src/days/d16.rs @@ -1,18 +1,112 @@ -use std::fs; +use std::{collections::HashMap, fs}; + +use rayon::prelude::*; pub fn solve() { - let path = "res/16/example"; + let path = "res/16/input"; - let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); + let contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); + let grid: Vec> = contents + .lines() + .map(|line| line.chars().collect::>()) + .collect(); - let result: usize = 0; + let result: usize = solve_starts(&vec![(0usize, 0usize, 0u8)], &grid); println!("Result 1: {result}"); + let possible_starts: Vec<(usize, usize, u8)> = (0..grid.len()) + .map(|x| (x, 0, 0)) + .chain((0..grid.len()).map(|x| (x, grid[0].len() - 1, 2))) + .chain((0..grid[0].len()).map(|y| (0, y, 1))) + .chain((0..grid[0].len()).map(|y| (grid.len() - 1, y, 3))) + .collect(); - let result: usize = 0; + let result: usize = solve_starts(&possible_starts, &grid); println!("Result 2: {result}"); } + +fn solve_starts(possible_starts: &Vec<(usize, usize, u8)>, grid: &Vec>) -> usize { + possible_starts + .par_iter() + .map(|start| { + // (x,y,dir) - dir=0 -> east, dir=1 -> south, ... + let mut starts: Vec<(usize, usize, u8)> = vec![*start]; + let mut visited: HashMap<(usize, usize), u8> = HashMap::new(); + + while !starts.is_empty() { + let (mut x, mut y, mut dir) = starts.pop().unwrap(); + + 'mov: loop { + if visited.contains_key(&(x, y)) && *visited.get(&(x, y)).unwrap() == dir { + break 'mov; // already been here + } + visited.insert((x, y), dir); + + match grid[x][y] { + '/' => { + dir = match dir { + 2 => 1, + 1 => 2, + 0 => 3, + 3 => 0, + _ => panic!(), + } + } + '\\' => { + dir = match dir { + 0 => 1, + 1 => 0, + 2 => 3, + 3 => 2, + _ => panic!(), + } + } + '|' => { + if dir % 2 == 0 { + starts.push((x, y, 1)); + starts.push((x, y, 3)); + break 'mov; + } + } + '-' => { + if dir % 2 == 1 { + starts.push((x, y, 0)); + starts.push((x, y, 2)); + break 'mov; + } + } + _ => {} + } + + (x, y) = match dir { + 0 => (x, y + 1), + 1 => (x + 1, y), + 2 => { + if y == 0 { + break 'mov; + } + (x, y - 1) + } + 3 => { + if x == 0 { + break 'mov; + } + (x - 1, y) + } + _ => panic!(), + }; + + if x >= grid.len() || y >= grid[0].len() { + break 'mov; + } + } + } + visited.len() + }) + .max() + .unwrap() +} diff --git a/src/days/d17.rs b/src/days/d17.rs index 5ee1d63..64bf4b1 100644 --- a/src/days/d17.rs +++ b/src/days/d17.rs @@ -6,12 +6,10 @@ pub fn solve() { let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); - let result: usize = 0; println!("Result 1: {result}"); - let result: usize = 0; println!("Result 2: {result}"); diff --git a/src/days/d18.rs b/src/days/d18.rs index 2576a99..622b910 100644 --- a/src/days/d18.rs +++ b/src/days/d18.rs @@ -6,12 +6,10 @@ pub fn solve() { let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); - let result: usize = 0; println!("Result 1: {result}"); - let result: usize = 0; println!("Result 2: {result}"); diff --git a/src/days/d19.rs b/src/days/d19.rs index 0b508ff..f8328e2 100644 --- a/src/days/d19.rs +++ b/src/days/d19.rs @@ -6,12 +6,10 @@ pub fn solve() { let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); - let result: usize = 0; println!("Result 1: {result}"); - let result: usize = 0; println!("Result 2: {result}"); diff --git a/src/days/d20.rs b/src/days/d20.rs index 5af3cd8..9e20186 100644 --- a/src/days/d20.rs +++ b/src/days/d20.rs @@ -6,12 +6,10 @@ pub fn solve() { let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); - let result: usize = 0; println!("Result 1: {result}"); - let result: usize = 0; println!("Result 2: {result}"); diff --git a/src/days/d21.rs b/src/days/d21.rs index f4ab24e..9ba1fb5 100644 --- a/src/days/d21.rs +++ b/src/days/d21.rs @@ -6,12 +6,10 @@ pub fn solve() { let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); - let result: usize = 0; println!("Result 1: {result}"); - let result: usize = 0; println!("Result 2: {result}"); diff --git a/src/days/d22.rs b/src/days/d22.rs index fe489d0..f9bec3f 100644 --- a/src/days/d22.rs +++ b/src/days/d22.rs @@ -6,12 +6,10 @@ pub fn solve() { let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); - let result: usize = 0; println!("Result 1: {result}"); - let result: usize = 0; println!("Result 2: {result}"); diff --git a/src/days/d23.rs b/src/days/d23.rs index 393b64b..22c2be8 100644 --- a/src/days/d23.rs +++ b/src/days/d23.rs @@ -6,12 +6,10 @@ pub fn solve() { let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); - let result: usize = 0; println!("Result 1: {result}"); - let result: usize = 0; println!("Result 2: {result}"); diff --git a/src/days/d24.rs b/src/days/d24.rs index 27c5ae7..a669ce8 100644 --- a/src/days/d24.rs +++ b/src/days/d24.rs @@ -6,12 +6,10 @@ pub fn solve() { let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); - let result: usize = 0; println!("Result 1: {result}"); - let result: usize = 0; println!("Result 2: {result}"); diff --git a/src/days/d25.rs b/src/days/d25.rs index bff5e0d..f0834cc 100644 --- a/src/days/d25.rs +++ b/src/days/d25.rs @@ -6,12 +6,10 @@ pub fn solve() { let mut _contents = fs::read_to_string(path).expect("I/O error, wrong path?"); //let contents = BufReader::new(fs::File::open(path).expect("I/O error, wrong path?")); - let result: usize = 0; println!("Result 1: {result}"); - let result: usize = 0; println!("Result 2: {result}"); diff --git a/src/main.rs b/src/main.rs index dfe5791..70ec0f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ extern crate scan_fmt; use std::time::Instant; fn main() { - days::d15::solve() + days::d16::solve() //_all_days() }