aoc2019/day4/src/main.rs

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));
}
}