Skip to content
This repository was archived by the owner on Aug 26, 2024. It is now read-only.

Commit 6f5b948

Browse files
committed
day18
1 parent 5f3c1cb commit 6f5b948

File tree

3 files changed

+251
-0
lines changed

3 files changed

+251
-0
lines changed

src/day18.rs

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
use std::str::FromStr;
2+
3+
#[allow(dead_code)]
4+
struct LightGrid {
5+
grid: [[bool; 10000]; 2],
6+
}
7+
8+
impl FromStr for LightGrid {
9+
type Err = String;
10+
11+
fn from_str(light_grid_str: &str) -> Result<Self, Self::Err> {
12+
let mut light_grid = [[false; 10000]; 2];
13+
let mut i = 0;
14+
for b in light_grid_str.as_bytes() {
15+
match b {
16+
b'.' => i += 1,
17+
b'#' => {
18+
light_grid[0][i] = true;
19+
i += 1;
20+
}
21+
_ => (),
22+
}
23+
}
24+
Ok(Self { grid: light_grid })
25+
}
26+
}
27+
28+
#[allow(dead_code)]
29+
impl LightGrid {
30+
const ROWS: usize = 100;
31+
32+
#[inline(always)]
33+
fn get(&self, toggle: usize, i: usize, j: usize) -> bool {
34+
self.grid[toggle][i * Self::ROWS + j]
35+
}
36+
37+
#[inline(always)]
38+
fn set(&mut self, toggle: usize, i: usize, j: usize, state: bool) {
39+
self.grid[toggle][i * Self::ROWS + j] = state;
40+
}
41+
42+
fn get_neighbours(&self, i: usize, j: usize) -> impl Iterator<Item = (usize, usize)> {
43+
let neighbours: [(usize, usize); 8] = [
44+
(i.wrapping_sub(1), j.wrapping_sub(1)),
45+
(i.wrapping_sub(1), j),
46+
(i.wrapping_sub(1), j.wrapping_add(1)),
47+
(i, j.wrapping_sub(1)),
48+
(i, j.wrapping_add(1)),
49+
(i.wrapping_add(1), j.wrapping_sub(1)),
50+
(i.wrapping_add(1), j),
51+
(i.wrapping_add(1), j.wrapping_add(1)),
52+
];
53+
neighbours
54+
.into_iter()
55+
.filter(|pos| pos.0 < Self::ROWS && pos.1 < Self::ROWS)
56+
}
57+
58+
fn step_100(&mut self) -> i32 {
59+
for step in 0..100 {
60+
for i in 0..Self::ROWS {
61+
for j in 0..Self::ROWS {
62+
let current_grid = step % 2;
63+
let next_grid = (step + 1) % 2;
64+
65+
// Count ON neighbouring lights
66+
let count: i32 = self
67+
.get_neighbours(i, j)
68+
.map(|light| self.get(current_grid, light.0, light.1) as i32)
69+
.sum();
70+
71+
// Apply rules
72+
if self.get(current_grid, i, j) {
73+
if count == 2 || count == 3 {
74+
self.set(next_grid, i, j, true);
75+
} else {
76+
self.set(next_grid, i, j, false);
77+
}
78+
} else if count == 3 {
79+
self.set(next_grid, i, j, true);
80+
} else {
81+
self.set(next_grid, i, j, false);
82+
}
83+
}
84+
}
85+
}
86+
self.grid[0].map(|light| light as i32).into_iter().sum()
87+
}
88+
89+
const CORNERS: [(usize, usize); 4] = [(0, 0), (0, 99), (99, 0), (99, 99)];
90+
fn step_100_corners_always_on(&mut self) -> i32 {
91+
for step in 0..100 {
92+
for i in 0..Self::ROWS {
93+
for j in 0..Self::ROWS {
94+
// Skip corner
95+
if Self::CORNERS.contains(&(i, j)) {
96+
continue;
97+
}
98+
let current_grid = step % 2;
99+
let next_grid = (step + 1) % 2;
100+
101+
// Count ON neighbouring lights
102+
let count: i32 = self
103+
.get_neighbours(i, j)
104+
.map(|light| self.get(current_grid, light.0, light.1) as i32)
105+
.sum();
106+
107+
// Apply rules
108+
if self.get(current_grid, i, j) {
109+
if count == 2 || count == 3 {
110+
self.set(next_grid, i, j, true);
111+
} else {
112+
self.set(next_grid, i, j, false);
113+
}
114+
} else if count == 3 {
115+
self.set(next_grid, i, j, true);
116+
} else {
117+
self.set(next_grid, i, j, false);
118+
}
119+
}
120+
}
121+
}
122+
self.grid[0].map(|light| light as i32).into_iter().sum()
123+
}
124+
}
125+
126+
#[cfg(test)]
127+
mod solution {
128+
use super::*;
129+
use crate::input::get_input::get_input;
130+
131+
#[test]
132+
fn game_of_life() {
133+
let light_grid = get_input("light_grid").unwrap();
134+
let mut light_grid = light_grid.parse::<LightGrid>().unwrap();
135+
assert_eq!(light_grid.step_100(), 1061);
136+
}
137+
138+
#[test]
139+
fn game_of_life_corners_always_on() {
140+
let light_grid = get_input("light_grid").unwrap();
141+
let mut light_grid = light_grid.parse::<LightGrid>().unwrap();
142+
for grid in 0..2 {
143+
light_grid.set(grid, 0, 0, true);
144+
light_grid.set(grid, 0, 99, true);
145+
light_grid.set(grid, 99, 0, true);
146+
light_grid.set(grid, 99, 99, true);
147+
}
148+
assert_eq!(light_grid.step_100_corners_always_on(), 1006);
149+
}
150+
}

