summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Igne <git@federicoigne.com>2021-12-13 14:34:33 +0000
committerFederico Igne <git@federicoigne.com>2021-12-13 14:34:33 +0000
commit285378ed607932cb126b03cdc77a8682e37821e8 (patch)
tree0a7e3c680598d58c4d8a47aa228cc64b025768c7
parent0569bae066cfdd5ed388a60a470c882fa87f0a4c (diff)
downloadaoc-285378ed607932cb126b03cdc77a8682e37821e8.tar.gz
aoc-285378ed607932cb126b03cdc77a8682e37821e8.zip
Day 11
-rw-r--r--day11/Cargo.toml9
-rw-r--r--day11/resources/input.txt10
-rw-r--r--day11/src/main.rs94
3 files changed, 113 insertions, 0 deletions
diff --git a/day11/Cargo.toml b/day11/Cargo.toml
new file mode 100644
index 0000000..350430f
--- /dev/null
+++ b/day11/Cargo.toml
@@ -0,0 +1,9 @@
1[package]
2name = "day11"
3version = "0.1.0"
4authors = ["Federico Igne <git@federicoigne.com>"]
5edition = "2018"
6
7# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8
9[dependencies]
diff --git a/day11/resources/input.txt b/day11/resources/input.txt
new file mode 100644
index 0000000..16ac3e9
--- /dev/null
+++ b/day11/resources/input.txt
@@ -0,0 +1,10 @@
17222221271
26463754232
33373484684
44674461265
51187834788
61175316351
78211411846
84657828333
95286325337
105771324832
diff --git a/day11/src/main.rs b/day11/src/main.rs
new file mode 100644
index 0000000..960accf
--- /dev/null
+++ b/day11/src/main.rs
@@ -0,0 +1,94 @@
1use std::fs;
2use std::path::Path;
3use std::collections::VecDeque;
4
5const WIDTH: usize = 10;
6const HEIGHT: usize = 10;
7
8/* AOC21 Day 11: https://adventofcode.com/2021/day/11 */
9fn main() {
10 let input = Path::new("resources").join("input.txt");
11 let content = fs::read_to_string(input).expect("Unable to read input file");
12 ex1(&content, 100);
13 ex2(&content);
14}
15
16fn ex1(content: &str, steps: u32) {
17 let mut energy: Vec<u8> = content.lines().flat_map(|l| l.bytes().map(|b| b-b'0')).collect();
18 let mut queue: VecDeque<usize> = VecDeque::with_capacity(2*WIDTH*HEIGHT);
19 println!("Ex1: the result is {}", (0..steps).map(|_| step(&mut energy, &mut queue)).sum::<usize>())
20}
21
22fn ex2(content: &str) {
23 let mut energy: Vec<u8> = content.lines().flat_map(|l| l.bytes().map(|b| b-b'0')).collect();
24 let mut queue: VecDeque<usize> = VecDeque::with_capacity(2*WIDTH*HEIGHT);
25 println!("Ex2: the result is {}", (1..).find(|_| step(&mut energy, &mut queue) == WIDTH*HEIGHT).unwrap());
26}
27
28fn step(energy: &mut [u8], queue: &mut VecDeque<usize>) -> usize {
29 queue.extend(0..energy.len());
30 while let Some(i) = queue.pop_front() {
31 octopus(energy, queue, i);
32 }
33 energy.iter_mut().filter_map(|o| if *o > 9 { *o = 0; Some(o) } else { None }).count()
34}
35
36fn octopus(energy: &mut [u8], queue: &mut VecDeque<usize>, i: usize) {
37 let len = energy.len();
38 energy[i] += 1;
39 if energy[i] == 10 {
40 if i%WIDTH > 0 {
41 queue.push_back(i-1);
42 if i >= WIDTH+1 { queue.push_back(i-WIDTH-1) }
43 if i+WIDTH-1 < len { queue.push_back(i+WIDTH-1) }
44 }
45 if (i+1)%WIDTH > 0 {
46 queue.push_back(i+1);
47 if i >= WIDTH-1 { queue.push_back(i+1-WIDTH) }
48 if i+WIDTH+1 < len { queue.push_back(i+1+WIDTH) }
49 }
50 if i >= WIDTH { queue.push_back(i-WIDTH) }
51 if i+WIDTH < len { queue.push_back(i+WIDTH) }
52 }
53}
54
55#[cfg(test)]
56mod tests {
57 use super::*;
58
59 const INPUT: [u8;100] = [
60 5,4,8,3,1,4,3,2,2,3,
61 2,7,4,5,8,5,4,7,1,1,
62 5,2,6,4,5,5,6,1,7,3,
63 6,1,4,1,3,3,6,1,4,6,
64 6,3,5,7,3,8,5,4,7,8,
65 4,1,6,7,5,2,4,6,4,5,
66 2,1,7,6,8,4,1,7,2,1,
67 6,8,8,2,8,8,1,1,3,4,
68 4,8,4,6,8,4,8,5,5,4,
69 5,2,8,3,7,5,1,5,2,6
70 ];
71
72 #[test]
73 fn step10() {
74 let mut input = INPUT.clone();
75 let mut queue = VecDeque::with_capacity(200);
76 let flash = (0..10).map(|_| step(&mut input, &mut queue)).sum::<usize>();
77 assert_eq!(204, flash);
78 }
79
80 #[test]
81 fn step100() {
82 let mut input = INPUT.clone();
83 let mut queue = VecDeque::with_capacity(200);
84 let flash = (0..100).map(|_| step(&mut input, &mut queue)).sum::<usize>();
85 assert_eq!(1656, flash);
86 }
87
88 #[test]
89 fn synchronised() {
90 let mut input = INPUT.clone();
91 let mut queue: VecDeque<usize> = VecDeque::with_capacity(2*WIDTH*HEIGHT);
92 assert_eq!(195, (1..).find(|_| step(&mut input, &mut queue) == WIDTH*HEIGHT).unwrap());
93 }
94}