Advertisement
nairby

2022 Day 04

Dec 4th, 2022 (edited)
678
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.95 KB | None | 0 0
  1. use std::env;
  2. use std::io::{self, prelude::*, BufReader};
  3. use std::fs::File;
  4. use std::ops::RangeInclusive;
  5.  
  6. extern crate regex;
  7. use regex::Regex;
  8.  
  9. struct Team {
  10.     elf1: RangeInclusive<usize>,
  11.     elf2: RangeInclusive<usize>,
  12. }
  13. impl Team {
  14.     pub fn has_overlaps1(&self) -> bool {
  15.         (self.elf1.contains(&self.elf2.start()) && self.elf1.contains(&self.elf2.end())) ||
  16.         (self.elf2.contains(&self.elf1.start()) && self.elf2.contains(&self.elf1.end()))
  17.     }
  18.     pub fn has_overlaps2(&self) -> bool {
  19.         self.elf1.contains(&self.elf2.start()) || self.elf1.contains(&self.elf2.end()) ||
  20.         self.elf2.contains(&self.elf1.start()) || self.elf2.contains(&self.elf1.end())
  21.     }
  22. }
  23. impl From<&String> for Team {
  24.     fn from(s: &String) -> Self {
  25.         let re = Regex::new(r"(\d+)\-(\d+),(\d+)\-(\d+)").unwrap();
  26.         let matches = re.captures(s).unwrap();
  27.         Self {
  28.             elf1: RangeInclusive::new(matches[1].parse().unwrap(),matches[2].parse().unwrap()),
  29.             elf2: RangeInclusive::new(matches[3].parse().unwrap(),matches[4].parse().unwrap()),
  30.         }
  31.     }
  32. }
  33.  
  34. fn solve(input: &str) -> io::Result<()> {
  35.     let file = File::open(input).expect("Input file not found.");
  36.     let reader = BufReader::new(file);
  37.  
  38.     // Input
  39.     let input: Vec<String> = match reader.lines().collect() {
  40.         Err(err) => panic!("Unknown error reading input: {}", err),
  41.         Ok(result) => result,
  42.     };
  43.  
  44.     // Part 1
  45.     let part1 = input
  46.         .iter()
  47.         .map(Team::from)
  48.         .filter(|x| x.has_overlaps1())
  49.         .count();
  50.     println!("Part 1: {:?}", part1); // 450
  51.  
  52.     // Part 2
  53.     let part2 = input
  54.         .iter()
  55.         .map(Team::from)
  56.         .filter(|x| x.has_overlaps2())
  57.         .count();
  58.     println!("Part 2: {:?}", part2); // 837
  59.  
  60.     Ok(())
  61. }
  62.  
  63. fn main() {
  64.     let args: Vec<String> = env::args().collect();
  65.     let filename = &args[1];
  66.     solve(&filename).unwrap();
  67. }
  68.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement