Advertisement
Guest User

Untitled

a guest
Dec 4th, 2019
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.90 KB | None | 0 0
  1. use std::env;
  2. use std::io::{self, prelude::*, BufReader};
  3. use std::fs::File;
  4.  
  5. //extern crate regex;
  6. //use regex::Regex;
  7. extern crate fancy_regex;
  8. use fancy_regex::Regex;
  9.  
  10. fn main() {
  11.     let args: Vec<String> = env::args().collect();
  12.     let filename = &args[1];
  13.     day04(&filename).unwrap();
  14. }
  15.  
  16. fn validate_part1(input: u64) -> bool {
  17.     let digits: Vec<_> = input.to_string().chars().map(|n| n.to_digit(10).unwrap()).collect();
  18.  
  19.     // Check never decreases
  20.     for i in 1..digits.len() {
  21.         if &digits[i] < &digits[i-1] { return false; }
  22.     }
  23.  
  24.     // Check for existence of pair
  25.     for i in 1..digits.len() {
  26.         if &digits[i] == &digits[i-1] { return true; }
  27.     }
  28.     false
  29. }
  30.  
  31. fn validate_part2(input: u64) -> bool {
  32.     let digits: Vec<_> = input.to_string().chars().map(|n| n.to_digit(10).unwrap()).collect();
  33.  
  34.     // Check never decreases
  35.     for i in 1..digits.len() {
  36.         if &digits[i] < &digits[i-1] { return false; }
  37.     }
  38.  
  39.     // Check for existence of pair
  40.     let re = Regex::new(r"(?:^|(.)(?!\1))(\d)\2(?!\2)").unwrap();
  41.     if re.is_match(&input.to_string()).unwrap() { return true; }
  42.     false
  43. }
  44.  
  45. fn day04(input: &str) -> io::Result<()> {
  46.     let file = File::open(input).expect("Input file not found.");
  47.     let reader = BufReader::new(file);
  48.  
  49.     let input: Vec<String> = match reader.lines().collect() {
  50.         Err(err) => panic!("Unknown error reading input: {}", err),
  51.         Ok(result) => result,
  52.     };
  53.     let input = input.concat();
  54.  
  55.     let start_end: Vec<_> = input.split("-").map(|n| n.parse::<u64>().unwrap()).collect();
  56.     let start = start_end[0];
  57.     let end = start_end[1];
  58.  
  59.     let part1 = (start..=end).filter(|pw| validate_part1(*pw)).count();
  60.     println!("Part 1: {}", part1); // 1855
  61.  
  62.     let part2 = (start..=end).filter(|pw| validate_part2(*pw)).count();
  63.     println!("Part 1: {}", part2); // 1253
  64.  
  65.     Ok(())
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement