Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::env;
- use std::io::{self, prelude::*, BufReader};
- use std::fs::File;
- #[derive(Debug)]
- struct History {
- values: Vec<isize>,
- }
- impl From<&String> for History {
- fn from(s: &String) -> Self {
- Self {
- values: s.split_whitespace().map(|n| n.parse::<isize>().unwrap()).collect(),
- }
- }
- }
- impl History {
- pub fn solve(&self) -> (isize,isize) {
- // Initializations
- let mut values: Vec<isize> = self.values.clone();
- let mut first_values: Vec<isize> = vec![*values.first().unwrap()];
- let mut last_values: Vec<isize> = vec![*values.last().unwrap()];
- // Do diffs
- loop {
- let diffs: Vec<_> = values.windows(2).map(|v| v[1] - v[0]).collect();
- values = diffs.clone();
- first_values.push(*diffs.first().unwrap());
- last_values.push( *diffs.last().unwrap());
- if diffs.iter().all(|v| *v == 0isize) { break; }
- }
- // Identify first value
- let first = first_values.iter().rev().fold(0, |acc,x| x - acc);
- (last_values.iter().sum(),first)
- }
- }
- fn solve(input: &str) -> io::Result<()> {
- let file = File::open(input).expect("Input file not found.");
- let reader = BufReader::new(file);
- // Input
- let input: Vec<String> = match reader.lines().collect() {
- Err(err) => panic!("Unknown error reading input: {err}"),
- Ok(result) => result,
- };
- let input: Vec<_> = input.iter().map(History::from).collect();
- let part1: isize = input.iter().map(|x| x.solve().0).sum();
- println!("Part 1: {part1}"); // 1684566095
- let part2: isize = input.iter().map(|x| x.solve().1).sum();
- println!("Part 2: {part2}"); // 1136
- Ok(())
- }
- fn main() {
- let args: Vec<String> = env::args().collect();
- let filename = &args[1];
- solve(&filename).unwrap();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement