summaryrefslogtreecommitdiff
path: root/2020/Rust/src/day1.rs
blob: 9a84dd4a3448f6f61a8a97f1979f2a3d0f549685 (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
43
44
45
46
47
use std::collections::HashSet;

fn solve_part_one(input: &str) -> i32 {
    let mut seen = HashSet::new();
    let numbers: Vec<i32> = input
        .lines()
        .map(|line| line.trim().parse().unwrap())
        .collect();

    for &number in &numbers {
        let complement = 2020 - number;
        if seen.contains(&complement) {
            return number * complement;
        }
        seen.insert(number);
    }
    panic!("No two numbers sum to 2020!");
}

fn solve_part_two(input: &str) -> i32 {
    let numbers: Vec<i32> = input
        .lines()
        .map(|line| line.trim().parse().unwrap())
        .collect();

    for (i, &first) in numbers.iter().enumerate() {
        let mut seen = HashSet::new();
        let target_sum = 2020 - first;
        for &second in &numbers[i + 1..] {
            let complement = target_sum - second;
            if seen.contains(&complement) {
                return first * second * complement;
            }
            seen.insert(second);
        }
    }
    panic!("No three numbers sum to 2020!");
}

fn main() {
    let test = include_str!("../input/day_1.test");
    let prod = include_str!("../input/day_1.prod");
    println!("Test_1: {}", solve_part_one(test));
    println!("Prod_1: {}", solve_part_one(prod));
    println!("Test_2: {}", solve_part_two(test));
    println!("Prod_2: {}", solve_part_two(prod));
}