Advertisement
Guest User

Untitled

a guest
Dec 10th, 2023
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.27 KB | None | 0 0
  1. use std::io;
  2. use std::time::Instant;
  3.  
  4. fn read_input() -> Vec<Vec<i32>> {
  5.     use std::io::prelude::*;
  6.     let stdin = io::stdin();
  7.     stdin
  8.         .lock()
  9.         .lines()
  10.         .map(|x| x.unwrap())
  11.         .map(|x| x.split_whitespace().map(|x| x.parse().unwrap()).collect())
  12.         .collect()
  13. }
  14.  
  15. fn diffs(nums: &[i32]) -> Vec<i32> {
  16.     let mut res: Vec<i32> = Vec::with_capacity(nums.len() - 1);
  17.     for i in 1..nums.len() {
  18.         res.push(nums[i] - nums[i - 1]);
  19.     }
  20.     res
  21. }
  22.  
  23. fn next(nums: &[i32]) -> i32 {
  24.     let ndiffs = diffs(&nums);
  25.     if ndiffs.iter().all(|&x| x == 0) {
  26.         return nums[0];
  27.     }
  28.  
  29.     nums[nums.len() - 1] + next(&ndiffs)
  30. }
  31.  
  32. fn part1(nums: &[Vec<i32>]) -> i32 {
  33.     nums.iter().map(|x| next(x)).sum()
  34. }
  35.  
  36. fn part2(nums: &[Vec<i32>]) -> i32 {
  37.     nums.iter()
  38.         .map(|x| next(&x.into_iter().rev().map(|&i| i).collect::<Vec<_>>()))
  39.         .sum()
  40. }
  41.  
  42. fn main() {
  43.     let s = Instant::now();
  44.     let lines = read_input();
  45.     let s1 = Instant::now();
  46.     println!("{}", part1(&lines));
  47.     let e1 = s1.elapsed();
  48.     let s2 = Instant::now();
  49.     println!("{}", part2(&lines));
  50.     let e2 = s2.elapsed();
  51.     let e = s.elapsed();
  52.     println!("Time for part1: {:?}, part2: {:?}, total: {:?}", e1, e2, e);
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement