summaryrefslogtreecommitdiff
path: root/2024/05/rust/src/main.rs
blob: 0db788d34fb8e57e6d89681a1a54356d0ffb3778 (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
36
37
38
39
40
41
42
#![feature(slice_split_once)]

use std::cmp::Ordering::{Greater, Less};
use std::collections::HashSet;
use std::io;

fn main() -> io::Result<()> {
    let mut lines = io::stdin().lines().flatten();
    let mut set = HashSet::<(u16, u16)>::new();

    while let Some(s) = lines.next() {
        if let Some((a, b)) = s.split_once('|') {
            set.insert((a.parse().unwrap(), b.parse().unwrap()));
        } else {
            break;
        }
    }

    let mut silver: usize = 0;
    let mut gold: usize = 0;

    for line in lines {
        let mut nums: Vec<u16> = line.split(',').map(|n| n.parse().unwrap()).collect();
        let mid = nums.len() / 2;

        if nums.is_sorted_by(|&a, &b| set.contains(&(a, b))) {
            silver += nums[mid] as usize;
        } else {
            gold += *nums
                .select_nth_unstable_by(mid, |&a, &b| match set.contains(&(a, b)) {
                    true => Less,
                    false => Greater,
                })
                .1 as usize;
        }
    }

    println!("silver: {silver}");
    println!("gold: {gold}");

    return Ok(());
}