diff --git a/2019/04/Cargo.toml b/2019/04/Cargo.toml new file mode 100644 index 0000000..7df0553 --- /dev/null +++ b/2019/04/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "d4" +version = "0.1.0" +authors = ["kageru "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +itertools = "0.8.2" diff --git a/2019/04/src/main.rs b/2019/04/src/main.rs new file mode 100644 index 0000000..1101a46 --- /dev/null +++ b/2019/04/src/main.rs @@ -0,0 +1,25 @@ +#![feature(is_sorted)] +use itertools::Itertools; + +pub fn main() { + let (lower, upper) = (172930, 683082); + let valid_part1 = (lower..upper) + .map(|n| n.to_string().chars().collect::>()) + .filter(|n| n.is_sorted()) + .filter(|v| v.clone().iter().dedup().count() != v.len()); + println!("Part 1: {}", valid_part1.clone().count()); + let part2 = valid_part1 + .filter(|v| { + let (mut last, mut streak, mut double) = (' ', 0, false); + v.iter().for_each(|c| { + if streak == 2 && c != &last { + double = true + } + streak = if c == &last { streak + 1 } else { 1 }; + last = *c; + }); + double || streak == 2 + }) + .count(); + println!("Part 2: {}", part2); +}