81 lines
2.1 KiB
Rust
81 lines
2.1 KiB
Rust
/*
|
|
However, they do remember a few key facts about the password:
|
|
|
|
It is a six-digit number.
|
|
The value is within the range given in your puzzle input.
|
|
Two adjacent digits are the same (like 22 in 122345).
|
|
Going from left to right, the digits never decrease; they only ever increase or stay the same (like 111123 or 135679).
|
|
|
|
Other than the range rule, the following are true:
|
|
|
|
111111 meets these criteria (double 11, never decreases).
|
|
223450 does not meet these criteria (decreasing pair of digits 50).
|
|
123789 does not meet these criteria (no double).
|
|
|
|
How many different passwords within the range given in your puzzle input meet these criteria?
|
|
|
|
Your puzzle input is 206938-679128.
|
|
|
|
*/
|
|
|
|
fn valid_password1(number: u32) -> bool {
|
|
use std::io::Write;
|
|
if number < 100_000 || number > 999_999 { return false; }
|
|
let mut digits = [0u8; 6];
|
|
write!(&mut digits[..], "{}", number).unwrap();
|
|
let mut have_double_digit = false;
|
|
for i in 0..5 {
|
|
if digits[i] > digits[i+1] { return false; }
|
|
if digits[i] == digits[i+1] { have_double_digit = true }
|
|
}
|
|
|
|
have_double_digit
|
|
}
|
|
|
|
fn valid_password2(number: u32) -> bool {
|
|
use std::io::Write;
|
|
if number < 100_000 || number > 999_999 { return false; }
|
|
let mut digits = [0u8; 6];
|
|
write!(&mut digits[..], "{}", number).unwrap();
|
|
let mut have_double_digit = false;
|
|
let mut current_run = 1;
|
|
for i in 0..5 {
|
|
if digits[i] > digits[i+1] { return false; }
|
|
if digits[i] == digits[i+1] {
|
|
current_run += 1;
|
|
} else {
|
|
if current_run == 2 {
|
|
have_double_digit = true;
|
|
}
|
|
current_run = 1;
|
|
}
|
|
}
|
|
if current_run == 2 {
|
|
have_double_digit = true;
|
|
}
|
|
|
|
have_double_digit
|
|
}
|
|
|
|
fn main() {
|
|
println!("Count 1: {}", (206938..=679128).filter(|n| valid_password1(*n)).count());
|
|
println!("Count 2: {}", (206938..=679128).filter(|n| valid_password2(*n)).count());
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod day4test {
|
|
#[test]
|
|
fn examples1() {
|
|
assert!(super::valid_password1(111111));
|
|
assert!(!super::valid_password1(223450));
|
|
assert!(!super::valid_password1(123789));
|
|
}
|
|
|
|
#[test]
|
|
fn examples2() {
|
|
assert!(super::valid_password2(112233));
|
|
assert!(!super::valid_password2(123444));
|
|
assert!(super::valid_password2(111122));
|
|
}
|
|
}
|