diff --git a/2018/ruby/day_03.rb b/2018/ruby/day_03.rb index 5f89a5e..32686de 100644 --- a/2018/ruby/day_03.rb +++ b/2018/ruby/day_03.rb @@ -18,7 +18,7 @@ claims, fabric = ARGF fabric[[y+dy, x+dx]] << claim } } -} + } p claims.reject {|claim| fabric.any? {|_,v| diff --git a/2018/rust/src/day_02.rs b/2018/rust/src/day_02.rs new file mode 100644 index 0000000..d24771d --- /dev/null +++ b/2018/rust/src/day_02.rs @@ -0,0 +1,52 @@ +pub fn solve(input: &str) -> String { + let box_ids: Vec<_> = input.lines().map(BoxId::new).collect(); + + let two_count = box_ids.iter().filter(|&x| x.is_two()).count(); + let three_count = box_ids.iter().filter(|&x| x.is_three()).count(); + + (two_count * three_count).to_string() +} + +struct BoxId(String); + +impl BoxId { + fn new(s: &str) -> Self { + BoxId(s.into()) + } + + fn is_two(&self) -> bool { + self.is_n(2) + } + + fn is_three(&self) -> bool { + self.is_n(3) + } + + fn is_n(&self, n: usize) -> bool { + self.0 + .chars() + .any(|x| self.0.chars().filter(|&y| x == y).count() == n) + } +} + +#[test] +fn test_is_two() { + assert_eq!(BoxId::new("abcdef").is_two(), false); + assert_eq!(BoxId::new("bababc").is_two(), true); + assert_eq!(BoxId::new("abbcde").is_two(), true); + assert_eq!(BoxId::new("abcccd").is_two(), false); + assert_eq!(BoxId::new("aabcdd").is_two(), true); + assert_eq!(BoxId::new("abcdee").is_two(), true); + assert_eq!(BoxId::new("ababab").is_two(), false); +} + +#[test] +fn test_is_three() { + assert_eq!(BoxId::new("abcdef").is_three(), false); + assert_eq!(BoxId::new("bababc").is_three(), true); + assert_eq!(BoxId::new("abbcde").is_three(), false); + assert_eq!(BoxId::new("abcccd").is_three(), true); + assert_eq!(BoxId::new("aabcdd").is_three(), false); + assert_eq!(BoxId::new("abcdee").is_three(), false); + assert_eq!(BoxId::new("ababab").is_three(), true); +} diff --git a/2018/rust/src/main.rs b/2018/rust/src/main.rs index b407119..0135cf4 100644 --- a/2018/rust/src/main.rs +++ b/2018/rust/src/main.rs @@ -1,11 +1,12 @@ use std::io::{self, Read}; mod day_01; +mod day_02; fn main() { let mut input = String::new(); io::stdin().read_to_string(&mut input).unwrap(); - let output = day_01::solve_1(&input, "\n"); + let output = day_02::solve(&input); println!("{}", output); }