From fb535480020886dfbf41f682f1b9f7b284249912 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Thu, 5 Dec 2019 00:29:40 +0200 Subject: Day 4 - some quick iteration --- inputs/day_4.txt | 2 ++ src/bin/day_4.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 inputs/day_4.txt create mode 100644 src/bin/day_4.rs diff --git a/inputs/day_4.txt b/inputs/day_4.txt new file mode 100644 index 0000000..f62320b --- /dev/null +++ b/inputs/day_4.txt @@ -0,0 +1,2 @@ +138241 +674034 diff --git a/src/bin/day_4.rs b/src/bin/day_4.rs new file mode 100644 index 0000000..3cb8d38 --- /dev/null +++ b/src/bin/day_4.rs @@ -0,0 +1,59 @@ +use std::io; +use std::io::prelude::*; + +use structopt::StructOpt; + +#[derive(Debug, StructOpt)] +#[structopt(name = "Day 4: Secure Container")] +/// Calculates how many possible lock values there are +/// +/// See https://adventofcode.com/2019/day/4 for details. +struct Opt { + /// Repeated digits must be exactly 2 long + #[structopt(long = "larger-range-rule")] + larger_range_rule: bool, + min: u32, + max: u32, +} + +fn main() { + let stdin = io::stdin(); + let opt = Opt::from_args(); + + println!( + "{}", + valid_combinations(opt.min, opt.max, opt.larger_range_rule) + ) +} + +fn valid_combinations(min: u32, max: u32, larger_range_rule: bool) -> u32 { + (min..max) + .filter(|x| { + two_adjacent_identical_digits(*x, larger_range_rule) && digits_never_decrease(*x) + }) + .count() as u32 +} + +fn two_adjacent_identical_digits(x: u32, larger_range_rule: bool) -> bool { + if larger_range_rule { + (0..5).any(|d| { + digit(x, d) == digit(x, d + 1) + && digit(x, d) != digit(x, d + 2) + && digit(x, d) != digit(x, d - 1) + }) + } else { + (0..5).any(|d| digit(x, d) == digit(x, d + 1)) + } +} + +fn digits_never_decrease(x: u32) -> bool { + (0..5).all(|d| digit(x, d) >= digit(x, d + 1)) +} + +fn digit(x: u32, digit: i32) -> u32 { + if digit < 0 { + 0 + } else { + (x / 10u32.pow(digit as u32)) % 10 + } +} -- cgit v1.2.3