diff --git a/res/21/example b/res/21/example index e69de29..9e1d842 100644 --- a/res/21/example +++ b/res/21/example @@ -0,0 +1,11 @@ +........... +.....###.#. +.###.##..#. +..#.#...#.. +....#.#.... +.##..S####. +.##..#...#. +.......##.. +.##.#.####. +.##..##.##. +........... diff --git a/res/21/input b/res/21/input new file mode 100644 index 0000000..599492d --- /dev/null +++ b/res/21/input @@ -0,0 +1,131 @@ +................................................................................................................................... +......#...........#................#......................................#.....#......#..##.#.......#....#.#........#...##...#.... +...........#.................##...#...##......#............#...........##..#....................#.................#......#....#..#. +.....#.........#.....#.#.....###........###........#..........................##..##.......#.......#.....#...............#.......#. +....#..#......#......................#......#...............................#...........#........................#.............#... +.......#.....................#.............#......#...............#....................#............#.#.........#..#............... +.#.#.....#....#...................##......#..#..................#............................................#...............#..... +.....#....#...#....##...#......#.............#......##........#................#................#................#...............#. +.......#...................#..........#......................................#.........................##.........#..#.#..#........ +....#..........#.........#....#......##...........##.................#................#...#............#...#..##....#...........#.. +...#..........###............#.............#........................##..................#...##..................##......#...#...... +.......#.......#.#..#.......#.......##..........#.........#..............................##.....#..#..........#.....#......#....... +..#.........#.....#..#..#..#..................#.........................#......................#.#..#...#..........#.....#....##.#. +..................................#.....#................#........#..........................#........#.....#...............#....#. +..........#..........#.#.................#.#.........................................#.......#..........#..##...#......#........... +.........#........#...........#...#.#....#.................##..#....................#..........#....#.#....##........#.......#..... +....#........#....................##..#......................#......#.........................#..#............................#.... +...#.#...#...#......................#..#..........................#...#.#...............#......#.#........#....#..........#.....#.. +..............#.....#.#......#........#...#..........#..#.#..#.........................#.....#..#......#.......#......#.......#.... +.......................#.....#.....#................................##...#..#...#...........#..#..........#..#.#...#.........#...#. +.........#........#......#..#................................#.##.........#...#.................##......#.........#.##...#...#..... +.#.#.........##....#..........#..##.....................#..##...#..#..#...#.......#...........................#.................... +.#.#......#..#..............##.#...#.#.............#.........#..............#.....#...............#..........................#...#. +.....##.....#.....##..#...#..#..#......................................#......#.............#.............#.....#......#........#.. +......................#........#................#.......#..........#.............##............#..........#....#............#...... +.....#..............................#.......##......#..#....#..............#.....................................#.....#.........#. +....................##...........#................#.#.....#.............#......#..##...#....................#................#.#... +.................................#...........#.....#..#..#..............#..##.........#..............#......#................#..... +............##.................................#..#...##.#........#...................................#...........#.#........#...#. +...#.......#.#........#......#...........#....#..#.......#....#........#.#.#.............##.......#.................#.............. +...###............#......................##..##.........................#.........#......#..............#..#............#.......... +..#.......#...##...#..#.......#.......#...#...........................................#...................#........##....#..#...... +..#..................#.....#...........#.................#.#.#...........#..................#............#.......#................. +...##..#.............#.....#.....................#................#..........................#.............##...............#...... +............#....#....#...#............#....#...........#.#.................#....#..................................#.............. +...#.....#.............#...........................#.....##..........#...............#....#...............#........................ +......#.....##.........#..........##..#...............#....#..#.#.#.....#.............#.###..............#..#...................... +....................#...#...............#....................#...............#.#.#..##.............................#............... +...................#...#...........#...#.#...#...........#..............#............#..#......#............#.............#......#. +...#................#.................#.....#..........#........#.#........#...................#..#...........#.##........#......#. +....................#..........#....................#....#...#.....................#.......#.................#......#........#..... +...#.........#...................#.......##...###......#..#.......#.#..................#............#...........#....#...........#. +......#..#.#...#.#...............#.......................#.........#.......##................#...................#.###............. +...............#..............................................#.....#....#...#..#...#.....#......#.....#........................... +.......#.......#..........#.#.#..#.....#...#......#.................#........#...#..#.#.......#.................................... +...........#..#.....................#.........................#...#.#.....#..........#....##.....#................................. +.......#.#.#.#..........#...#.##.##..#....................#.#.#..............#...................#....##........................... +.........................#.#.#...................#......#......#.............#.....#..............#......###..............#.#...... +......#...............#...........#...................##..............#.##..#.#.#.#.#......#.....#.##.......#............#.#....##. +.....#....#.............#..##........###...#.......#.....#....#.......###....................#..#.#............................#... +.#........................#.....#......#.#.....................#......#.#...........#..#.....#.#.#..........#..............#...#... +.....##...#.........#.#.#.#...................#..#..#.#..#...#..#.....#.#.....#.........##......................................... +.................#.#...............#...............#...........#...........#.....#..........#...#.............................#.... +.......................##...........#..........#...............#..#......................................#...#................#..#. +......#......................#..##.#........#.............#.....#..#....................#......#.........#.....#...#...........#.#. +.....................#.................#....##..#....#....##..#..............#..............#.....#...............#................ +.#.................##.....#.#....#.....................#.............#....#......#...................#.#.##....................#... +.##..........##....#.##......#..#.................#...#..##........#....#..#.......#..............#.......#........................ +......................#...........###.#.....##.............##........#..................#..............................#........#.. +..#........................#...................#.#.#...#........#........#....#.....#.....#........................#............... +.#...........................#........#.....................#.....##.#..#.....#......#....#...#............##...................... +............#...#..#..........#..............#...#...#..#..........#.........#...............#....#.#......#.#...#................. +..............................#..##...............#.....#....#.........................#....#...#....#.....#....#.................. +..................#.#.........................#.......#........#.......#..##....#...#....#..................................#...... +..........................#..#...#....................................#......#...#...#..#...#....#.............#.#................. +.................................................................S................................................................. +..............#...#...#.....##....#..................#....#........##..#.....#.#...#.#..............#.................##........... +.........##.........#............##.............................#.#...#.#.......#..........####....#...........#...........#....... +.........#...............................#...............#........................#......#..#......#.............##................ +.............#..............................#...#.................#..........###.#.#.#.........#........#.......................... +.#........#..#...........##...........#.#..........................#.........#....#.............#.............##................... +..#..........#..........................#...#..#..#.##...#..............#.....#...#............##........#.#.......#............#.. +.................#.........#.......#.......#............#.#.................##...#.##.....................#.....#.................. +.#.##..........#...#...................#...#.....##.....#...............#..#.........#..............#.................#............ +.....#.......#..##....#..........#........#.#.....#.........#...............##......#.#....#.....#.................#............... +......#.......#.#...#....................#...............#.........#....#..#.#..........##.....#...#........................#...... +.#.................#.................#.#....................#..............#.................#......#.......#.....#................ +.#..#................................#......#..........#..............#.#.##.......................#............................... +..#.#............#.#......#...............#.#....#...#.#..#.......#...#.....#.......#........#.#...........#...#............##..... +.......#..........#....#....................#................##...........#......#..#...#....#...#......................#...#.#.... +.........##........#........#......#.......#........#..#................#..#.............#..................#.#..........#......... +......#....#.................................#..#.#....#..............#........#.....#.##........#..........#.............#....#... +.............#........#.........#...##.....#.....#................##..........#.......#....#....................................... +..........................#.....#..#......#....#....#..##...#.......................#..............#.......#..........#..#......#.. +...#.......................#....#.......#......#..................#................#...##........##.#............................#. +....#....................#.####..........#......#.....#......#....#.#.#................#...#..............#.............#.....#.... +..........#..#...#..............##..#..#..#..........#.......#.##........##..............#.....#......#............#...#........... +..........................#..#..............#..#....#..#..............#.#...#..........#.....#..#.#................................ +.......#.......#...............#.........#..#.#...#.....................#.....#......................#..............#.#..#......... +........#.....#.............#....................#.#........#.................#.....#...#..........#............#...............#.. +.............#....##.........#.#................#....#.........#...#.......................#.....#.#..................#......#..... +...............#.....#.............#.....#.......#.......#......#.#..#.....#...#...#.......#................#...#................#. +...................#..#...........#..###....................#......#........#......#...........................#......#.......#.... +..#.....#.##......#................#.................#.................##....................#.#...........#....#.#...#........#... +....#......#.#..#........#..............#.......#.........#.................#.............#.#...#...........#.#................#... +..#....#.#.......#...#.................#......#....#................#.......................#...#.........##..........#.........#.. +..............#...............................#.##..............................#.......#..#...#...................#...#........#.. +.#..#....#......#.....#...#............#..............................#..............#....................#..##..............#..##. +.......##............#..#............######............#................#..........#.#...#...#................#.................... +...#..................##....................#.......#.#....##...................##..#....#..#..........#.....#..................... +...#.....#..#..#.#.......................#......................#...........#......###...#.............#........................#.. +.....#.............#..........#......................#....#............#.##....#.......#.............#..........#........##........ +........#...#.#..................#........#.#......#........#.....##...#...#....#...#......................................#....... +...............#............#..#.......................##.#.....#...#.#........#..................#......#......................... +.............##..#.......#.#.....#............#............#..........##.......#.....##...............................#...#........ +.#..##...............#..............#...........#..#..#...##.......#..#.......................#.......##.....................#.#... +.....................###........#..#.....................#........#...#.##...................#....##.........#.........#........... +...#.....#...............#....#..###.......................................#..................#.................................... +...#.#.#.....#..#.........#.....#...##.............#................#......#.....#........................#....#..............#.... +...........#......#..##.......#......#..................#.....##..................#........#.......#......#...#...#..#...#......... +.........#.#.........#......#............................#.....#............#.................#..........#..............#.......#.. +............#.........#.#....#.......#...................................#..............##.##..............#....#...............#.. +.............#.....##.........#.........##...............#...............#.............................###........#.....#.#........ +......##..........#....#.#.#..........##.#.#................#...#....##.......................#.......#...#.#........#.#..#........ +....#....#............#.#......#..#.........#.............#.#..........................#.......#..............#..#..#.....#........ +...................#...........#....#...#..#..#.......#..#...#.#........................#.................#.............#.......... +.........#..#...#......#......#......#.................#...........#...................#........#.......#......#.#.......#.......#. +..#..#......#.....................#...........................#.....##................#.............................#.............. +..#.#.......#........................#.......#..........................#................#.....#...#.........#.#......#............ +...............................#....................................#.......................##....#......#.#.........#.#.........#. +.#.....................#......#..........#......#..............#...............##............#...#.##...#......##...#.#.#.......... +...............#.#......#..................#......................................................#........................#.#..... +...#...#..#...............##...#...#.....#...#....................#..#..........#.....##......................................#.... +.#..#...#........................#....#...##......#...........#.......................#...##......#.......#................#....... +....#...........#.............#.....#..#..#.....#.................................#........#.#..............#...................... +....#....#........#..#.#..............#................................................#..............#................#.........#. +.....#..........#.......#..................#................................................#..............##...#.................. +................#...............#..........#............##.........................#........#.#...............#...##............... +........#..................#..#.....#.#.........#.....#.#.#..................#.......#.#......#....#.........#..#.........#...#.... +..#...........##...............#...........#..#...#...#.#..................##......#.....#.......#........#..#...#......#........#. +................................................................................................................................... diff --git a/src/days/d21.rs b/src/days/d21.rs index 9ba1fb5..ed5c516 100644 --- a/src/days/d21.rs +++ b/src/days/d21.rs @@ -1,16 +1,98 @@ -use std::fs; +use std::{fs, collections::{HashMap, VecDeque}}; + +use num::Integer; pub fn solve() { - let path = "res/21/example"; + let path = "res/21/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 s = find_char_location(&grid, 'S').unwrap(); + + const STEPS1: usize = 64; + let map = floodfill(&grid, s, STEPS1); + + let result: usize = map.iter().filter(|(_, dist)| dist.is_even()).count(); println!("Result 1: {result}"); - let result: usize = 0; + + const STEPS2: usize = 26501365; + let x_len = grid.len(); + let y_len = grid[0].len(); + let steps_in_first = (x_len-1)/2; + let copies_per_dir = (STEPS2-steps_in_first)/x_len; + + let pos_per_odd = floodfill(&grid, (0, 0), x_len+y_len).iter().filter(|(_, dist)| dist.is_odd()).count(); + let pos_per_even = floodfill(&grid, (0, 0), x_len+y_len).iter().filter(|(_, dist)| dist.is_even()).count(); + + let cross = copies_per_dir * 2 * (pos_per_odd + pos_per_even) + pos_per_odd; + let triangles = 4 * (1..copies_per_dir).map(|i| if i.is_odd() {i*pos_per_odd} else {i*pos_per_even}).sum::(); + + let lefttop_odd = floodfill(&grid, (0,0), 64).iter().filter(|(_, dist)| dist.is_odd()).count(); + let righttop_odd = floodfill(&grid, (0,y_len-1), 64).iter().filter(|(_, dist)| dist.is_odd()).count(); + let leftbot_odd = floodfill(&grid, (x_len-1,0), 64).iter().filter(|(_, dist)| dist.is_odd()).count(); + let rightbot_odd = floodfill(&grid, (x_len-1,y_len-1), 64).iter().filter(|(_, dist)| dist.is_odd()).count(); + + let lefttop_even = floodfill(&grid, (0,0), 64).iter().filter(|(_, dist)| dist.is_even()).count(); + let righttop_even = floodfill(&grid, (0,y_len-1), 64).iter().filter(|(_, dist)| dist.is_even()).count(); + let leftbot_even = floodfill(&grid, (x_len-1,0), 64).iter().filter(|(_, dist)| dist.is_even()).count(); + let rightbot_even = floodfill(&grid, (x_len-1,y_len-1), 64).iter().filter(|(_, dist)| dist.is_even()).count(); + + let mut result = cross+triangles; + + result -= (copies_per_dir+1) * (lefttop_odd + righttop_odd + leftbot_odd + rightbot_odd + 1); // last 1 is very odd offset that fixes the result + result += copies_per_dir * (lefttop_even + righttop_even + leftbot_even + rightbot_even); println!("Result 2: {result}"); + } + +fn find_char_location(matrix: &Vec>, target_char: char) -> Option<(usize, usize)> { + for (row_index, row) in matrix.iter().enumerate() { + for (col_index, &ch) in row.iter().enumerate() { + if ch == target_char { + return Some((row_index, col_index)); + } + } + } + None +} + +fn floodfill(grid: &Vec>, s: (usize,usize), steps: usize) -> HashMap<(usize,usize), usize> { + let mut map: HashMap<(usize,usize), usize> = HashMap::new(); + let mut q: VecDeque<((usize, usize), usize)> = VecDeque::new(); + q.push_back((s, 0)); + + while !q.is_empty() { + let curr = q.pop_front().unwrap(); + if curr.1 > steps || map.contains_key(&curr.0) { + continue + } + + map.insert(curr.0, curr.1); + + let mut next: Vec<(usize,usize)> = vec!(); + if curr.0.0 > 0 { + next.push((curr.0.0-1, curr.0.1)) + } + if curr.0.1 > 0 { + next.push((curr.0.0, curr.0.1-1)) + } + if curr.0.0 < grid.len()-1 { + next.push((curr.0.0+1, curr.0.1)) + } + if curr.0.1 < grid[0].len()-1 { + next.push((curr.0.0, curr.0.1+1)) + } + + for pos in next { + if !map.contains_key(&pos) && grid[pos.0][pos.1] != '#' { + q.push_back((pos, curr.1+1)); + } + } + } + map +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index b7882ba..987bf4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ extern crate scan_fmt; use std::time::Instant; fn main() { - days::d20::solve() + days::d21::solve() //_all_days() } @@ -93,11 +93,11 @@ fn _all_days() { days::d20::solve(); time = _print_elapsed(time); - /* println!("\nDay 21"); days::d21::solve(); time = _print_elapsed(time); + /* println!("\nDay 22"); days::d22::solve(); time = _print_elapsed(time);