This commit is contained in:
JonOfUs 2022-12-24 14:38:11 +01:00
parent c09a7236cd
commit 4eb30db283
4 changed files with 254 additions and 1 deletions

75
res/23/input.txt Normal file
View file

@ -0,0 +1,75 @@
.###....#####.#..###..##..##.######.....##.....#..#.##.#.##..##..#.#.######
####.###...#..#...#......####.#.#..#...####....#...#....###.....###.#..#...
##..#.#...##.##..#.##.#####..#....#...####.#.####.#...###.####..#...#.#....
.#.###.#....##.#.##..#..###......#..#..###....#.##......#..#..#..#.###..##.
...#.###.#.#.#####..##....###.#...###.###..#...#..##........#..#...##.#....
.#.##.##...#.##.#.......###..#.##..#.##..######...##.####.###...#.########.
.####.#.#.#.#...#..#..#####.#.####...#.##.###..#.....###......###...#...#.#
..###.##..#..#.#.....#.##...#....#..##...###.###.#...####.#..#.#.##..##..#.
#.#####..#..##..#...####.####.#..#......##..#####.####.####....###..##..#..
.#.###..#####.#...##..#.#.##.##...####.#.##.#..##...###.#.##.#....##.####..
..##.#..##.#.##.##.#.####..#.#.#####...#......##...#.#..###.#..#...#.####.#
..#...#..#..#.###.###..#.#####..#..#....###...###.##.#...#..#######.##.##.#
#######...#.....#..#...#..#.#.#..##....#..##..##.##.#.#.......###......##.#
.##.###.###.#.##.##..##...#.###.......#..####....##..##.#....###.##...#.###
##...#...#.##..#......##..#..#..##..#..##.#..#.#.#.#######...###.......#...
#..##.#..#.#.#..#.###..##....##.#.#..##.##.#.##.###.##..##.#######....#.#.#
..#....#.##...###.#...#.#######.##....#####.####....####..####.##..###..#..
##........##.#.####..#..##.###.#..#...#..##.#.##.###...#...##.#.#..#..#..##
.##.....##.#..#.#..#....#.#.#####.###..###...##.#.##..##..#####..##.##..##.
#........#.#..###.######..#.##...##.#....#.#.#####.#.#.##..##.#.##..###...#
...#..#..##.##..#.#...#.####..#...###...##.#..#....##.##.#.#..#.###.....##.
.#.#.#.######.#..#######..##.#.#.#..##..###.##.#.##.#..#.##.##...####.##.##
..####....####..#.....##.#.#...##..#.###..#.##.##.####...#.....#..##..###.#
....######.##.###.##.#.###....#.#.#..#...#..##..#...####..#....#....##...##
###.#..#..######.#...###....##...#.##.......##.#.##.#.#......##...#..#..#..
#.#...#.###.#.##.#####.#.##..###.#..#.#.######..#..###...###..#.##....##.##
#.#.....#..#.####.....####..#.#.###.#.....#.###....###.#.#.##..###.##....##
#.#..##.#..###...##..#.##.....###.#.##..#.#....###....##..#..#..#.##....#..
..###...#......##.......##.####..#....#..#....##...##..##.#.#######.#.####.
.####.#.##.#.####...#...#.##....##...#..#..##..###.####.....###......#.##.#
.####.###..#..#...#..####.##.....#....#..#..##......###......#..##.#.##..#.
###.....#.###..######...###.###.#...####.##..#.#.#.##.####.###.#...#.##....
.###.#.##....##.#####.#.......#...#..#......##.######.####.####.###.###..#.
##.##.#..#..###.###.#.#...#.##.#..#.###.##.#.#.###..#.#...##.##.###.#.#...#
#####.#...##.#..##.##...###..#....####..##..##...#.#..##.#.#...##..###.##.#
.#...#..#.#.#.#.#...###.........###..#..##....###.####..#.#.#####.#.#...#.#
..#####.#..#...#.###...###..##......##..##.##....#####..##.####..#....##.#.
#.#.....###.#.#.###.#####.##..######.#.##..########...##.....####....###...
..##.#.#.#..#.#.##.##.#...###....##.#.#....##.####.#.#.#.######.#.#.#.####.
#.##.#....##.#..####......##.#.##.#.#.#########.#.##...###.#........#.#....
....##.#..##.##.##..#.#.####..####.#..####.##.##.#....#..#.#..#####..###...
.##.#....###....###.#..##..####.#.#....####.###.#..#.###...#...#..##.######
.......#.#..##.#..###.#.####..####.##..#.##.####.#.###..#.#.####.#.###...##
####.#.#...##......#..#.##.##.###.####..##...####..#...###...##.###...#...#
#.#......#.#..#.##....##.#.##.#.#..#.#.##.##.#.##...##...#.#.#......#..#.#.
..####.###...##..##.####....##.#.#.#.####..##..#.###.###...####..#.....#..#
..###..#....##.#..####.#..####.##.#####..######.#...###....##.....#..##.#..
####.###.#....###..#...#.#...#..##..#.#...#.##.##.####.##.##.##.##..#..#...
..#.##.....#.#.#.###...#.####.#####.#.#...#.....###....##.#.##..####.#..#..
#..##.####.####.##..##.####.#..##.#....##.#.##..###.###.####.#.##.##...##..
#.#....#..######...##.##......#.#...#####.#.##.#..#####..#..##....#...#.###
.#.#..##.#..##.#...##.#..####.##..#...##..#.#.#..##.####...#.......##..#.##
#.#.#..####.##.#.#......###..##.##..#.#.##.##..##.###.#..####.#..##..###.##
##.##.#......#.#..#.##.#..###.#.#....##..##.#..###..#........###..#.#..#.#.
##..##..###..##.#.####.#..###.....#...####.##...#...##.######.#.#.##.#...#.
.#..##..#...##......####...##.#.##...##.###.#.##..#..###.##.....#...#.##..#
#..#....#...#...#...#..#.#.#..#.####....#.#.#...##.#...#..###..#####.#...#.
.#....#..#.####.#####.#....######....#.#####....#.##.##.#...#.#....#.....#.
#.#####..###.##.#.#..#..#...######...#.###.##.##...##.#.#.#.#.##.##...#..#.
#.#..#.....####.##......##...##..###.#.##.#..#.#.##..#...##.##.##...#...##.
####..##..##.##....##.##.####.....###.#####.###.#####....#####.#.#..##.#.##
##.#..###.#.#.#######..#..##.#..#........#.##.#..#....##...#.####..#.#.....
.#..#.######.#.###.########..#..####.##...#.#.####..##..##.#...##.#...#....
#######...#...###.##.#.#.#....##.#..####.#.##..##.######..#.####..#..#..##.
####.#..#####.......#...###.....##.#.########..#..#####.##.##.##.#.##.#...#
####.#.....#.##.#.#...#####.###.####.####.####....#..#........#######.####.
.#.#..#.#.#.#.##.###...##....##.#.#...#.#..####.#####..##...###.#.##.#..##.
#.##.#.##.#...#..#..#..##....#.##.###...#.#..##....#....###.#..#.#####.#...
.#.##..###.##..#######.#..#.##......###..####..##.##....#...#.#.#...#.###.#
#..#..#.###.##......#...###.#.#..##...##.#..#.#.#.####.#....#.###..####..##
...##.#..#...#.#.#.#...#.#...##.#..##..#...##..#..####.....##..###.#..##...
#.####.##....####.#.#.##.##...###..#......#####.....###....#.###..##...#.##
####..##..#..##..#...###.##..###.##..#.#..###...#...##.#.#..#...#..##.....#
#.##.#.##.#....#.#...##.##...#.##......###...##.#.#...####....#.#...#...#.#
#.#.##...####...##.###.#######.#.##..#.#..###..##.##.##....#.....#..#.#....

7
res/23/test-input.txt Normal file
View file

@ -0,0 +1,7 @@
....#..
..###.#
#...#.#
.#...##
#.###..
##.#.##
.#..#..

171
src/days/d23.rs Normal file
View 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!();
}

View file

@ -1,7 +1,7 @@
pub mod days; pub mod days;
fn main() { fn main() {
days::d21::solve() days::d23::solve()
//_all_days() //_all_days()
} }