summaryrefslogtreecommitdiff
path: root/2022/Rust/src/day6.rs
diff options
context:
space:
mode:
Diffstat (limited to '2022/Rust/src/day6.rs')
-rw-r--r--2022/Rust/src/day6.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/2022/Rust/src/day6.rs b/2022/Rust/src/day6.rs
new file mode 100644
index 0000000..b3afab6
--- /dev/null
+++ b/2022/Rust/src/day6.rs
@@ -0,0 +1,57 @@
+use std::collections::HashSet;
+
+fn solve_functional(data: &str, window: usize) -> usize {
+ data.as_bytes()
+ .windows(window)
+ .map(|arr| {
+ arr.into_iter()
+ .map(|ele| *ele as usize)
+ .collect::<HashSet<_>>()
+ })
+ .position(|set| set.len() == window)
+ .unwrap()
+ + window
+}
+
+fn solve_part_one(data: &str) -> usize {
+ let v: Vec<char> = data.chars().collect();
+ for i in 0..v.len() - 4 {
+ let mut st: HashSet<char> = HashSet::new();
+ for j in i..i + 4 {
+ st.insert(v[j]);
+ }
+ if st.len() == 4 {
+ return i + 4;
+ }
+ }
+ unreachable!()
+}
+
+fn solve_part_two(data: &str) -> usize {
+ let v: Vec<char> = data.chars().collect();
+ for i in 0..v.len() - 14 {
+ let mut st: HashSet<char> = HashSet::new();
+ for j in i..i + 14 {
+ st.insert(v[j]);
+ }
+ if st.len() == 14 {
+ return i + 14;
+ }
+ }
+ unreachable!()
+}
+
+fn main() {
+ let data_test = include_str!("../data/day6.test");
+ let data_prod = include_str!("../data/day6.prod");
+ println!("{}", solve_part_one(data_test));
+ println!("{}", solve_part_one(data_prod));
+ println!("{}", solve_part_two(data_test));
+ println!("{}", solve_part_two(data_prod));
+
+
+ println!("{}", solve_functional(data_test, 4));
+ println!("{}", solve_functional(data_prod, 4));
+ println!("{}", solve_functional(data_test, 14));
+ println!("{}", solve_functional(data_prod, 14));
+}