add initial data

This commit is contained in:
timeshifter committed 2026-09-04 16:08:03 +02:00
commit c4e841b4bc
43 files changed
+5284

No files matched your search

+7
View File
@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "aoc11"
version = "0.1.0"
+8
View File
@@ -0,0 +1,8 @@
[package]
name = "aoc11"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+10
View File
@@ -0,0 +1,10 @@
5483143223
2745854711
5264556173
6141336146
6357385478
4167524645
2176841721
6882881134
4846848554
5283751526
+10
View File
@@ -0,0 +1,10 @@
4112256372
3143253712
4516848631
3783477137
3746723582
5861358884
4843351774
2316447621
6643817745
6366815868
+169
View File
@@ -0,0 +1,169 @@
use std::{collections::HashSet, fs};
const NEIGHBOUR_INDICES: [isize; 3] = [-1, 0, 1];
struct Grid {
data: Vec<Vec<u32>>,
nx: usize,
ny: usize,
flashes: usize,
}
impl Grid {
fn from_file(filename: &str) -> Self {
let data: Vec<Vec<_>> = fs::read_to_string(filename)
.unwrap()
.split_whitespace()
.map(|line| line.chars().map(|c| c.to_digit(10).unwrap()).collect())
.collect();
let nx = data[0].len();
let ny = data.len();
let flashes = 0;
Grid {
data,
nx,
ny,
flashes,
}
}
fn iterate(&mut self) {
self.increment_all_by_one();
self.flash_where_level_above_nine();
self.reset_flashed();
}
fn print(&self) {
for y in 0..self.ny {
for x in 0..self.nx {
let val = self.data[y][x];
if val > 9 {
print!(".");
} else {
print!("{}", val);
}
}
println!();
}
}
fn reset_flashed(&mut self) {
for y in 0..self.ny {
for x in 0..self.nx {
if self.data[y][x] > 9 {
self.data[y][x] = 0;
}
}
}
}
fn increment_all_by_one(&mut self) {
for y in 0..self.ny {
for x in 0..self.nx {
self.data[y][x] += 1;
}
}
}
#[allow(clippy::all)]
fn flash_where_level_above_nine(&mut self) {
let mut have_flashed = HashSet::new();
loop {
let mut increased = 0;
for y in 0..self.ny {
for x in 0..self.nx {
if self.data[y][x] > 9 && !have_flashed.contains(&(y, x)) {
have_flashed.insert((y, x));
self.flashes += 1;
increased += self.increase_neighbors_by_one(&x, &y);
}
}
}
if increased == 0 {
break;
}
}
}
fn increase_neighbors_by_one(&mut self, x: &usize, y: &usize) -> i32 {
let mut increased = 0;
for (ox, oy) in self.get_neighbours(x, y) {
self.data[oy][ox] += 1;
increased += 1;
}
increased
}
fn get_neighbours(&self, x: &usize, y: &usize) -> Vec<(usize, usize)> {
let mut result = vec![];
for dx in NEIGHBOUR_INDICES {
for dy in NEIGHBOUR_INDICES {
let ox = (*x as isize) + dx;
let oy = (*y as isize) + dy;
if ox < 0
|| oy < 0
|| ox >= self.nx as isize
|| oy >= self.ny as isize
|| (dx == 0 && dy == 0)
{
continue;
}
result.push((ox as usize, oy as usize));
}
}
result
}
}
fn main() {
let mut grid = Grid::from_file("input.txt");
grid.print();
println!();
let mut i = 0;
for _ in 0..100 {
grid.iterate();
i += 1;
}
grid.print();
println!();
println!("{}", grid.flashes);
loop {
let before = grid.flashes;
grid.iterate();
let after = grid.flashes;
i += 1;
if after - before == grid.nx * grid.ny {
println!();
println!("{i}");
break;
}
}
}
#[cfg(test)]
mod test {
use crate::Grid;
#[test]
fn get_neighbours() {
let data = vec![
vec![1, 1, 1, 1],
vec![1, 1, 1, 1],
vec![1, 1, 1, 1],
vec![1, 1, 1, 1],
];
let nx = 4;
let ny = 4;
let grid = Grid {
data,
nx,
ny,
flashes: 0,
};
println!("{:?}\n", grid.get_neighbours(&1, &1));
println!("{:?}\n", grid.get_neighbours(&2, &2));
println!("{:?}\n", grid.get_neighbours(&0, &0));
}
}