add day 18

This commit is contained in:
timeshifter
2026-06-24 22:09:34 +02:00
parent 92f55dce26
commit d80a0fb576
4 changed files with 213 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
//! <https://adventofcode.com/2015/day/18>
fn main() {
let mut grid = std::fs::read_to_string("input.txt")
.unwrap()
.lines()
.map(|l| {
l.chars()
.map(|c| match c {
'#' => 1,
'.' => 0,
_ => panic!(),
})
.collect::<Vec<_>>()
})
.collect::<Vec<_>>();
part1(grid.clone()); // 1061
grid[0][0] = 1;
grid[99][0] = 1;
grid[0][99] = 1;
grid[99][99] = 1;
part2(grid)
}
fn part2(mut grid: Vec<Vec<i32>>) {
for _ in 0..100 {
let mut new_grid = vec![vec![0; 100]; 100];
for x in 0..100 {
for y in 0..100 {
let neighbor_count = get_neighbor_count(&grid, x, y);
if grid[x][y] == 1 && [2, 3].contains(&neighbor_count) {
new_grid[x][y] = 1;
}
if grid[x][y] == 0 && neighbor_count == 3 {
new_grid[x][y] = 1;
}
}
}
new_grid[0][0] = 1;
new_grid[99][0] = 1;
new_grid[0][99] = 1;
new_grid[99][99] = 1;
std::mem::swap(&mut grid, &mut new_grid);
}
let result = grid.iter().flatten().sum::<i32>();
println!("{result}");
}
fn part1(mut grid: Vec<Vec<i32>>) {
for _ in 0..100 {
let mut new_grid = vec![vec![0; 100]; 100];
for x in 0..100 {
for y in 0..100 {
let neighbor_count = get_neighbor_count(&grid, x, y);
if grid[x][y] == 1 && [2, 3].contains(&neighbor_count) {
new_grid[x][y] = 1;
}
if grid[x][y] == 0 && neighbor_count == 3 {
new_grid[x][y] = 1;
}
}
}
std::mem::swap(&mut grid, &mut new_grid);
}
let result = grid.iter().flatten().sum::<i32>();
println!("{result}");
}
fn get_neighbor_count(grid: &[Vec<i32>], x: usize, y: usize) -> i32 {
let mut neighbor_count = 0;
for xd in [-1, 0, 1] {
for yd in [-1, 0, 1] {
if xd == 0 && yd == 0 {
continue;
}
let xc = (x as isize) + xd;
let yc = (y as isize) + yd;
if !(0..100).contains(&xc) || !(0..100).contains(&yc) {
continue;
}
let xc = xc as usize;
let yc = yc as usize;
if grid[xc][yc] == 1 {
neighbor_count += 1;
}
}
}
neighbor_count
}