Day 23
This commit is contained in:
parent
c09a7236cd
commit
4eb30db283
4 changed files with 254 additions and 1 deletions
75
res/23/input.txt
Normal file
75
res/23/input.txt
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
.###....#####.#..###..##..##.######.....##.....#..#.##.#.##..##..#.#.######
|
||||||
|
####.###...#..#...#......####.#.#..#...####....#...#....###.....###.#..#...
|
||||||
|
##..#.#...##.##..#.##.#####..#....#...####.#.####.#...###.####..#...#.#....
|
||||||
|
.#.###.#....##.#.##..#..###......#..#..###....#.##......#..#..#..#.###..##.
|
||||||
|
...#.###.#.#.#####..##....###.#...###.###..#...#..##........#..#...##.#....
|
||||||
|
.#.##.##...#.##.#.......###..#.##..#.##..######...##.####.###...#.########.
|
||||||
|
.####.#.#.#.#...#..#..#####.#.####...#.##.###..#.....###......###...#...#.#
|
||||||
|
..###.##..#..#.#.....#.##...#....#..##...###.###.#...####.#..#.#.##..##..#.
|
||||||
|
#.#####..#..##..#...####.####.#..#......##..#####.####.####....###..##..#..
|
||||||
|
.#.###..#####.#...##..#.#.##.##...####.#.##.#..##...###.#.##.#....##.####..
|
||||||
|
..##.#..##.#.##.##.#.####..#.#.#####...#......##...#.#..###.#..#...#.####.#
|
||||||
|
..#...#..#..#.###.###..#.#####..#..#....###...###.##.#...#..#######.##.##.#
|
||||||
|
#######...#.....#..#...#..#.#.#..##....#..##..##.##.#.#.......###......##.#
|
||||||
|
.##.###.###.#.##.##..##...#.###.......#..####....##..##.#....###.##...#.###
|
||||||
|
##...#...#.##..#......##..#..#..##..#..##.#..#.#.#.#######...###.......#...
|
||||||
|
#..##.#..#.#.#..#.###..##....##.#.#..##.##.#.##.###.##..##.#######....#.#.#
|
||||||
|
..#....#.##...###.#...#.#######.##....#####.####....####..####.##..###..#..
|
||||||
|
##........##.#.####..#..##.###.#..#...#..##.#.##.###...#...##.#.#..#..#..##
|
||||||
|
.##.....##.#..#.#..#....#.#.#####.###..###...##.#.##..##..#####..##.##..##.
|
||||||
|
#........#.#..###.######..#.##...##.#....#.#.#####.#.#.##..##.#.##..###...#
|
||||||
|
...#..#..##.##..#.#...#.####..#...###...##.#..#....##.##.#.#..#.###.....##.
|
||||||
|
.#.#.#.######.#..#######..##.#.#.#..##..###.##.#.##.#..#.##.##...####.##.##
|
||||||
|
..####....####..#.....##.#.#...##..#.###..#.##.##.####...#.....#..##..###.#
|
||||||
|
....######.##.###.##.#.###....#.#.#..#...#..##..#...####..#....#....##...##
|
||||||
|
###.#..#..######.#...###....##...#.##.......##.#.##.#.#......##...#..#..#..
|
||||||
|
#.#...#.###.#.##.#####.#.##..###.#..#.#.######..#..###...###..#.##....##.##
|
||||||
|
#.#.....#..#.####.....####..#.#.###.#.....#.###....###.#.#.##..###.##....##
|
||||||
|
#.#..##.#..###...##..#.##.....###.#.##..#.#....###....##..#..#..#.##....#..
|
||||||
|
..###...#......##.......##.####..#....#..#....##...##..##.#.#######.#.####.
|
||||||
|
.####.#.##.#.####...#...#.##....##...#..#..##..###.####.....###......#.##.#
|
||||||
|
.####.###..#..#...#..####.##.....#....#..#..##......###......#..##.#.##..#.
|
||||||
|
###.....#.###..######...###.###.#...####.##..#.#.#.##.####.###.#...#.##....
|
||||||
|
.###.#.##....##.#####.#.......#...#..#......##.######.####.####.###.###..#.
|
||||||
|
##.##.#..#..###.###.#.#...#.##.#..#.###.##.#.#.###..#.#...##.##.###.#.#...#
|
||||||
|
#####.#...##.#..##.##...###..#....####..##..##...#.#..##.#.#...##..###.##.#
|
||||||
|
.#...#..#.#.#.#.#...###.........###..#..##....###.####..#.#.#####.#.#...#.#
|
||||||
|
..#####.#..#...#.###...###..##......##..##.##....#####..##.####..#....##.#.
|
||||||
|
#.#.....###.#.#.###.#####.##..######.#.##..########...##.....####....###...
|
||||||
|
..##.#.#.#..#.#.##.##.#...###....##.#.#....##.####.#.#.#.######.#.#.#.####.
|
||||||
|
#.##.#....##.#..####......##.#.##.#.#.#########.#.##...###.#........#.#....
|
||||||
|
....##.#..##.##.##..#.#.####..####.#..####.##.##.#....#..#.#..#####..###...
|
||||||
|
.##.#....###....###.#..##..####.#.#....####.###.#..#.###...#...#..##.######
|
||||||
|
.......#.#..##.#..###.#.####..####.##..#.##.####.#.###..#.#.####.#.###...##
|
||||||
|
####.#.#...##......#..#.##.##.###.####..##...####..#...###...##.###...#...#
|
||||||
|
#.#......#.#..#.##....##.#.##.#.#..#.#.##.##.#.##...##...#.#.#......#..#.#.
|
||||||
|
..####.###...##..##.####....##.#.#.#.####..##..#.###.###...####..#.....#..#
|
||||||
|
..###..#....##.#..####.#..####.##.#####..######.#...###....##.....#..##.#..
|
||||||
|
####.###.#....###..#...#.#...#..##..#.#...#.##.##.####.##.##.##.##..#..#...
|
||||||
|
..#.##.....#.#.#.###...#.####.#####.#.#...#.....###....##.#.##..####.#..#..
|
||||||
|
#..##.####.####.##..##.####.#..##.#....##.#.##..###.###.####.#.##.##...##..
|
||||||
|
#.#....#..######...##.##......#.#...#####.#.##.#..#####..#..##....#...#.###
|
||||||
|
.#.#..##.#..##.#...##.#..####.##..#...##..#.#.#..##.####...#.......##..#.##
|
||||||
|
#.#.#..####.##.#.#......###..##.##..#.#.##.##..##.###.#..####.#..##..###.##
|
||||||
|
##.##.#......#.#..#.##.#..###.#.#....##..##.#..###..#........###..#.#..#.#.
|
||||||
|
##..##..###..##.#.####.#..###.....#...####.##...#...##.######.#.#.##.#...#.
|
||||||
|
.#..##..#...##......####...##.#.##...##.###.#.##..#..###.##.....#...#.##..#
|
||||||
|
#..#....#...#...#...#..#.#.#..#.####....#.#.#...##.#...#..###..#####.#...#.
|
||||||
|
.#....#..#.####.#####.#....######....#.#####....#.##.##.#...#.#....#.....#.
|
||||||
|
#.#####..###.##.#.#..#..#...######...#.###.##.##...##.#.#.#.#.##.##...#..#.
|
||||||
|
#.#..#.....####.##......##...##..###.#.##.#..#.#.##..#...##.##.##...#...##.
|
||||||
|
####..##..##.##....##.##.####.....###.#####.###.#####....#####.#.#..##.#.##
|
||||||
|
##.#..###.#.#.#######..#..##.#..#........#.##.#..#....##...#.####..#.#.....
|
||||||
|
.#..#.######.#.###.########..#..####.##...#.#.####..##..##.#...##.#...#....
|
||||||
|
#######...#...###.##.#.#.#....##.#..####.#.##..##.######..#.####..#..#..##.
|
||||||
|
####.#..#####.......#...###.....##.#.########..#..#####.##.##.##.#.##.#...#
|
||||||
|
####.#.....#.##.#.#...#####.###.####.####.####....#..#........#######.####.
|
||||||
|
.#.#..#.#.#.#.##.###...##....##.#.#...#.#..####.#####..##...###.#.##.#..##.
|
||||||
|
#.##.#.##.#...#..#..#..##....#.##.###...#.#..##....#....###.#..#.#####.#...
|
||||||
|
.#.##..###.##..#######.#..#.##......###..####..##.##....#...#.#.#...#.###.#
|
||||||
|
#..#..#.###.##......#...###.#.#..##...##.#..#.#.#.####.#....#.###..####..##
|
||||||
|
...##.#..#...#.#.#.#...#.#...##.#..##..#...##..#..####.....##..###.#..##...
|
||||||
|
#.####.##....####.#.#.##.##...###..#......#####.....###....#.###..##...#.##
|
||||||
|
####..##..#..##..#...###.##..###.##..#.#..###...#...##.#.#..#...#..##.....#
|
||||||
|
#.##.#.##.#....#.#...##.##...#.##......###...##.#.#...####....#.#...#...#.#
|
||||||
|
#.#.##...####...##.###.#######.#.##..#.#..###..##.##.##....#.....#..#.#....
|
7
res/23/test-input.txt
Normal file
7
res/23/test-input.txt
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
....#..
|
||||||
|
..###.#
|
||||||
|
#...#.#
|
||||||
|
.#...##
|
||||||
|
#.###..
|
||||||
|
##.#.##
|
||||||
|
.#..#..
|
171
src/days/d23.rs
Normal file
171
src/days/d23.rs
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
use std::{collections::HashMap, fs};
|
||||||
|
|
||||||
|
const OFFSET: usize = 500;
|
||||||
|
|
||||||
|
pub fn solve() {
|
||||||
|
let path = "res/23/input.txt";
|
||||||
|
|
||||||
|
let contents = fs::read_to_string(path).expect("I/O error, wrong path?");
|
||||||
|
|
||||||
|
let read_grid: Vec<Vec<bool>> = contents
|
||||||
|
.lines()
|
||||||
|
.filter(|&line| line != "")
|
||||||
|
.map(|line| {
|
||||||
|
line.chars()
|
||||||
|
.map(|c| match c {
|
||||||
|
'.' => false,
|
||||||
|
'#' => true,
|
||||||
|
_ => std::unreachable!(),
|
||||||
|
})
|
||||||
|
.collect::<Vec<bool>>()
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut grid = vec![vec![false; read_grid[0].len() + 2 * OFFSET]; read_grid.len() + 2 * OFFSET];
|
||||||
|
for (y, line) in read_grid.iter().enumerate() {
|
||||||
|
for (x, val) in line.iter().enumerate() {
|
||||||
|
if *val {
|
||||||
|
grid[y + OFFSET][x + OFFSET] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// run 10 rounds
|
||||||
|
for i in 0..10 {
|
||||||
|
run_round(&mut grid, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut min_y = grid.len();
|
||||||
|
let mut max_y = 0usize;
|
||||||
|
let mut min_x = grid[0].len();
|
||||||
|
let mut max_x = 0usize;
|
||||||
|
let mut elf_counter = 0;
|
||||||
|
for (y, line) in grid.iter().enumerate() {
|
||||||
|
for (x, val) in line.iter().enumerate() {
|
||||||
|
if *val {
|
||||||
|
min_y = min_y.min(y);
|
||||||
|
max_y = max_y.max(y);
|
||||||
|
min_x = min_x.min(x);
|
||||||
|
max_x = max_x.max(x);
|
||||||
|
elf_counter += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let res = (max_y - min_y + 1) * (max_x - min_x + 1) - elf_counter;
|
||||||
|
println!("Result 1: {res}");
|
||||||
|
|
||||||
|
// task 2
|
||||||
|
let mut round = 10;
|
||||||
|
while run_round(&mut grid, round) != 0 {
|
||||||
|
round += 1;
|
||||||
|
}
|
||||||
|
println!("Result 2: {}", round + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_pos(y: usize, x: usize, round: i32, grid: &Vec<Vec<bool>>) -> Option<(usize, usize)> {
|
||||||
|
if !grid[y][x] {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut elf_adjacent = false;
|
||||||
|
for yi in -1..=1 {
|
||||||
|
for xi in -1..=1 {
|
||||||
|
if (xi != 0 || yi != 0) && grid[(y as i64 + yi) as usize][(x as i64 + xi) as usize] {
|
||||||
|
elf_adjacent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !elf_adjacent {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let north: Vec<(i64, i64)> = vec![(-1, -1), (-1, 0), (-1, 1)];
|
||||||
|
let south: Vec<(i64, i64)> = vec![(1, -1), (1, 0), (1, 1)];
|
||||||
|
let west: Vec<(i64, i64)> = vec![(-1, -1), (0, -1), (1, -1)];
|
||||||
|
let east: Vec<(i64, i64)> = vec![(-1, 1), (0, 1), (1, 1)];
|
||||||
|
|
||||||
|
let order = match round % 4 {
|
||||||
|
0 => {
|
||||||
|
// north
|
||||||
|
vec![north, south, west, east]
|
||||||
|
}
|
||||||
|
1 => {
|
||||||
|
// south
|
||||||
|
vec![south, west, east, north]
|
||||||
|
}
|
||||||
|
2 => {
|
||||||
|
// west
|
||||||
|
vec![west, east, north, south]
|
||||||
|
}
|
||||||
|
3 => {
|
||||||
|
// east
|
||||||
|
vec![east, north, south, west]
|
||||||
|
}
|
||||||
|
_ => std::unreachable!(),
|
||||||
|
};
|
||||||
|
|
||||||
|
for dir in order {
|
||||||
|
if grid[(y as i64 + dir[0].0) as usize][(x as i64 + dir[0].1) as usize] {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if grid[(y as i64 + dir[1].0) as usize][(x as i64 + dir[1].1) as usize] {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if grid[(y as i64 + dir[2].0) as usize][(x as i64 + dir[2].1) as usize] {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return Some((
|
||||||
|
(y as i64 + dir[1].0) as usize,
|
||||||
|
(x as i64 + dir[1].1) as usize,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Runs a round, returns how many elves moved
|
||||||
|
fn run_round(grid: &mut Vec<Vec<bool>>, round: i32) -> usize {
|
||||||
|
let mut changes_map = HashMap::<(usize, usize), Vec<(usize, usize)>>::new();
|
||||||
|
|
||||||
|
for (y, line) in grid.iter().enumerate() {
|
||||||
|
for (x, _) in line.iter().enumerate() {
|
||||||
|
match new_pos(y, x, round, &grid) {
|
||||||
|
Some((new_y, new_x)) => {
|
||||||
|
if changes_map.contains_key(&(new_y, new_x)) {
|
||||||
|
changes_map.get_mut(&(new_y, new_x)).unwrap().push((y, x));
|
||||||
|
} else {
|
||||||
|
changes_map.insert((new_y, new_x), vec![(y, x)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut elf_move_counter = 0usize;
|
||||||
|
|
||||||
|
for (pos, old_pos_vec) in changes_map {
|
||||||
|
// if only one elf wants to go to position
|
||||||
|
if old_pos_vec.len() == 1 {
|
||||||
|
grid[old_pos_vec[0].0][old_pos_vec[0].1] = false;
|
||||||
|
grid[pos.0][pos.1] = true;
|
||||||
|
elf_move_counter += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return elf_move_counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _print_grid(grid: &Vec<Vec<bool>>) {
|
||||||
|
for y in grid.iter() {
|
||||||
|
for x in y.iter() {
|
||||||
|
match *x {
|
||||||
|
true => print!("#"),
|
||||||
|
false => print!("."),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!()
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
pub mod days;
|
pub mod days;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
days::d21::solve()
|
days::d23::solve()
|
||||||
//_all_days()
|
//_all_days()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue