diff --git a/src/bin/day6.rs b/src/bin/day6.rs index 71c2ee8..42d70d7 100644 --- a/src/bin/day6.rs +++ b/src/bin/day6.rs @@ -1,9 +1,30 @@ -use itertools::Itertools; -use std::collections::HashSet; use std::error::Error; use std::fs::File; use std::io::{self, BufRead}; -use std::vec::Vec; + +fn find_sequence(line: &str, len: usize) -> usize { + let mut answer = 0; + + for i in 0..line.len() - len { + let mut set1 = 0u32; + let mut repeated = false; + for c in line[i..i + len].chars() { + let bit = 1 << (c as u32 - 'a' as u32); + if bit & set1 == 0 { + set1 |= bit; + } else { + repeated = true; + break; + } + } + if !repeated { + answer = i + len; + break; + } + } + + return answer; +} fn main() -> Result<(), Box> { let file = File::open("inputs/day6.txt")?; @@ -14,28 +35,10 @@ fn main() -> Result<(), Box> { .unwrap() .to_owned(); - let mut answer1 = 0; - - for i in 0..line.len() - 4 { - let set: HashSet = line[i..i + 4].chars().collect(); - if set.len() == 4 { - answer1 = i + 4; - break; - } - } - + let answer1 = find_sequence(&line, 4); println!("Answer Part1: {}", answer1); - let mut answer2 = 0; - - for i in 0..line.len() - 14 { - let set: HashSet = line[i..i + 14].chars().collect(); - if set.len() == 14 { - answer2 = i + 14; - break; - } - } - + let answer2 = find_sequence(&line, 14); println!("Answer Part2: {}", answer2); Ok(())