This commit is contained in:
2025-12-04 23:15:17 +01:00
parent 949f0993e5
commit 6bef9799b9
2 changed files with 122 additions and 1 deletions

120
src/day4.rs Normal file
View File

@@ -0,0 +1,120 @@
#[aoc(day4, part1)]
pub fn part1(input: &str) -> u32 {
let array = make_array(&input);
get_accessible(&array)
.iter()
.flatten()
.fold(0, |acc, x| acc + (*x as u32))
}
#[aoc(day4, part2)]
pub fn part2(input: &str) -> u32 {
let mut array = make_array(&input);
remove_accessible(&mut array)
}
fn make_array(input: &str) -> Vec<Vec<u8>> {
let n = input.split("\n").next().unwrap().len();
let m = input.split("\n").count();
// Top row padded with 0s for convenience and performance
let mut array = vec![vec![0_u8; m + 2]; n + 2];
for (i, line) in input.split("\n").enumerate() {
for (j, ch) in line.chars().enumerate() {
if ch == '@' {
array[i + 1][j + 1] = 1;
}
}
}
// println!("{:?}", array);
array
}
fn get_accessible(array: &Vec<Vec<u8>>) -> Vec<Vec<u8>> {
let n = array.len();
let m = array[0].len();
let mut accessible = vec![vec![0_u8; m - 2]; n - 2];
for i in 1..n - 1 {
for j in 1..m - 1 {
accessible[i - 1][j - 1] = array[i][j]
* ((array[i - 1][j - 1]
+ array[i - 1][j]
+ array[i - 1][j + 1]
+ array[i][j - 1]
+ array[i][j + 1]
+ array[i + 1][j - 1]
+ array[i + 1][j]
+ array[i + 1][j + 1])
< 4) as u8;
}
}
// println!("{:?}", accessible);
accessible
}
fn remove_accessible(rolls: &mut Vec<Vec<u8>>) -> u32 {
let n = rolls.len();
let m = rolls[0].len();
let mut removed: u32 = 0;
loop {
let mut removed_new: u32 = 0;
let accessible = get_accessible(rolls);
for i in 0..n - 2 {
for j in 0..m - 2 {
rolls[i + 1][j + 1] = rolls[i + 1][j + 1] - accessible[i][j];
removed_new = removed_new + accessible[i][j] as u32;
}
}
if removed_new == 0 {
break;
}
removed = removed + removed_new;
}
removed
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part2_1() {
let input = String::from(
"..@@.@@@@.
@@@.@.@.@@
@@@@@.@.@@
@.@@@@..@.
@@.@@@@.@@
.@@@@@@@.@
.@.@.@.@@@
@.@@@.@@@@
.@@@@@@@@.
@.@.@@@.@.",
);
assert_eq!(part2(&input), 43)
}
#[test]
fn test_part1_1() {
let input = String::from(
"..@@.@@@@.
@@@.@.@.@@
@@@@@.@.@@
@.@@@@..@.
@@.@@@@.@@
.@@@@@@@.@
.@.@.@.@@@
@.@@@.@@@@
.@@@@@@@@.
@.@.@@@.@.",
);
assert_eq!(part1(&input), 13)
}
}

View File

@@ -5,6 +5,7 @@ extern crate aoc_runner_derive;
// pub mod day1;
// pub mod day2;
pub mod day3;
// pub mod day3;
pub mod day4;
aoc_lib! { year = 2025 }