d21 with weird offset
This commit is contained in:
		
							parent
							
								
									53a7a24e91
								
							
						
					
					
						commit
						8073809b28
					
				
					 4 changed files with 231 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
...........
 | 
			
		||||
.....###.#.
 | 
			
		||||
.###.##..#.
 | 
			
		||||
..#.#...#..
 | 
			
		||||
....#.#....
 | 
			
		||||
.##..S####.
 | 
			
		||||
.##..#...#.
 | 
			
		||||
.......##..
 | 
			
		||||
.##.#.####.
 | 
			
		||||
.##..##.##.
 | 
			
		||||
...........
 | 
			
		||||
							
								
								
									
										131
									
								
								res/21/input
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								res/21/input
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,131 @@
 | 
			
		|||
...................................................................................................................................
 | 
			
		||||
......#...........#................#......................................#.....#......#..##.#.......#....#.#........#...##...#....
 | 
			
		||||
...........#.................##...#...##......#............#...........##..#....................#.................#......#....#..#.
 | 
			
		||||
.....#.........#.....#.#.....###........###........#..........................##..##.......#.......#.....#...............#.......#.
 | 
			
		||||
....#..#......#......................#......#...............................#...........#........................#.............#...
 | 
			
		||||
.......#.....................#.............#......#...............#....................#............#.#.........#..#...............
 | 
			
		||||
.#.#.....#....#...................##......#..#..................#............................................#...............#.....
 | 
			
		||||
.....#....#...#....##...#......#.............#......##........#................#................#................#...............#.
 | 
			
		||||
.......#...................#..........#......................................#.........................##.........#..#.#..#........
 | 
			
		||||
....#..........#.........#....#......##...........##.................#................#...#............#...#..##....#...........#..
 | 
			
		||||
...#..........###............#.............#........................##..................#...##..................##......#...#......
 | 
			
		||||
.......#.......#.#..#.......#.......##..........#.........#..............................##.....#..#..........#.....#......#.......
 | 
			
		||||
..#.........#.....#..#..#..#..................#.........................#......................#.#..#...#..........#.....#....##.#.
 | 
			
		||||
..................................#.....#................#........#..........................#........#.....#...............#....#.
 | 
			
		||||
..........#..........#.#.................#.#.........................................#.......#..........#..##...#......#...........
 | 
			
		||||
.........#........#...........#...#.#....#.................##..#....................#..........#....#.#....##........#.......#.....
 | 
			
		||||
....#........#....................##..#......................#......#.........................#..#............................#....
 | 
			
		||||
...#.#...#...#......................#..#..........................#...#.#...............#......#.#........#....#..........#.....#..
 | 
			
		||||
..............#.....#.#......#........#...#..........#..#.#..#.........................#.....#..#......#.......#......#.......#....
 | 
			
		||||
.......................#.....#.....#................................##...#..#...#...........#..#..........#..#.#...#.........#...#.
 | 
			
		||||
.........#........#......#..#................................#.##.........#...#.................##......#.........#.##...#...#.....
 | 
			
		||||
.#.#.........##....#..........#..##.....................#..##...#..#..#...#.......#...........................#....................
 | 
			
		||||
.#.#......#..#..............##.#...#.#.............#.........#..............#.....#...............#..........................#...#.
 | 
			
		||||
.....##.....#.....##..#...#..#..#......................................#......#.............#.............#.....#......#........#..
 | 
			
		||||
......................#........#................#.......#..........#.............##............#..........#....#............#......
 | 
			
		||||
.....#..............................#.......##......#..#....#..............#.....................................#.....#.........#.
 | 
			
		||||
....................##...........#................#.#.....#.............#......#..##...#....................#................#.#...
 | 
			
		||||
.................................#...........#.....#..#..#..............#..##.........#..............#......#................#.....
 | 
			
		||||
............##.................................#..#...##.#........#...................................#...........#.#........#...#.
 | 
			
		||||
...#.......#.#........#......#...........#....#..#.......#....#........#.#.#.............##.......#.................#..............
 | 
			
		||||
...###............#......................##..##.........................#.........#......#..............#..#............#..........
 | 
			
		||||
..#.......#...##...#..#.......#.......#...#...........................................#...................#........##....#..#......
 | 
			
		||||
..#..................#.....#...........#.................#.#.#...........#..................#............#.......#.................
 | 
			
		||||
...##..#.............#.....#.....................#................#..........................#.............##...............#......
 | 
			
		||||
............#....#....#...#............#....#...........#.#.................#....#..................................#..............
 | 
			
		||||
...#.....#.............#...........................#.....##..........#...............#....#...............#........................
 | 
			
		||||
......#.....##.........#..........##..#...............#....#..#.#.#.....#.............#.###..............#..#......................
 | 
			
		||||
....................#...#...............#....................#...............#.#.#..##.............................#...............
 | 
			
		||||
...................#...#...........#...#.#...#...........#..............#............#..#......#............#.............#......#.
 | 
			
		||||
...#................#.................#.....#..........#........#.#........#...................#..#...........#.##........#......#.
 | 
			
		||||
