summaryrefslogtreecommitdiff
path: root/01/src/part-2.rs
blob: e0f972557054eac473e0bfcf30bd2327c4af86f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use std::io::{BufRead};

fn insert_and_shift<T: Copy + PartialOrd, const N: usize>(x: &mut [T; N], y: T) {
    let idx = x.partition_point(|&z| y <= z);
    if idx >= N { return; }
    for i in (idx..N-1).rev() {
        x[i+1] = x[i];
    }
    x[idx] = y;
}

fn main() {
    let stdin = std::io::stdin();
    let handle = stdin.lock();

    let mut top: [usize; 3] = [0, 0, 0];
    let mut sum: usize = 0;

    for l in handle.lines() {
        let line = l.unwrap();
        match line.parse::<usize>() {
            Ok(n) => {
                sum += n;
            }
            Err(_) => {
                insert_and_shift(&mut top, sum);
                sum = 0;
            }
        }
    }
    insert_and_shift(&mut top, sum);
    sum = 0;
    
    println!("{}", top.into_iter().sum::<usize>());
}