Day 11
This commit is contained in:
parent
e67bc5d080
commit
a3bb9bbbb3
@ -42,3 +42,7 @@ path = "src/day9.rs"
|
|||||||
[[bin]]
|
[[bin]]
|
||||||
name = "day10"
|
name = "day10"
|
||||||
path = "src/day10.rs"
|
path = "src/day10.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "day11"
|
||||||
|
path = "src/day11.rs"
|
||||||
|
10
inputs/day11.txt
Normal file
10
inputs/day11.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
5665114554
|
||||||
|
4882665427
|
||||||
|
6185582113
|
||||||
|
7762852744
|
||||||
|
7255621841
|
||||||
|
8842753123
|
||||||
|
8225372176
|
||||||
|
7212865827
|
||||||
|
7758751157
|
||||||
|
1828544563
|
114
src/day11.rs
Normal file
114
src/day11.rs
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
use std::collections::HashSet;
|
||||||
|
|
||||||
|
fn square(x: usize, y: usize) -> Vec<(usize, usize)> {
|
||||||
|
let mut sq = Vec::new();
|
||||||
|
if y > 0 {
|
||||||
|
if x > 0 {
|
||||||
|
sq.push((x - 1, y - 1))
|
||||||
|
}
|
||||||
|
sq.push((x, y - 1));
|
||||||
|
if x < 9 {
|
||||||
|
sq.push((x + 1, y - 1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if x > 0 {
|
||||||
|
sq.push((x - 1, y))
|
||||||
|
}
|
||||||
|
if x < 9 {
|
||||||
|
sq.push((x + 1, y))
|
||||||
|
}
|
||||||
|
if y < 9 {
|
||||||
|
if x > 0 {
|
||||||
|
sq.push((x - 1, y + 1))
|
||||||
|
}
|
||||||
|
sq.push((x, y + 1));
|
||||||
|
if x < 9 {
|
||||||
|
sq.push((x + 1, y + 1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sq
|
||||||
|
}
|
||||||
|
|
||||||
|
fn step(grid: &mut Vec<Vec<u32>>) -> usize {
|
||||||
|
let mut flashed = HashSet::new();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let mut new_flashes = false;
|
||||||
|
for (y, row) in grid.iter().enumerate() {
|
||||||
|
for (x, octopus) in row.iter().enumerate() {
|
||||||
|
let adjacent = square(x, y)
|
||||||
|
.iter()
|
||||||
|
.filter(|(xx, yy)| flashed.contains(&(*xx, *yy)))
|
||||||
|
.count() as u32;
|
||||||
|
if (octopus + adjacent + 1) >= 10 && !flashed.contains(&(x, y)) {
|
||||||
|
flashed.insert((x, y));
|
||||||
|
new_flashes = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !new_flashes {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (y, row) in grid.iter_mut().enumerate() {
|
||||||
|
for (x, octopus) in row.iter_mut().enumerate() {
|
||||||
|
*octopus = if flashed.contains(&(x, y)) {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
*octopus
|
||||||
|
+ square(x, y)
|
||||||
|
.iter()
|
||||||
|
.filter(|(xx, yy)| flashed.contains(&(*xx, *yy)))
|
||||||
|
.count() as u32
|
||||||
|
+ 1
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flashed.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn total_flashes(input: &str) -> usize {
|
||||||
|
let mut octopuses = input
|
||||||
|
.lines()
|
||||||
|
.map(|line| {
|
||||||
|
line.chars()
|
||||||
|
.map(|c| char::to_digit(c, 10).unwrap())
|
||||||
|
.collect::<Vec<u32>>()
|
||||||
|
})
|
||||||
|
.collect::<Vec<Vec<u32>>>();
|
||||||
|
|
||||||
|
(0..100).fold(0, |acc, _| acc + step(&mut octopuses))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn first_simultaneous_step(input: &str) -> usize {
|
||||||
|
let mut octopuses = input
|
||||||
|
.lines()
|
||||||
|
.map(|line| {
|
||||||
|
line.chars()
|
||||||
|
.map(|c| char::to_digit(c, 10).unwrap())
|
||||||
|
.collect::<Vec<u32>>()
|
||||||
|
})
|
||||||
|
.collect::<Vec<Vec<u32>>>();
|
||||||
|
|
||||||
|
let mut s = 0;
|
||||||
|
loop {
|
||||||
|
s += 1;
|
||||||
|
if step(&mut octopuses) == 100 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
const INPUT: &str = include_str!("../inputs/day11.txt");
|
||||||
|
println!("solution {}", total_flashes(INPUT));
|
||||||
|
println!("solution {}", first_simultaneous_step(INPUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_square() {
|
||||||
|
assert_eq!(square(0, 0), vec![(1, 0), (0, 1), (1, 1)]);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user