diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2019-12-04 19:45:33 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2019-12-04 19:45:33 +0100 |
| commit | 80f3bb10589b2f56178943c84b1a1fc5eb593d4f (patch) | |
| tree | 9481ed785fc3a0ab05226c4ad39702afd862e89b /src/main.rs | |
| parent | 77cc5ae588c6650a4e7a7a3e5f47cb3970533c71 (diff) | |
day4
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 80 |
1 files changed, 79 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index bb92d50..ec27262 100644 --- a/src/main.rs +++ b/src/main.rs @@ -234,8 +234,75 @@ fn day3() { println!("3b: {}", delay); } +fn digits(input : u32) -> Vec<u32> { + let mut tmp = input; + let mut digits = Vec::new(); + loop { + digits.push(tmp % 10); + tmp /= 10; + if tmp == 0 { + break; + } + } + digits.reverse(); + digits +} + +fn valid_password(password : u32) -> bool { + let digits = digits(password); + if digits.len() != 6 { + return false; + } + let mut prev = 0; + let mut has_double = false; + for d in digits { + if d < prev { + return false; + } + if d == prev { + has_double = true; + } + prev = d + } + + has_double +} + +fn valid_password2(input : u32) -> bool { + if !valid_password(input) { + return false; + } + + let digits = digits(input); + let mut same_count = 1; + let mut prev = 0; + for d in digits { + if d == prev { + same_count += 1; + } else { + if same_count == 2 { + return true; + } + same_count = 1; + } + prev = d; + } + same_count == 2 +} + +fn day4() { + let min = 264360; + let max = 746325; + + let count = (min..max+1).filter(|&pw| valid_password(pw)).count(); + println!("4a: {}", count); + + let count = (min..max+1).filter(|&pw| valid_password2(pw)).count(); + println!("4a: {}", count); +} + fn main() { - day3(); + day4(); } #[cfg(test)] @@ -279,4 +346,15 @@ mod tests { assert_eq!(closest_intersection(wire1, wire2), 135); assert_eq!(min_delay(wire1, wire2), 410); } + + #[test] + fn test_day4() { + assert!(valid_password(111111)); + assert!(!valid_password(223450)); + assert!(!valid_password(123789)); + + assert!(valid_password2(112233)); + assert!(!valid_password2(123444)); + assert!(valid_password2(111122)); + } } |
