Skip to content

Commit cd51cb7

Browse files
committed
solved day 11
1 parent 24049db commit cd51cb7

File tree

5 files changed

+150
-0
lines changed

5 files changed

+150
-0
lines changed

day11/Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

day11/Cargo.toml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "day11"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]

day11/input

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
3322874652
2+
5636588857
3+
7755117548
4+
5854121833
5+
2856682477
6+
3124873812
7+
1541372254
8+
8634383236
9+
2424323348
10+
2265635842

day11/src/main.rs

+115
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
type Board = [u8; 100];
2+
3+
fn parse(fname: &str) -> Board {
4+
std::fs::read_to_string(fname)
5+
.unwrap()
6+
.lines()
7+
.map(|l| {
8+
l.chars()
9+
.map(|c| c.to_digit(10).unwrap() as u8)
10+
.collect::<Vec<u8>>()
11+
})
12+
.flatten()
13+
.collect::<Vec<u8>>()
14+
.try_into()
15+
.unwrap()
16+
}
17+
18+
fn adjacents(i: usize) -> Vec<usize> {
19+
let x = i % 10;
20+
let y = i / 10;
21+
let mut adjs = Vec::new();
22+
if (y > 0) && (x > 0) {
23+
adjs.push(i - 11);
24+
}
25+
if y > 0 {
26+
adjs.push(i - 10);
27+
}
28+
if (y > 0) && (x < 9) {
29+
adjs.push(i - 9)
30+
}
31+
if x > 0 {
32+
adjs.push(i - 1);
33+
}
34+
if x < 9 {
35+
adjs.push(i + 1);
36+
}
37+
if (y < 9) && (x > 0) {
38+
adjs.push(i + 9);
39+
}
40+
if y < 9 {
41+
adjs.push(i + 10);
42+
}
43+
if (y < 9) && (x < 9) {
44+
adjs.push(i + 11);
45+
}
46+
adjs
47+
}
48+
49+
fn step(b: Board) -> (Board, Vec<usize>) {
50+
let mut flashes = Vec::new();
51+
let mut next = [0u8; 100];
52+
for i in 0..100 {
53+
next[i] = b[i] + 1;
54+
}
55+
while next
56+
.iter()
57+
.enumerate()
58+
.any(|(i, &x)| (x > 9) && (!flashes.contains(&i)))
59+
{
60+
for (i, x) in next.into_iter().enumerate() {
61+
if (x > 9) && !flashes.contains(&i) {
62+
for j in adjacents(i) {
63+
next[j] += 1;
64+
}
65+
flashes.push(i);
66+
}
67+
}
68+
}
69+
70+
for (i, x) in next.into_iter().enumerate() {
71+
if x > 9 {
72+
next[i] = 0;
73+
}
74+
}
75+
(next, flashes)
76+
}
77+
78+
fn part1(b: Board) -> usize {
79+
let mut board = b;
80+
let mut seen_flashes = 0;
81+
for _ in 0..100 {
82+
let (x, flashes) = step(board);
83+
seen_flashes += flashes.len();
84+
board = x;
85+
}
86+
seen_flashes
87+
}
88+
89+
fn part2(b: Board) -> usize {
90+
let mut steps = 0;
91+
let mut flashes_this_step = 0;
92+
let mut board = b;
93+
while flashes_this_step < 100 {
94+
let (x, flashes) = step(board);
95+
flashes_this_step = flashes.len();
96+
board = x;
97+
steps += 1;
98+
}
99+
steps
100+
}
101+
102+
#[test]
103+
fn test_part1() {
104+
assert_eq!(part1(parse("test0")), 1656)
105+
}
106+
107+
#[test]
108+
fn test_part2() {
109+
assert_eq!(part2(parse("test0")), 195)
110+
}
111+
112+
fn main() {
113+
println!("{:?}", part1(parse("input")));
114+
println!("{:?}", part2(parse("input")));
115+
}

day11/test0

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
5483143223
2+
2745854711
3+
5264556173
4+
6141336146
5+
6357385478
6+
4167524645
7+
2176841721
8+
6882881134
9+
4846848554
10+
5283751526

0 commit comments

Comments
 (0)