summaryrefslogtreecommitdiff
path: root/2020/Rust/src/day4.rs
blob: 113e83878fe1f8bbe349e28eb2f34f99e457a910 (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#[derive(Debug)]
struct Passport {
    byr: Option<usize>,
    iyr: Option<usize>,
    eyr: Option<usize>,
    hgt: Option<usize>,
    hcl: Option<String>,
    ecl: Option<String>,
    pid: Option<String>,
    cid: Option<usize>,
}

impl Passport {
    fn new() -> Self {
        Self {
            byr: None,
            iyr: None,
            eyr: None,
            hgt: None,
            hcl: None,
            ecl: None,
            pid: None,
            cid: None,
        }
    }
}

impl From<&str> for Passport {
    fn from(value: &str) -> Self {
        let mut passport = Passport::new();
        let v = value.replace("\n", " ");
        let v: Vec<&str> = v.split(" ").collect();
        for ele in v {
            if ele.is_empty() {
                continue;
            }
            let (key, value) = ele.split_once(':').unwrap();
            match key {
                "byr" => passport.byr = Some(value.parse::<usize>().unwrap()),
                "iyr" => passport.iyr = Some(value.parse::<usize>().unwrap()),
                "eyr" => passport.eyr = Some(value.parse::<usize>().unwrap()),
                "hgt" => {
                    passport.hgt = Some(
                        value
                            .trim_end_matches(|c| c == 'c' || c == 'm' || c == 'i' || c == 'n')
                            .parse::<usize>()
                            .unwrap(),
                    )
                }
                "hcl" => passport.hcl = Some(value.to_string()),
                "ecl" => passport.ecl = Some(value.to_string()),
                "pid" => passport.pid = Some(value.to_string()),
                "cid" => passport.cid = Some(value.parse::<usize>().unwrap()),
                _ => unreachable!(),
            }
        }
        passport
    }
}

fn solve_part_one(input: &str) -> usize {
    let mut cnt: usize = 0;
    let passports: Vec<Passport> = input
        .split("\n\n")
        .map(|pass| Passport::from(pass))
        .collect();
    for passport in passports {
        if passport.byr == None
            || passport.iyr == None
            || passport.eyr == None
            || passport.hgt == None
            || passport.hcl == None
            || passport.ecl == None
            || passport.pid == None
        {
            continue;
        }
        cnt += 1;
    }
    cnt
}

fn solve_part_two(input: &str) -> usize {
    todo!()
}

fn main() {
    let test = include_str!("../input/day_4.test");
    let prod = include_str!("../input/day_4.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));
}