....................#..........#....................#....#...#.....................#.......#.................#......#........#.....
 | 
			
		||||
...#.........#...................#.......##...###......#..#.......#.#..................#............#...........#....#...........#.
 | 
			
		||||
......#..#.#...#.#...............#.......................#.........#.......##................#...................#.###.............
 | 
			
		||||
...............#..............................................#.....#....#...#..#...#.....#......#.....#...........................
 | 
			
		||||
.......#.......#..........#.#.#..#.....#...#......#.................#........#...#..#.#.......#....................................
 | 
			
		||||
...........#..#.....................#.........................#...#.#.....#..........#....##.....#.................................
 | 
			
		||||
.......#.#.#.#..........#...#.##.##..#....................#.#.#..............#...................#....##...........................
 | 
			
		||||
.........................#.#.#...................#......#......#.............#.....#..............#......###..............#.#......
 | 
			
		||||
......#...............#...........#...................##..............#.##..#.#.#.#.#......#.....#.##.......#............#.#....##.
 | 
			
		||||
.....#....#.............#..##........###...#.......#.....#....#.......###....................#..#.#............................#...
 | 
			
		||||
.#........................#.....#......#.#.....................#......#.#...........#..#.....#.#.#..........#..............#...#...
 | 
			
		||||
.....##...#.........#.#.#.#...................#..#..#.#..#...#..#.....#.#.....#.........##.........................................
 | 
			
		||||
.................#.#...............#...............#...........#...........#.....#..........#...#.............................#....
 | 
			
		||||
.......................##...........#..........#...............#..#......................................#...#................#..#.
 | 
			
		||||
......#......................#..##.#........#.............#.....#..#....................#......#.........#.....#...#...........#.#.
 | 
			
		||||
.....................#.................#....##..#....#....##..#..............#..............#.....#...............#................
 | 
			
		||||
.#.................##.....#.#....#.....................#.............#....#......#...................#.#.##....................#...
 | 
			
		||||
.##..........##....#.##......#..#.................#...#..##........#....#..#.......#..............#.......#........................
 | 
			
		||||
......................#...........###.#.....##.............##........#..................#..............................#........#..
 | 
			
		||||
..#........................#...................#.#.#...#........#........#....#.....#.....#........................#...............
 | 
			
		||||
.#...........................#........#.....................#.....##.#..#.....#......#....#...#............##......................
 | 
			
		||||
............#...#..#..........#..............#...#...#..#..........#.........#...............#....#.#......#.#...#.................
 | 
			
		||||
..............................#..##...............#.....#....#.........................#....#...#....#.....#....#..................
 | 
			
		||||
..................#.#.........................#.......#........#.......#..##....#...#....#..................................#......
 | 
			
		||||
..........................#..#...#....................................#......#...#...#..#...#....#.............#.#.................
 | 
			
		||||
.................................................................S.................................................................
 | 
			
		||||
..............#...#...#.....##....#..................#....#........##..#.....#.#...#.#..............#.................##...........
 | 
			
		||||
.........##.........#............##.............................#.#...#.#.......#..........####....#...........#...........#.......
 | 
			
		||||
.........#...............................#...............#........................#......#..#......#.............##................
 | 
			
		||||
.............#..............................#...#.................#..........###.#.#.#.........#........#..........................
 | 
			
		||||
.#........#..#...........##...........#.#..........................#.........#....#.............#.............##...................
 | 
			
		||||
..#..........#..........................#...#..#..#.##...#..............#.....#...#............##........#.#.......#............#..
 | 
			
		||||
.................#.........#.......#.......#............#.#.................##...#.##.....................#.....#..................
 | 
			
		||||
.#.##..........#...#...................#...#.....##.....#...............#..#.........#..............#.................#............
 | 
			
		||||
.....#.......#..##....#..........#........#.#.....#.........#...............##......#.#....#.....#.................#...............
 | 
			
		||||
......#.......#.#...#....................#...............#.........#....#..#.#..........##.....#...#........................#......
 | 
			
		||||
.#.................#.................#.#....................#..............#.................#......#.......#.....#................
 | 
			
		||||
.#..#................................#......#..........#..............#.#.##.......................#...............................
 | 
			
		||||
..#.#............#.#......#...............#.#....#...#.#..#.......#...#.....#.......#........#.#...........#...#............##.....
 | 
			
		||||
.......#..........#....#....................#................##...........#......#..#...#....#...#......................#...#.#....
 | 
			
		||||
.........##........#........#......#.......#........#..#................#..#.............#..................#.#..........#.........
 | 
			
		||||
......#....#.................................#..#.#....#..............#........#.....#.##........#..........#.............#....#...
 | 
			
		||||
.............#........#.........#...##.....#.....#................##..........#.......#....#.......................................
 | 
			
		||||
..........................#.....#..#......#....#....#..##...#.......................#..............#.......#..........#..#......#..
 | 
			
		||||
...#.......................#....#.......#......#..................#................#...##........##.#............................#.
 | 
			
		||||
....#....................#.####..........#......#.....#......#....#.#.#................#...#..............#.............#.....#....
 | 
			
		||||
..........#..#...#..............##..#..#..#..........#.......#.##........##..............#.....#......#............#...#...........
 | 
			
		||||
..........................#..#..............#..#....#..#..............#.#...#..........#.....#..#.#................................
 | 
			
		||||
.......#.......#...............#.........#..#.#...#.....................#.....#......................#..............#.#..#.........
 | 
			
		||||
........#.....#.............#....................#.#........#.................#.....#...#..........#............#...............#..
 | 
			
		||||
.............#....##.........#.#................#....#.........#...#.......................#.....#.#..................#......#.....
 | 
			
		||||
...............#.....#.............#.....#.......#.......#......#.#..#.....#...#...#.......#................#...#................#.
 | 
			
		||||
...................#..#...........#..###....................#......#........#......#...........................#......#.......#....
 | 
			
		||||
..#.....#.##......#................#.................#.................##....................#.#...........#....#.#...#........#...
 | 
			
		||||
....#......#.#..#........#..............#.......#.........#.................#.............#.#...#...........#.#................#...
 | 
			
		||||
..#....#.#.......#...#.................#......#....#................#.......................#...#.........##..........#.........#..
 | 
			
		||||
..............#...............................#.##..............................#.......#..#...#...................#...#........#..
 | 
			
		||||
.#..#....#......#.....#...#............#..............................#..............#....................#..##..............#..##.
 | 
			
		||||
.......##............#..#............######............#................#..........#.#...#...#................#....................
 | 
			
		||||
...#..................##....................#.......#.#....##...................##..#....#..#..........#.....#.....................
 | 
			
		||||
...#.....#..#..#.#.......................#......................#...........#......###...#.............#........................#..
 | 
			
		||||
.....#.............#..........#......................#....#............#.##....#.......#.............#..........#........##........
 | 
			
		||||
........#...#.#..................#........#.#......#........#.....##...#...#....#...#......................................#.......
 | 
			
		||||
...............#............#..#.......................##.#.....#...#.#........#..................#......#.........................
 | 
			
		||||
.............##..#.......#.#.....#............#............#..........##.......#.....##...............................#...#........
 | 
			
		||||
.#..##...............#..............#...........#..#..#...##.......#..#.......................#.......##.....................#.#...
 | 
			
		||||
.....................###........#..#.....................#........#...#.##...................#....##.........#.........#...........
 | 
			
		||||
...#.....#...............#....#..###.......................................#..................#....................................
 | 
			
		||||
...#.#.#.....#..#.........#.....#...##.............#................#......#.....#........................#....#..............#....
 | 
			
		||||
...........#......#..##.......#......#..................#.....##..................#........#.......#......#...#...#..#...#.........
 | 
			
		||||
.........#.#.........#......#............................#.....#............#.................#..........#..............#.......#..
 | 
			
		||||
............#.........#.#....#.......#...................................#..............##.##..............#....#...............#..
 | 
			
		||||
.............#.....##.........#.........##...............#...............#.............................###........#.....#.#........
 | 
			
		||||
......##..........#....#.#.#..........##.#.#................#...#....##.......................#.......#...#.#........#.#..#........
 | 
			
		||||
....#....#............#.#......#..#.........#.............#.#..........................#.......#..............#..#..#.....#........
 | 
			
		||||
...................#...........#....#...#..#..#.......#..#...#.#........................#.................#.............#..........
 | 
			
		||||
.........#..#...#......#......#......#.................#...........#...................#........#.......#......#.#.......#.......#.
 | 
			
		||||
..#..#......#.....................#...........................#.....##................#.............................#..............
 | 
			
		||||
..#.#.......#........................#.......#..........................#................#.....#...#.........#.#......#............
 | 
			
		||||
...............................#....................................#.......................##....#......#.#.........#.#.........#.
 | 
			
		||||
.#.....................#......#..........#......#..............#...............##............#...#.##...#......##...#.#.#..........
 | 
			
		||||
...............#.#......#..................#......................................................#........................#.#.....
 | 
			
		||||
...#...#..#...............##...#...#.....#...#....................#..#..........#.....##......................................#....
 | 
			
		||||
.#..#...#........................#....#...##......#...........#.......................#...##......#.......#................#.......
 | 
			
		||||
....#...........#.............#.....#..#..#.....#.................................#........#.#..............#......................
 | 
			
		||||
....#....#........#..#.#..............#................................................#..............#................#.........#.
 | 
			
		||||
.....#..........#.......#..................#................................................#..............##...#..................
 | 
			
		||||
................#...............#..........#............##.........................#........#.#...............#...##...............
 | 
			
		||||
........#..................#..#.....#.#.........#.....#.#.#..................#.......#.#......#....#.........#..#.........#...#....
 | 
			
		||||
..#...........##...............#...........#..#...#...#.#..................##......#.....#.......#........#..#...#......#........#.
 | 
			
		||||
...................................................................................................................................
 | 
			
		||||
| 
						 | 
				
			
			@ -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<Vec<char>> = contents.lines().map(|line| line.chars().collect::<Vec<_>>()).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::<usize>();
 | 
			
		||||
 | 
			
		||||
    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<Vec<char>>, 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<Vec<char>>, 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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue