Advertisement
nairby

AOC 2023 Day 9

Dec 9th, 2023
1,060
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.89 KB | None | 0 0
  1. use std::env;
  2. use std::io::{self, prelude::*, BufReader};
  3. use std::fs::File;
  4.  
  5. #[derive(Debug)]
  6. struct History {
  7.     values: Vec<isize>,
  8. }
  9. impl From<&String> for History {
  10.     fn from(s: &String) -> Self {
  11.         Self {
  12.             values: s.split_whitespace().map(|n| n.parse::<isize>().unwrap()).collect(),
  13.         }
  14.     }
  15. }
  16. impl History {
  17.     pub fn solve(&self) -> (isize,isize) {
  18.         // Initializations
  19.         let mut values:       Vec<isize> = self.values.clone();
  20.         let mut first_values: Vec<isize> = vec![*values.first().unwrap()];
  21.         let mut last_values:  Vec<isize> = vec![*values.last().unwrap()];
  22.         // Do diffs
  23.         loop {
  24.             let diffs: Vec<_> = values.windows(2).map(|v| v[1] - v[0]).collect();
  25.             values = diffs.clone();
  26.             first_values.push(*diffs.first().unwrap());
  27.             last_values.push( *diffs.last().unwrap());
  28.             if diffs.iter().all(|v| *v == 0isize) { break; }
  29.         }
  30.         // Identify first value
  31.         let first = first_values.iter().rev().fold(0, |acc,x| x - acc);
  32.         (last_values.iter().sum(),first)
  33.     }
  34. }
  35.  
  36. fn solve(input: &str) -> io::Result<()> {
  37.     let file = File::open(input).expect("Input file not found.");
  38.     let reader = BufReader::new(file);
  39.  
  40.     // Input
  41.     let input: Vec<String> = match reader.lines().collect() {
  42.             Err(err) => panic!("Unknown error reading input: {err}"),
  43.             Ok(result) => result,
  44.     };
  45.     let input: Vec<_> = input.iter().map(History::from).collect();
  46.  
  47.     let part1: isize = input.iter().map(|x| x.solve().0).sum();
  48.     println!("Part 1: {part1}"); // 1684566095
  49.  
  50.     let part2: isize = input.iter().map(|x| x.solve().1).sum();
  51.     println!("Part 2: {part2}"); // 1136
  52.  
  53.     Ok(())
  54. }
  55.  
  56.  
  57. fn main() {
  58.     let args: Vec<String> = env::args().collect();
  59.     let filename = &args[1];
  60.     solve(&filename).unwrap();
  61. }
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement