add day 18
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user