add initial data
This commit is contained in:
commit
c4e841b4bc
43 files changed
+5284
No files matched your search
Generated
+7
@@ -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"
|
||||
@@ -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]
|
||||
@@ -0,0 +1,10 @@
|
||||
5483143223
|
||||
2745854711
|
||||
5264556173
|
||||
6141336146
|
||||
6357385478
|
||||
4167524645
|
||||
2176841721
|
||||
6882881134
|
||||
4846848554
|
||||
5283751526
|
||||
@@ -0,0 +1,10 @@
|
||||
4112256372
|
||||
3143253712
|
||||
4516848631
|
||||
3783477137
|
||||
3746723582
|
||||
5861358884
|
||||
4843351774
|
||||
2316447621
|
||||
6643817745
|
||||
6366815868
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user