Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::io;
- use std::time::Instant;
- fn read_input() -> Vec<Vec<i32>> {
- use std::io::prelude::*;
- let stdin = io::stdin();
- stdin
- .lock()
- .lines()
- .map(|x| x.unwrap())
- .map(|x| x.split_whitespace().map(|x| x.parse().unwrap()).collect())
- .collect()
- }
- fn diffs(nums: &[i32]) -> Vec<i32> {
- let mut res: Vec<i32> = Vec::with_capacity(nums.len() - 1);
- for i in 1..nums.len() {
- res.push(nums[i] - nums[i - 1]);
- }
- res
- }
- fn next(nums: &[i32]) -> i32 {
- let ndiffs = diffs(&nums);
- if ndiffs.iter().all(|&x| x == 0) {
- return nums[0];
- }
- nums[nums.len() - 1] + next(&ndiffs)
- }
- fn part1(nums: &[Vec<i32>]) -> i32 {
- nums.iter().map(|x| next(x)).sum()
- }
- fn part2(nums: &[Vec<i32>]) -> i32 {
- nums.iter()
- .map(|x| next(&x.into_iter().rev().map(|&i| i).collect::<Vec<_>>()))
- .sum()
- }
- fn main() {
- let s = Instant::now();
- let lines = read_input();
- let s1 = Instant::now();
- println!("{}", part1(&lines));
- let e1 = s1.elapsed();
- let s2 = Instant::now();
- println!("{}", part2(&lines));
- let e2 = s2.elapsed();
- let e = s.elapsed();
- println!("Time for part1: {:?}, part2: {:?}, total: {:?}", e1, e2, e);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement