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