day 21
This commit is contained in:
parent
d6efa60716
commit
fc5e45dcbf
7
day21/Cargo.lock
generated
Normal file
7
day21/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "day21"
|
||||
version = "0.1.0"
|
8
day21/Cargo.toml
Normal file
8
day21/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "day21"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
131
day21/input.txt
Normal file
131
day21/input.txt
Normal file
@ -0,0 +1,131 @@
|
||||
...................................................................................................................................
|
||||
.#........#.#.........#................##.#.............#....................#....#....#.#...#.......#..........#........#.........
|
||||
....#......#.....................##...#.#....#.#..#...#.......................#.....#..........##....#..#........#.##..#..#...#....
|
||||
.#.....#.............#.#...............#...........#.#.#................#...........#.#.....#.......##......#........#.#...........
|
||||
.....#...........#.......##.#.#..........#....#....#..#.#..................................#....##...#.#.....#..#.......#...#...#..
|
||||
...#....##............#...#..#.....#....##....#....##...........#...............#..##..#..............#..#......#.....#............
|
||||
..##....#.........#.......#..#...#...........................................#.....#.#........#...#.......................#.....#..
|
||||
..##.#........#..........#......#...#.....#..#.......#........................#..........##......#...#.#..............#......#.....
|
||||
........#....##.................................#.##.........#.......#........#...#..#.....................#.#.##....#.........#...
|
||||
.#...............#....#..........#....#.#...........................................................#.#.....#...#...#.........#....
|
||||
..#........#.##..............#...##.....#..#...#....................................#..##......#..#.......#........................
|
||||
...........................................#.................#.#..................#..#..#..#....#..#................#..........#...
|
||||
.....#...#...#.#......#.....#.#.....#.#..#........................#..#.##...................#.................................#.#..
|
||||
......#...........#.........##....#.#.#....#..............#........#....................#.............#..##...#.............#......
|
||||
..#...........##....#......#..#........................#.#........#..#...#...........#............................#.#............#.
|
||||
.#....#..#......#..........................#.......................#....#...........#......#.......#...............................
|
||||
....#.#...##....#.........#....#...#.#..#............................#.......#...............................................#..#..
|
||||
.......#..........##......#..#...#.....#............#...#...................#...............#..#..................#.....#..#...#...
|
||||
..................#.........#....#.#....#..#....................#..................................................................
|
||||
.#.##.................#....#..#.......##.#.................#.#............#...#..........#.#...#.........##.#...............#......
|
||||
..#........#.....#.#.........#.#.....#..#........#...#.....#....#....#.....................##....#...............................#.
|
||||
..#...#....#.#.............#..#..#...............##.......##.........#.....................................#....###.....##....#....
|
||||
....#..####.....#....................#................#.......#.............#..#..#..........##......##.......#...........#........
|
||||
..........##..#........#.......#..............#.#......#..#....#.............#...#................#......##...#..#......#..........
|
||||
......#....#...#........#.............................##..#.....#..............#.#......................................##.#...#...
|
||||
.#..........................................#.......#...#.##..#............#.......................#.#...##........................
|
||||
............#.#...........#.....#....................##...#...#....#.................#.#.........#......#........#......#...#......
|
||||
.#.....##.#..#..........#....##............#...........#.#.....#.......#............#.#............#...............................
|
||||
.........#........#...#.###.....#.........#.#...##.##....##..........#................................#..........#...##...#........
|
||||
...........#.........##...#.#..................................................#.........#..................#.........#.......#....
|
||||
....##...#..#.#..#.......................#....#......#............#....#.........###......#..............#.......#...#..........#..
|
||||
...........#.......#......#...............................#.....#.......#..#...............#.........##........#.#.........#.......
|
||||
......#....#.................#..............#..#..........#...#........................##..............#.........................#.
|
||||
.###.##...#.##........#........................#.#.###................#...#.#....#...........#...............##.........#..........
|
||||
...........................................#.........#..##.................#...#.#.#..##..#............#.#.#.....##.....#..........
|
||||
.#............................................#..#............#....#...#...#......#.#..........................#....#.#..........#.
|
||||
...........#...........#................#........#..........#........#...........#..............#.........#....##....#....#...##.#.
|
||||
................#............................#...#......#.....................#..............#.........................##..#...#...
|
||||
...#....#.............................................#..................#.....#.#..#.....#................#.......#....#..........
|
||||
.#....##..#.#.......#.............#..............#...#..#....................#..#........#.#.......................................
|
||||
.#...#.......................................................#..........#.........#.......##...#.#.#............###............#.#.
|
||||
.....#.....#......#..............#.#...............#....#.....................#......#....#.#........#.........#....#.........#....
|
||||
............#.#.###.......................................................#...................#....#...#.......##............#.....
|
||||
.#......#..............................#..........#....#....#.#.#........#............#.....#........................#......#......
|
||||
................#......................##.......#.......#..#..............##...................#...#...#...........................
|
||||
.#...#..................#.......................#...#...#..........#.......#.......#...................##...................#......
|
||||
........#...............#...#....................#..#.......................#.............#.#.#..........#..........###........#.#.
|
||||
.#..##...#..#............#.....#.....................#......#..............#......#..#..............#.....................#........
|
||||
....#...###.....................###..........#....#....#..............#................#.#.......#.#....##............#......#.#...
|
||||
......#.....................#.......#.#.#...#....#...#.#.....#..#........##.#..#..#......##........................................
|
||||
.......#.#............#...........#........#..............#....##..##..................##..........#...........#.......#..#..#...#.
|
||||
..#..#......................#..................................#....#......#...#............##......#......................##...#..
|
||||
.#...............................#.#.........#.....................###.#..................##.#...#.......#....................#..#.
|
||||
......##................#.........#......#................#........#.....#....#.#.##..#..#...##...#.#...........#................#.
|
||||
..#..#.........#...............##..................#........................................#........#......##.....................
|
||||
...................#....#......#...................#.#.....#..............#....##................#......#...#......#.........#.....
|
||||
....#...........#.......#......#..........#.....................#..#.........##.....##...........###......##.......................
|
||||
.................#..#....#..##.........................................#......#..........#............#..#....#.................#..
|
||||
.............#..#........#..#..#.#.......#..........#...........#..#.........#.#...................###.....#.......................
|
||||
..#............#..#..#..#..................#.##.#...#.#...#............###......#........................#.........#..#.........#..
|
||||
...........#..##.#..#.............#...#.............#.........#.....#.......#..................#...##..##......#...#..#............
|
||||
..............#...#...#.....##....#.#........#................#.....#.....#......#.......##....#.....#......#..#....#..............
|
||||
.............#....#..##..#.................#....#.#......#.#......#...##.....#....###.......#.......#..............................
|
||||
............................#..........#.......#................#....#.........#.......#.#..................#......................
|
||||
..........#...#.......#......................................##..........#..#......#............#..............#.....#..#..........
|
||||
.................................................................S.................................................................
|
||||
................#.........#.....#........#......................#....#.#.............#....#...#.............#...........#..........
|
||||
.........................................#......#............#...........#.......#......#..##.........##.............#.............
|
||||
........#................#.......#..........#.....#..........#........#.................##......#.............#.....#.....#........
|
||||
........#........#......#.......#....#...##.....................#.........#.....#.........#.................#..#...................
|
||||
.............#............................#.......#......#...##.........##...#......#.....#.#...#....................#.............
|
||||
..................................................#......#.......................#..##..#...##........#.#........#.................
|
||||
.#...........#..#.......#.....#...............#...#.....#..........#...#.#.#.......#.#..........................#.#................
|
||||
.####...............#...........#......#..#...................#....#....#...........#...#...................#.................#.#..
|
||||
...............#......#.##...............##..#..#........#..........#.#.............##......#............#...#.....#............#..
|
||||
.......................#.....###..#....#..#........................................#.#.............#...#........#..................
|
||||
.....................##....#...............#.........#....#.####...#......#.................#.#...........#......##..........#.#...
|
||||
..................#.................###...#............................#.#...##..#.#.#..#...#.................................#..#.
|
||||
....................#..........#..............#............................#.......#.........................#................#....
|
||||
.#..#...............#.........#..#..........#...#..........##.......##.##.....#....#...#.#......#...##.#...........................
|
||||
....#...............#....#.............................#.....#.........#..............#......#..............#............#.......#.
|
||||
........................#...........#..........#...#............#...#.#....#.............##..............##.#...................#..
|
||||
...#..................#.#...#...#.........#...........#.....#...#.##........#.#....#..........#.......##...........................
|
||||
.........#.#..........##.#....................#....#................#..#.#.....#...........#.........####.............#.......##...
|
||||
.#......#...................#........#.......#........#...#..#..........#..##..#..........#........................................
|
||||
.....#....#..#................##.....#......#.........................#.###...................#..#................#..#......#......
|
||||
..............#..........................................#.........#.....##.###............#...##.....................##...........
|
||||
..#......#..#.#.#.........#...#....................#.........#.........#......#...#.....................................#..........
|
||||
.......#...#.................#..........................#...##..#...#.#.........##............#..................#...............#.
|
||||
....#.........#.............#.......#.#..........#................#..##.#.#.#...................#.....#............#.....##....#...
|
||||
.###...............................#.........#..............#.#......#......#.....##.#.#.......#................#.#..............#.
|
||||
...#........#......#........................#.......#.##...#.........#........#...#.......#..##....#...........#....#..##..........
|
||||
......#.......#........#.......#..#...#....#.......#....#.#..........##........#..#...............#.......................##..#....
|
||||
...................#....#..........#........#.............#...#...##...#..........#.......#...#............#..........##...........
|
||||
.#........##......#.#................#.....#..........#....###................#.....#.......###...............#...#..........#..#..
|
||||
...#.........#...#....#............#..................##....#......#.....#.......#..........#...#...........#.....#..#.......#.....
|
||||
........#.................#........#.........#...............#...........#.##...##.......#..................#.......#....##........
|
||||
.###......#.....#......#.....................##..#...#........#........#....#................................#....#.....#.#........
|
||||
...........##..............................#..#...........#....#...#......#.#..#......#...............#............................
|
||||
.....#.#..#.........#............................#.....#.#.##......#.#.........#.....#.#...........................#...##......#.#.
|
||||
..............#.#.#.....#.#.............#..#.#.....#....#..#.#....#.................#....................#..........#........#.....
|
||||
..........#.....##.......#................#....................................#..#......#.........#..............#...#......##....
|
||||
.##.#......###..............#.#...............###......#.................#.......#......#.............................#....#.#.....
|
||||
..#..#...#............#....##.............#........................#.#..................................#......................#...
|
||||
......#.....#.............#...#............#....#.......#.....#.................................#..##...#.#..............#.........
|
||||
...........#..........#..#.#..................##...........#.......#........#....#.............#....................#.....#........
|
||||
....#...........#........##........................................#.#...............#.............#.#...##...#........#...........
|
||||
...#..#..............................................................#...#.#...#..#...........#..#..#....#..#..#.......#..#........
|
||||
...................#.#.....##...........................#................#.#...#...........#.............................#.........
|
||||
.....###.........#.....#...#...##...#..#........###.....#..#..............#.....#...................#...#...........#...#..........
|
||||
..............#......................................#..#....#.........##....##..#.......#.......................#.....##..........
|
||||
..#...................#...........#................................#.....#.#.#..........................#....#......#......#.......
|
||||
..#......#....#..##..#....#............#...........###........................#.........#........#........#............#.........#.
|
||||
...................#.##...........#....#..##............#...................#.........#........##........#...........#.#...........
|
||||
...#.#......#....#........#.......#....................................#.##..#.........#....#.#.....#.........................#..#.
|
||||
....#.#...#...........................................#...#..#....#....#..............#.........................#.....#......#..#..
|
||||
......#..................#..........#..#....#.......................#...............#...........#..............#....#.#............
|
||||
.#..............#........##......#...#....#...#.#................................................#.....##....#...##...#.#........#.
|
||||
.........#.............#..#..#...........................#.............#...........................#....##............#............
|
||||
..........#...#.....#..#...#...........#.#.......#........#.....................#.....#.....#...#.#..#......#....#....#...#..#.....
|
||||
.#........#............##.................##...............#.....................#.##.................#........#......#............
|
||||
....#........##....#..#.#.........#................................#................#.#.....#.............#..#....##.#....##.......
|
||||
........#.#.....#.......#.#..##..............##...................#...................#..#....................#..#.......#...#.##..
|
||||
.....#.#.........#.#....###..#..#.......#.....#................#....#........#.....................#.###.....#...........#......#..
|
||||
......#...#................#..#...##............#......#...................#............................#.........#....##...##.....
|
||||
..........#...##.....#....#...........#.....#......#..#.......................##...#.##.....#...#..##...#...#..#..#..........#...#.
|
||||
......#............#...........#.#..#...............#.............................#..#.......#...#.................#.......#....#..
|
||||
..............#........#............#....#.....##...#.###...................#............#..#.#..................#.............#...
|
||||
.............#....#.......#..#......#....#...#..#.......##.............#.##...#.........#..........................#.#...........#.
|
||||
.#..............#...#......#.......#..#................#.#.............#....#...............#.......#..............................
|
||||
...................................................................................................................................
|
267
day21/src/main.rs
Normal file
267
day21/src/main.rs
Normal file
@ -0,0 +1,267 @@
|
||||
use std::mem;
|
||||
use std::fs::read_to_string;
|
||||
use std::time::Instant;
|
||||
|
||||
// Solution to part 1 and helper for part 2
|
||||
fn count_options_basic(layout: &Vec<&[u8]>, start_pos: (i32, i32), steps: i32) -> u64 {
|
||||
count_options_basic_cont(layout, start_pos, steps, false)
|
||||
}
|
||||
|
||||
// Like count_options_basic but can begin as if we're already on an odd number
|
||||
fn count_options_basic_cont(layout: &Vec<&[u8]>, start_pos: (i32, i32), steps: i32, count_odd: bool) -> u64 {
|
||||
if steps < 0 {
|
||||
return 0;
|
||||
}
|
||||
let modulo_equal = (steps + if count_odd { 1 } else { 0 }) % 2;
|
||||
let width = layout[0].len();
|
||||
let height = layout.len();
|
||||
let mut visited: Vec<Vec<bool>> = vec![vec![false; width]; height];
|
||||
let mut tile_queue: Vec<(i32, i32)> = vec![start_pos];
|
||||
visited[start_pos.1 as usize][start_pos.0 as usize] = true;
|
||||
let mut sum = (1 - modulo_equal) as u64;
|
||||
let mut next_tile_queue: Vec<(i32, i32)> = vec![];
|
||||
for step in 1..=steps {
|
||||
let mut try_tile = |x: i32, y: i32| {
|
||||
if layout[y as usize][x as usize] != b'#' {
|
||||
if !visited[y as usize][x as usize] {
|
||||
visited[y as usize][x as usize] = true;
|
||||
next_tile_queue.push((x, y));
|
||||
if step % 2 == modulo_equal {
|
||||
sum += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
for &(x, y) in &tile_queue {
|
||||
if x > 0 {
|
||||
try_tile(x - 1, y);
|
||||
}
|
||||
if x < width as i32 - 1 {
|
||||
try_tile(x + 1, y);
|
||||
}
|
||||
if y > 0 {
|
||||
try_tile(x, y - 1);
|
||||
}
|
||||
if y < height as i32 - 1 {
|
||||
try_tile(x, y + 1);
|
||||
}
|
||||
}
|
||||
if next_tile_queue.is_empty() {
|
||||
break;
|
||||
}
|
||||
tile_queue.clear();
|
||||
mem::swap(&mut tile_queue, &mut next_tile_queue);
|
||||
}
|
||||
sum
|
||||
}
|
||||
|
||||
// Not used in the end but helped figure out the better solution, also has commented visualisation
|
||||
fn count_options_infinite_naive(layout: &Vec<&[u8]>, start_pos: (i32, i32), steps: i32) -> u64 {
|
||||
if steps < 0 {
|
||||
return 0;
|
||||
}
|
||||
let modulo_equal = steps % 2;
|
||||
// Assuming square
|
||||
let chunk_width = layout.len() as i32;
|
||||
let chunk_reach = (steps + chunk_width / 2) / chunk_width + 1;
|
||||
#[derive(Clone)]
|
||||
struct Chunk {
|
||||
visited: Vec<Vec<bool>>,
|
||||
solution: i32,
|
||||
}
|
||||
impl Chunk {
|
||||
fn new(width: usize, height: usize) -> Chunk {
|
||||
Chunk {
|
||||
visited: vec![vec![false; width]; height],
|
||||
solution: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
let chunk_offset = chunk_reach - 1;
|
||||
let chunks_size = chunk_reach * 2 - 1;
|
||||
let mut chunks: Vec<Vec<Chunk>> = vec![vec![Chunk::new(chunk_width as usize, chunk_width as usize); chunks_size as usize]; chunks_size as usize];
|
||||
let mut tile_queue: Vec<(i32, i32)> = vec![start_pos];
|
||||
let mut sum = 0;
|
||||
let mut next_tile_queue: Vec<(i32, i32)> = vec![];
|
||||
for step in 1..=steps {
|
||||
let mut try_tile = |x: i32, y: i32| {
|
||||
let mut chunk_x = if x < 0 { (x - chunk_width + 1) / chunk_width } else { x / chunk_width };
|
||||
let mut chunk_y = if y < 0 { (y - chunk_width + 1) / chunk_width } else { y / chunk_width };
|
||||
let inside_x = (x - chunk_x * chunk_width) as usize;
|
||||
let inside_y = (y - chunk_y * chunk_width) as usize;
|
||||
chunk_x += chunk_offset;
|
||||
chunk_y += chunk_offset;
|
||||
if chunk_x < 0 || chunk_y < 0 || chunk_x >= chunks_size || chunk_y >= chunks_size {
|
||||
// println!("Out of bounds");
|
||||
return;
|
||||
}
|
||||
let chunk = &mut chunks[chunk_y as usize][chunk_x as usize];
|
||||
if layout[inside_y][inside_x] != b'#' {
|
||||
if !chunk.visited[inside_y][inside_x] {
|
||||
chunk.visited[inside_y][inside_x] = true;
|
||||
next_tile_queue.push((x, y));
|
||||
if step % 2 == modulo_equal {
|
||||
sum += 1;
|
||||
chunk.solution += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
for &(x, y) in &tile_queue {
|
||||
try_tile(x - 1, y);
|
||||
try_tile(x + 1, y);
|
||||
try_tile(x, y - 1);
|
||||
try_tile(x, y + 1);
|
||||
}
|
||||
tile_queue.clear();
|
||||
mem::swap(&mut tile_queue, &mut next_tile_queue);
|
||||
}
|
||||
// for row in &chunks {
|
||||
// println!("{:?}", row.iter().map(|chunk| chunk.solution).collect::<Vec<_>>());
|
||||
// }
|
||||
sum
|
||||
}
|
||||
|
||||
// Solution to part 2, makes an assumption that the starting row and column are empty
|
||||
fn count_options_infinite(layout: &Vec<&[u8]>, steps: i32) -> u64 {
|
||||
// Assuming square
|
||||
let chunk_width = layout.len() as i32;
|
||||
// Assuming the start is in the middle of chunk (it is so in the input)
|
||||
let start_pos = chunk_width / 2;
|
||||
// How many chunks in line from the start would the search reach
|
||||
let chunk_reach = (steps + chunk_width / 2) / chunk_width + 1;
|
||||
let chunk_reach_diag = (steps - 1) / chunk_width + 1;
|
||||
// Used to get solutions for various kinds of edge garden repetitions of the reachable region
|
||||
let count_options_adjusted = |start_pos: (i32, i32), steps_to_edge: i32| {
|
||||
let remaining_steps = steps - steps_to_edge;
|
||||
count_options_basic(layout, start_pos, remaining_steps)
|
||||
};
|
||||
// Order: N, W, S, E
|
||||
let edges_straight_closer = [
|
||||
count_options_adjusted(
|
||||
(start_pos, chunk_width - 1),
|
||||
start_pos + 1 + (chunk_reach - 3) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(0, start_pos),
|
||||
start_pos + 1 + (chunk_reach - 3) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(start_pos, 0),
|
||||
start_pos + 1 + (chunk_reach - 3) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(chunk_width - 1, start_pos),
|
||||
start_pos + 1 + (chunk_reach - 3) * chunk_width)
|
||||
];
|
||||
let edges_straight_further = [
|
||||
count_options_adjusted(
|
||||
(start_pos, chunk_width - 1),
|
||||
start_pos + 1 + (chunk_reach - 2) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(0, start_pos),
|
||||
start_pos + 1 + (chunk_reach - 2) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(start_pos, 0),
|
||||
start_pos + 1 + (chunk_reach - 2) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(chunk_width - 1, start_pos),
|
||||
start_pos + 1 + (chunk_reach - 2) * chunk_width)
|
||||
];
|
||||
// Order: NE, NW, SW, SE
|
||||
let edges_diagonal_closer = [
|
||||
count_options_adjusted(
|
||||
(chunk_width - 1, chunk_width - 1),
|
||||
2 * (start_pos + 1) + (chunk_reach_diag - 3) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(0, chunk_width - 1),
|
||||
2 * (start_pos + 1) + (chunk_reach_diag - 3) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(0, 0),
|
||||
2 * (start_pos + 1) + (chunk_reach_diag - 3) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(chunk_width - 1, 0),
|
||||
2 * (start_pos + 1) + (chunk_reach_diag - 3) * chunk_width)
|
||||
];
|
||||
let edges_diagonal_further = [
|
||||
count_options_adjusted(
|
||||
(chunk_width - 1, chunk_width - 1),
|
||||
2 * (start_pos + 1) + (chunk_reach_diag - 2) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(0, chunk_width - 1),
|
||||
2 * (start_pos + 1) + (chunk_reach_diag - 2) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(0, 0),
|
||||
2 * (start_pos + 1) + (chunk_reach_diag - 2) * chunk_width),
|
||||
count_options_adjusted(
|
||||
(chunk_width - 1, 0),
|
||||
2 * (start_pos + 1) + (chunk_reach_diag - 2) * chunk_width)
|
||||
];
|
||||
let mut sum: u64 = 0;
|
||||
if chunk_reach_diag < 3 {
|
||||
// If the reach is small, compute the central chunk
|
||||
sum += count_options_basic(layout, (start_pos, start_pos), steps);
|
||||
}
|
||||
if chunk_reach >= 2 {
|
||||
// Fill the corners (of the rotated square)
|
||||
sum += edges_straight_further.iter().sum::<u64>();
|
||||
}
|
||||
if chunk_reach_diag >= 2 {
|
||||
// Fill the outer edges
|
||||
sum += edges_diagonal_further.iter().sum::<u64>() * (chunk_reach_diag - 1) as u64;
|
||||
}
|
||||
if chunk_reach >= 3 {
|
||||
// Fill the inner corners (of the rotated square)
|
||||
sum += edges_straight_closer.iter().sum::<u64>();
|
||||
}
|
||||
if chunk_reach_diag >= 3 {
|
||||
// Fill the space where we know chunks will be fully filled
|
||||
let full_even = count_options_basic_cont(
|
||||
layout, (start_pos, start_pos), 2 * chunk_width, false);
|
||||
let full_odd = count_options_basic_cont(
|
||||
layout, (start_pos, start_pos), 2 * chunk_width, true);
|
||||
let r = chunk_reach_diag as u64;
|
||||
let quadratic1 = r * r + 4 - 4 * r;
|
||||
let quadratic2 = r * r - 2 * r - 3;
|
||||
if (chunk_reach_diag + steps) % 2 == 0 {
|
||||
sum += full_even * quadratic2;
|
||||
sum += full_odd * quadratic1;
|
||||
} else {
|
||||
sum += full_even * quadratic1;
|
||||
sum += full_odd * quadratic2;
|
||||
}
|
||||
// Fill the inner edges
|
||||
sum += edges_diagonal_closer.iter().sum::<u64>() * (chunk_reach_diag - 2) as u64;
|
||||
// Fill the extension of central shape if the corners stick out more
|
||||
if chunk_reach > chunk_reach_diag {
|
||||
sum += 4 * if chunk_reach_diag % 2 == 0 { full_even } else {full_odd};
|
||||
}
|
||||
}
|
||||
sum
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let time_start = Instant::now();
|
||||
let input_str = read_to_string("input.txt").unwrap();
|
||||
let time_start_no_io = Instant::now();
|
||||
let mut start_pos: (i32, i32) = (0, 0);
|
||||
let mut layout: Vec<&[u8]> = vec![];
|
||||
for line in input_str.lines() {
|
||||
let bytes = line.as_bytes();
|
||||
match bytes.iter().position(|&c| c == b'S') {
|
||||
Some(pos) => {
|
||||
start_pos = (pos as i32, layout.len() as i32);
|
||||
}
|
||||
None => {}
|
||||
}
|
||||
layout.push(bytes);
|
||||
}
|
||||
// Part 1
|
||||
let sum1 = count_options_basic(&layout, start_pos, 64);
|
||||
// part 2
|
||||
// let sum2 = count_options_infinite_naive(&layout, start_pos, 500);
|
||||
let sum2 = count_options_infinite(&layout, 26501365);
|
||||
let elapsed = time_start.elapsed().as_micros();
|
||||
let elapsed_no_io = time_start_no_io.elapsed().as_micros();
|
||||
println!("Time: {}us", elapsed);
|
||||
println!("Time without file i/o: {}us", elapsed_no_io);
|
||||
println!("Sum1: {}", sum1);
|
||||
println!("Sum2: {}", sum2);
|
||||
}
|
Loading…
Reference in New Issue
Block a user