From d2198c80469ed6734995f22e5e6f2068aab22377 Mon Sep 17 00:00:00 2001 From: Vladan Popovic Date: Mon, 16 Dec 2019 01:50:28 +0100 Subject: [PATCH] Day 4 complete part 1 and 2 --- src/day4.rs | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 3 +++ 2 files changed, 67 insertions(+) create mode 100644 src/day4.rs diff --git a/src/day4.rs b/src/day4.rs new file mode 100644 index 0000000..cbac3e0 --- /dev/null +++ b/src/day4.rs @@ -0,0 +1,64 @@ +use std::io; + +fn part1(x: &u32) -> bool { + let matching = x + .to_string() + .chars() + .map(|c| c.to_digit(10).unwrap()) + .fold((true, false, 0), |acc, next| { + (acc.0 && next >= acc.2, acc.1 || next == acc.2, next) + }); + + matching.0 && matching.1 +} + +fn part2(x: &u32) -> bool { + let matching = x.to_string().chars().map(|c| c.to_digit(10).unwrap()).fold( + (true, false, 0, 0), + |acc, next| { + if next == acc.3 && acc.2 >= 2 { + (acc.0 && next >= acc.3, acc.1, acc.2 + 1, next) + } else if next != acc.3 && acc.2 == 2 { + (acc.0 && next >= acc.3, true, 1, next) + } else if next == acc.3 && acc.2 < 2 { + (acc.0 && next >= acc.3, acc.1, acc.2 + 1, next) + } else { + (acc.0 && next >= acc.3, acc.1, 1, next) + } + }, + ); + matching.0 && (matching.1 || matching.2 == 2) +} + +pub fn main() -> io::Result<()> { + let input = "123257-647015"; + + let range: Vec = input + .split("-") + .map(|x| x.parse::().unwrap()) + .take(2) + .collect(); + + println!("part1 = {}", (range[0]..range[1]).filter(part1).count()); + println!("part2 = {}", (range[0]..range[1]).filter(part2).count()); + + Ok(()) +} + +#[test] +fn test_part1() { + assert!(part1(&111111)); + assert!(!part1(&223450)); + assert!(!part1(&123789)); +} + +#[test] +fn test_part2() { + assert!(!part2(&111111)); + assert!(!part2(&223450)); + assert!(!part2(&123789)); + assert!(part2(&112233)); + assert!(part2(&223334)); + assert!(!part2(&123444)); + assert!(part2(&111122)); +} diff --git a/src/main.rs b/src/main.rs index 535adac..45262c8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ mod day1; mod day2; mod day3; +mod day4; use std::fs::File; use std::io::{self, BufRead, BufReader}; @@ -18,5 +19,7 @@ fn main() -> io::Result<()> { day3::main()?; + day4::main()?; + Ok(()) }