From dd6c5aa5c7aa8a5e6ccbeadb60a5364cdf12dc13 Mon Sep 17 00:00:00 2001 From: Daniel Seiller Date: Wed, 2 Dec 2020 14:20:39 +0100 Subject: [PATCH] Day 2 --- src/day1.rs | 4 ++-- src/day2.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 3 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 src/day2.rs diff --git a/src/day1.rs b/src/day1.rs index ad3cf02..a6043ea 100644 --- a/src/day1.rs +++ b/src/day1.rs @@ -17,7 +17,7 @@ pub fn solve_part1(input: &Vec) -> usize { } } } - unimplemented!(); + panic!("No pair summed to 20202!"); } @@ -36,5 +36,5 @@ pub fn solve_part2(input: &Vec) -> usize { } } } - unimplemented!(); + panic!("No triplet summed to 20202!"); } \ No newline at end of file diff --git a/src/day2.rs b/src/day2.rs new file mode 100644 index 0000000..062a4f3 --- /dev/null +++ b/src/day2.rs @@ -0,0 +1,68 @@ +use aoc_runner_derive::{aoc,aoc_generator}; + +#[derive(Debug,PartialEq,Eq,Ord,PartialOrd)] +pub struct Rule { + min: usize, + max: usize, + ch: char, + pw: String +} + +impl Rule { + fn is_valid_part1(&self) -> bool { + let n=self.pw.chars().filter(|c| *c==self.ch).count(); + return n>=self.min && n<=self.max; + } + fn is_valid_part2(&self) -> bool { + let idx_1=self.min-1; + let idx_2=self.max-1; + let chars: Vec = self.pw.chars().collect(); + return (chars.get(idx_1)==Some(&self.ch))^(chars.get(idx_2)==Some(&self.ch)) + } +} + +#[aoc_generator(day2)] +pub fn input_generator(input: &str) -> Vec { + input.lines().map(|l| { + let mut ws = l.trim().split_whitespace(); + let range= ws.next().unwrap(); + let ch= ws.next().unwrap().trim_end_matches(|c| c==':').chars().next().unwrap(); + let pw= ws.next().unwrap().to_owned(); + let (r_min, r_max) = { + let mut r=range.split('-'); + let r_min=r.next().unwrap().parse().unwrap(); + let r_max=r.next().unwrap().parse().unwrap(); + (r_min,r_max) + }; + Rule { + min:r_min, + max:r_max, + ch, + pw + } + }).collect::>() +} + +#[aoc(day2, part1)] +pub fn solve_part1(input: &Vec) -> usize { + let mut total=0; + for rule in input { + if rule.is_valid_part1() { + total+=1; + } + } + total +} + + +#[aoc(day2, part2)] +pub fn solve_part2(input: &Vec) -> usize { + let mut total=0; + for rule in input { + if rule.is_valid_part2() { + total+=1; + } + } + total +} + diff --git a/src/lib.rs b/src/lib.rs index 062a438..58b0f10 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ use aoc_runner_derive::aoc_lib; pub mod day1; +pub mod day2; aoc_lib! { year = 2020 } \ No newline at end of file