src/input/light_grid.txt

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#..####.##..#...#..#...#...###.#.#.#..#....#.##..#...##...#..#.....##..#####....#.##..##....##.#....
2+
.#..#..#..#.###...##..#.##.....#...#..##....#####.##............####.#..######..#.#.##.#...#..#...##
3+
#.....##.##.##.#..##.#..###...#.#.#..##..###.####.####.#.####.#...##.#..###.........#.###...#....###
4+
#.###..#######..##..#.....##.#.#.###.#.##..#.##..##.##.#.##...###.#...#.#####.#.##..#.#####..#.#####
5+
#.##.##.###.##..###.#.##.##...##.#.#..##..###.########.#.####..####...#####...#..#...##....##.##.##.
6+
..#.#.#.#..#.#.###....###...#...#.##..####.###.....#.####.###.###.#......#.#.###..#..#.#....#.#####.
7+
...#.###.#....#.###...#.#.#...#...#.#####....#....#...#####..#..#.#..######..#.##.#.##.#..###.#...##
8+
.###...#...#.#..#.#.####.#...#.....##...###.#....#..##.###....#.##....###..#.#####...###.#.##.####..
9+
#.#....##.#.....#####.#.##..#######.#.####..###.##.#####.##.#...###...#.#...###..#...#.#.###.###.###
10+
...##.##.....##..#.##...#.#...#...#.#####.#...#.#.#.#####.##.#...#.#..##.##..#...#....####..###.###.
11+
#..#....######...#...###.#....#####....#.#.#....#....#.#######.#####..#....#....#.##..#.##.###..#...
12+
#####.#.######.#.#####.#..##..##..####..#....#...#######....##..##.#..###..###.###..###...#...######
13+
#...##..##...###....##..##.##..#.#.#.#....##.#.......###..###..###...###..##.##.##.#.#.#..#.#..#..#.
14+
..###....##.###..#.#..########...###...##..#######....##..###..#####.##.#....###..##.##.##.#...##.#.
15+
###..#.#..#.#.##.##...##.....#..###.#..##.##.#....##.#.######..##..#.#.##.###...#..####...#.#..#.###
16+
.######....#..##..#.####.##..#.#..#.#..#....#..##.#..#.#...####..#....#.####.#.###.#...####.#...#.#.
17+
#.######.##..###.###..#..###.#...#..#...#...###.##....#.#......#...#.##.#.###..#.#####.#.#..###..#.#
18+
...#..#...####..###.########.....###.###.#..##.##....######..#..#.....#.##.##.#..##..#..##...#..#..#
19+
#..#..##..#.#.########.##.#.####..#.#####.#.###.##....###..##..#.#.###..#.##..##.##.####...######.##
20+
.######.###....#...##...#..#....##..#.#...###.######.##...#....##.##.#.#.##..#...###.###.#....#..##.
21+
####.#.##..##.##.###...#.###.##..##....###..####.##..#.#.##..###.#..##...####...#..####.#.#..##...#.
22+
.#.#..#.....##...#..#...#.#...#.#.##..#....#..#......#####.#######....#.#..#..###..##.#.########..##
23+
.##.#..#..##..#..####.#...####...#...#..##.#..###.#..######..#.#...###.##...#..#####..##.#..##.#.##.
24+
.###..##.##.##....###.###..#.#...##.#.#...#.#######.####..#..###.#######.#...#.#...#.##...#..####..#
25+
##.########..#..#....#.###..##.##.#.##.#..#......####..##.##.#..####..#####..#.....#####.###..#.#.#.
26+
.#..####..##.#.#..#####.##..#..#.#....#.#####.#####...######........##.##..##.#.#.###..#.#.#.#..##.#
27+
.##..##..#.######..###....#.#.###.#........#..###..#.########.....#.##...#.....#..#...##...#..#.###.
28+
##.##.#..####....####.#######.....#.#.#...#.######.#.....####.####...###..####.##.##....###..#..#...
29+
#.#..####...#......#...###...##....##.#######..#.###.#...###.##.##...####..#.####..#......##..#####.
30+
.#.#...##...#....#.####.##.....#....#.#.#######..###.#.....#.....####...##...#.#.##.####..##.###.#.#
31+
####.#.#.####...#...####.#.....#.#######.#.......####......###..###.#...######..#.##.#.##..#..##..##
32+
..##.###..#..####..####.......######.##..#.....##.##...##.##......#.###..###...#.##.#####.#.######.#
33+
.###..####.###..#..#.......#.##...##...##.######.....#..####.#......#.#...#...#...###...#.#.##..####
34+
.####....##.##.#.....##.###.####.#.......#.......#.#..#.#.#.....###.#.#####.#..#.#.#####.#####.###.#
35+
.##.#.###.#####..#..#....###.#.#.#..#..###..##..####..##.###....#..####.####.#..###.#..######.######
36+
####.#.....##..###....#.....#.##.#.##..##..########.#####..###.####....##.....######.#.#.##.......#.
37+
#.#.##.....#.....##.###.#..#.##.##....#..##....##.#.###.##.#..#..##.##.###.#..##.###...##..###.#####
38+
#.###.#.#.#.#.#.#.#...#..#.###..####.##...#..####.###....#..#..##.#....####..##.##....#.#.##.##....#
39+
...######....#..####...#.#..#.#.#..#.##.#.#.......#..#......##..#...#..#..##...##.#...#.#.#...##.##.
40+
.#####..#...####....#..###..##....#####..###.#.#...###..###.###..##...#......#...#...#.#.#...#.##..#
41+
......#####.#...#.#.#.##..#.###..##..#.#...###..###....##..#####..#######.#..#.###....###...##.#..#.
42+
..##.########.##..#....##.#...##.##.#.#..#.##..#.#.#.##....#.#.#.#.##....##....#....#####.##..#.##.#
43+
####...#....##.#.###......##.##.#..##...#..#####..#.#....##..#####...#.#.##...#.####.####..##.######
44+
.##.###.##.#...#.#....###.#######...##...##..#..##.###.#.####..#..###......#.#.##.#.#....#..##...#..
45+
.#.###.#.###.###.#.##.#..#......####.##...#..##.#..####.....#...#.###.##.##.#..#.##..#.###......#..#
46+
...##.####......#.#.#..###..#....###....#.##.#####..#..#..#...#.#.###...#.#.#.##....###.####..###.#.
47+
##..#.#.#.#....####...#.##.###..####....#..#####.######..#.##.##..#####.#.....#.#...##.#.##.##.#.#..
48+
#..##.#.#.#.###.#.#.###...#.#...##..#..#.#.#.##..###...#..##.#..#.#.#..#.....#.######.#.###..###.#..
49+
....#.#.##.###.##...#.##.#....#..##.#..##...#...#.##.####...##..####.#.........#..##..#...#...##.#..
50+
.##.......##...###.##.#.##.###.##.#..#..#..####...#...#....#####...###..##..#..#..##...#....#..#####
51+
..####..#...#...#..###....##.#.#####..#..#.....#......#...#.......##....####...##....##.##.#.#####.#
52+
##.#.#.#..##..##..#.####.##.##.###.#...###.#....#.....#.###...#######..###.####.###.####.##...##.#..
53+
..#.#...##.#....#..#..##.####.....#.#.#...#..#..###.#..###.#####.#.#####.#.#.#.#.###.##.###..#....##
54+
.###.#...#....###..#...####....####..#.##..#..##.###..#.#.#.#..#...###.#.#...#......#...#.##.##.#...
55+
..####.####.##.#.##....#...##....#..#....#..###..#...#..###.#####.....#####..##.#.#.#.#.#.##.####...
56+
...##.#.##.####..##.###..#.#.#.#.#.#.#..###...#.##..#.####.##...#.#.##......###..#...###....#.#.###.
57+
##...##..#.#.##..#.#.#....#.####.......#.#.#######.#..#....#.###.#...###.##....###.#.#..#.#.##.####.
58+
...##.......######.....##....#...#..#.##.###.#..#.##.###.#.###.#.#.#...#.#...##.##.##..#.##########.
59+
###..#....#.#.....#....###.#...##.......##.#.#..#.#...########......###..##.#..#..####.##..####...#.
60+
......##.###.#.###.....#..#...#.#......##....#....#........#..#...##.##.....#...##.##.........##....
61+
.##.##.#.#...#....######..##....##..##.#.#.##.#.##..##...#..###......##......#.#....#.#.#.......###.
62+
.......#.##..##.#...#.##..#..#####.#..#.######.........###.#####.####.#...##...........##...##..####
63+
#......#.#..#...#...##..#.#.###.##.##.#.#..#.###.##.#..###..#.###..#...###.##..###..#...#..###...#..
64+
####.##..#####..####.#...#..#..###..##.#.#...#...#...#.##.####.##.###....###...#.#.#..####.######.##
65+
.....#..####...#.#.#.####..####..##.###......#.....########.#...#.#..#..#...#.###..##.#####..###.###
66+
.#######.#.##..###.#...###.#####............##.###...#.##.#.##..##.#.#..#.######..######..#..#..####
67+
...##..#.####...#..#.#.##.#....#.####..#..###.###..#.#...#....##.##.#......##..##..#.#.#.###..#..#..
68+
........#...#.##.#.#..#....####....#.##...###..####...###.#.#..######..###..##.#####.###.###.#.#...#
69+
##......##.#..###.####.##.#.###.#.......#.##..####..#.###.##..##..##...##...#.###...#.#..#..#.#####.
70+
##..#.#.....##.####.#..##.#.##.#.#...#...#.#...####.#.#.##...##....##.###..###.####.#...#.###..#####
71+
.#####.####.####.####.#.##.##......###....###.####...###...#...#..#.##.#.#####.###..##.#..###...##..
72+
.#...#..##...##...#....#.#.#..##..#.##..#.###.#.###..###.#.#.###.#....#######.####.##..#..#...####..
73+
..##.##..#.##..#.#.###..#.##.########...####.#.###.##..#..###.###...##..##.#..#.######.##.#....###.#
74+
##.#####.###.##.#.##.##.##.###..##..##..#.#.#.#.####..#......#.#.#.#.#.#.##...#####.####...#.#...#.#
75+
.#..###..##.#####.#.##.#..##...##..##...#####.#.####..#...##.....######.#.#...##.#..#######.###.###.
76+
#.#..##.#.#####.#.#.....###.###.#..##.#####....#.###.##.##.#.#..##..#.#....#######.###.#.#.....#.###
77+
....###...#.###.####....###.....##....#####.##.###.###.##.##.##.#..###..######...####.#.#..####..#..
78+
###.....#..####..#.####..#..#...##.##..##.######.####.....#...##....#..#.##.#####..###.##.#.####...#
79+
.##.##.#...#..####...##.##.###...#...#..#.#.#####.....####...#.#.#..#.####...####.#...###.#......###
80+
###.##....#.#.#...#.###....####..##...##.##.##.#..#...####..#..#..##...#####.####.####...##.#..###.#
81+
..####.....##..###.#.#.###.########..#...#.##..#.#.#.......#.##.#..#...####.##.#..#.######..#.#...#.
82+
#.#.##.#.#.##.#....##......##......#######.#..#.##...##..#.#.###...#.#..#..###...#..###.....##.....#
83+
..#.##.#.##.#.##..##.....#.#..#.#..#...##..#..#.#....###.#####....####.####..#####.##.###...#..###.#
84+
#....#.###..#..########.###..#.#.#.##...##.#..##.###..#..#..#.#.##..###...###.#.##..#.##.#..#.#.####
85+
#.......#######......#...#...##.##...###.#....##.#..#....####.#.##.###...#.#####...##.###........##.
86+
.##.####.....###.##......####.###.########..#.####..#.##.#.####.....#...#.##....#######.##..#......#
87+
#.#.##.##....##..##.#.###..#.##.#..#..#.#..##.....###..###.##.##.####.##.#.#.##...####..#.#..##.#.#.
88+
...##.#.#.#...###.#.......#.#.....#.#...##....##.##.##.####...#.#..#..#..#.#.##.#..#.#.#....###..#.#
89+
....#.#.###.#####.##..###..##..#...#.##.#......##.####.#..####.#.##..####.#.#...##..#####..##.#.#...
90+
..###.#.##..#....#..#.#.....##.#####..##....#.#...#.##..##.#.#..#...##.##..##..##....#...#..#..#..##
91+
##.#.##.#...#.###.##.##.##.##..##.##...#..##.#..#######.#..#...#.#.##..#....##.#..####.###........#.
92+
.##.#..#.....#####..##.#.#.#.#..###.#######.###.###....##....#.#.#.###....###.#..#.#....#.#..###...#
93+
...###.#.#.###..#...#..###.######..##.#.#..#...####.#####.##..#..###...#..#..#..###..##.#.#...#.###.
94+
#......#.#..#..##.##.#.##.#.###.#.##.#.#..#....#.##..#..##..##.#.#.#....##.###.###.####.#.#####...##
95+
...#.##..#.######.......#.#.###.....#####....##.#.#.###........#.#.###.#.#########.##.##.#..##..#...
96+
##..###..###....####.##.##..##.###....####..##...####.####..####..###.####..##.#...###.#####.##.##.#
97+
###...##.#.#.#####..#..#####...##.#...#.#.###.#..##..###.##.#.#.....####.##.#..##.###.#...##.##...##
98+
...#.#.##.##..##....#..#.#####.##.###..#.#.#........####.###.##....##....####..#.#....#.#.#.###..#.#
99+
..#.#.#.#.###...#....##..######.##....#.#.##..###..#.#.###..#.##..#.#.###......#..#..#.####..#...##.
100+
.....####.#.....###.#.##.#..##.#..###.#####.#..##...###.#..###..#..##....###.#..##.#..#.##.#..#...##

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ mod day14;
1010
mod day15;
1111
mod day16;
1212
mod day17;
13+
mod day18;
1314
mod day2;
1415
mod day3;
1516
mod day4;

0 commit comments

Comments
 (0)