summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: ec8584361c64ac750583729e5f066837942093d9 (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use std::fs;

enum Color {
    Red,
    Blue,
    Green
}

const GREENMAX: u32 = 13;
const REDMAX: u32 = 12;
const BLUEMAX: u32 = 14;

fn main() {
    let f = fs::read_to_string("input").unwrap();
    let mut count = 0;
    let mut count2 = 0;

    for line in f.split("\n") {

        // Separate game number and data
        let colonidx = line.find(':').unwrap();
        let (game, data) = line.split_at(colonidx);

        // Get game number
        let game: Vec<&str> = game.split_whitespace().collect();
        let game = game.get(game.len() - 1).unwrap();
        let game: u32 = game.parse().unwrap();
        println!("{}", game);

        // Separate game data
        let data = data.replace(':', "");
        let data: Vec<(u32, Vec<(u32, Color)>)> = data.split(";").map(|x| {
            // Separate game rolls
            let x: Vec<&str> = x.split(",").collect();

            let mut fin = (game, vec![]);

            for roll in x {
                let mut roll = roll.split_whitespace();
                let amount: u32 = roll.next().unwrap().parse().unwrap();
                let color = match roll.next().unwrap() {
                    "blue" => Color::Blue,
                    "red" => Color::Red,
                    "green" => Color::Green,
                    _ => panic!(),
                };

                fin.1.push((amount, color));
            }

            return fin;
        }).collect();

        // let mut count = 0;
        // println!("process data");
        let mut failed = false;
        let mut game = 0;
        let mut red = 0;
        let mut green = 0;
        let mut blue = 0;

        
        for entry in data {
            game = entry.0;

            for e in entry.1 {
                match e.1 {
                    Color::Blue => {
                        if e.0 > blue {
                            // println!("{}", e.0);
                            blue = e.0;
                        }

                        if e.0 > BLUEMAX {
                            failed = true;
                        }
                    },
                    Color::Green => {
                        if e.0 > green {
                            green = e.0;
                        }

                        if e.0 > GREENMAX {
                            failed = true;
                        }
                    },
                    Color::Red => {
                        if e.0 > red {
                            red = e.0;
                        }
                    
                        if e.0 > REDMAX {

                            failed = true;
                        }
                    },
                }
            }
        }
        // println!("{}", red * green * blue);
        count2 += red * green * blue;

        if failed == false {
            // println!("one");
            count += game;
        }
        
        println!("\n");
    }

    println!("\npart one:{}", count);
    println!("part two:{}", count2);
}