|
fn input() -> [u8; 100] { |
|
let input = include_str!("input.txt"); |
|
let mut ret = [0; 100]; |
|
|
|
let mut idx: usize = 0; |
|
for c in input.chars() { |
|
if c != '\n' { |
|
ret[idx] = (c as u8) - ('0' as u8); |
|
idx += 1; |
|
} |
|
} |
|
|
|
return ret; |
|
} |
|
|
|
#[derive(Clone, Copy)] |
|
struct Position { |
|
row: i32, |
|
col: i32, |
|
} |
|
|
|
#[inline(always)] |
|
fn stuff(pos: Position, ret: &mut i32, arr: &mut [u8; 100]) { |
|
if pos.row < 0 || pos.row > 9 || pos.col < 0 || pos.col > 9 { |
|
return; |
|
} |
|
|
|
let idx = (pos.row * 10 + pos.col) as usize; |
|
if arr[idx] == 0 { |
|
return; |
|
} |
|
arr[idx] += 1; |
|
|
|
if arr[idx] > 9 { |
|
*ret += 1; |
|
arr[idx] = 0; |
|
*ret += traverse(0, pos, arr); |
|
} |
|
} |
|
|
|
|
|
fn traverse(acc: i32, starting_pos: Position, arr: &mut [u8; 100]) -> i32 { |
|
let Position { row: sr, col: sc } = starting_pos; |
|
|
|
let mut ret = acc; |
|
stuff(Position { row: sr - 1, col: sc - 1, }, &mut ret, arr); |
|
stuff(Position { row: sr - 1, col: sc, }, &mut ret, arr); // top middle |
|
stuff(Position { row: sr - 1, col: sc + 1, }, &mut ret, arr); // top right |
|
|
|
stuff(Position { row: sr, col: sc - 1, }, &mut ret, arr); // left |
|
stuff(Position { row: sr, col: sc + 1, }, &mut ret, arr); // right |
|
|
|
stuff(Position { row: sr + 1, col: sc - 1, }, &mut ret, arr); // bottom left |
|
stuff(Position { row: sr + 1, col: sc, }, &mut ret, arr); // bottom middle |
|
stuff(Position { row: sr + 1, col: sc + 1, }, &mut ret, arr); // bottom right |
|
|
|
return ret; |
|
} |
|
|
|
fn run_step(v: &mut [u8; 100]) -> i32 { |
|
let mut flashes = 0; |
|
let mut positions = Vec::with_capacity(10); |
|
|
|
for row in 0..10 { |
|
for col in 0..10 { |
|
let idx = (row * 10 + col) as usize; |
|
v[idx] += 1; |
|
|
|
if v[idx] > 9 { |
|
flashes += 1; |
|
v[idx] = 0; |
|
positions.push(Position { row: row as i32, col: col as i32 }); |
|
} |
|
} |
|
} |
|
|
|
for pos in positions { |
|
flashes += traverse(0, pos, v); |
|
} |
|
|
|
return flashes; |
|
} |
|
|
|
fn main() { |
|
let input = input(); |
|
|
|
for _ in 0..1000 { |
|
let mut input = input; |
|
let mut flashes = 0; |
|
|
|
for _ in 0..100 { |
|
flashes += run_step(&mut input); |
|
} |
|
|
|
let mut step = 100; |
|
let mut num_flashed = 0; |
|
while num_flashed != 100 { |
|
num_flashed = run_step(&mut input); |
|
step += 1; |
|
} |
|
} |
|
} |