diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2020-12-02 18:29:58 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2020-12-02 18:32:59 +0100 |
| commit | bb17758c87eddb24b7fb636d6a22796c93874674 (patch) | |
| tree | 4c01b065ebe2d32518e35adac8342ee3df14ef29 /src/main.rs | |
| parent | d46d6f024b0de8ff4fcd2278ccceb6afcbf03457 (diff) | |
day2
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index ee10457..51a4a74 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,11 +2,19 @@ use std::fs; use std::collections::HashSet; +use regex::Regex; fn read_file(file: &str) -> String { fs::read_to_string(file).unwrap() } +fn read_lines(file: &str) -> Vec<String> { + read_file(file).split('\n') + .filter(|x| !x.is_empty()) + .map(String::from) + .collect() +} + fn read_numbers(file: &str) -> Vec<i32> { read_file(file).split('\n') .filter(|x| !x.is_empty()) @@ -45,8 +53,55 @@ fn day1() { } } +struct PasswordEntry { + min : usize, + max : usize, + character : char, + password : String, +} + +impl PasswordEntry { + fn new(input: &str) -> PasswordEntry { + let re = Regex::new(r"^([0-9]+)-([0-9]+) ([a-z]): ([a-z]+)$").unwrap(); + let caps = re.captures(&input).unwrap(); + PasswordEntry { + min : caps[1].parse::<usize>().unwrap(), + max : caps[2].parse::<usize>().unwrap(), + character : caps[3].parse::<char>().unwrap(), + password : caps[4].to_string(), + } + } + + fn is_valid(&self) -> bool { + let count = self.password.chars().filter(|x| *x == self.character).count(); + count >= self.min && count <= self.max + } + + fn is_valid_new(&self) -> bool { + let c1 = self.password.chars().nth(self.min-1).unwrap(); + let c2 = self.password.chars().nth(self.max-1).unwrap(); + c1 != c2 && (c1 == self.character || c2 == self.character) + } +} + +fn day2() { + let input : Vec<PasswordEntry> = read_lines("input02") + .iter() + .map(|x| PasswordEntry::new(&x)) + .collect(); + let count = input.iter() + .filter(|x| x.is_valid()) + .count(); + println!("2a: {}", count); + + let count = input.iter() + .filter(|x| x.is_valid_new()) + .count(); + println!("2b: {}", count); +} + fn main() { - day1(); + day2(); } #[cfg(test)] @@ -73,4 +128,20 @@ mod tests { break; } } + + #[test] + fn test_day2() { + let lines = ["1-3 a: abcde", + "1-3 b: cdefg", + "2-9 c: ccccccccc"]; + let entries : Vec<PasswordEntry> = lines.iter().map(|x| PasswordEntry::new(&x)).collect(); + assert_eq!(entries[0].is_valid(), true); + assert_eq!(entries[1].is_valid(), false); + assert_eq!(entries[2].is_valid(), true); + + assert_eq!(entries[0].is_valid_new(), true); + assert_eq!(entries[1].is_valid_new(), false); + assert_eq!(entries[2].is_valid_new(), false); + + } } |
