summaryrefslogtreecommitdiff
path: root/day06/src/main.rs
blob: e5fd0fa2f91f09df4220d3f44ba7617f76b40bda (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
use std::io;

fn main() {
    let mut rows = Vec::new();
    let mut ops = Vec::new();

    /* Part 1
    loop {
        let mut buffer = String::new();
        let bytes = io::stdin().read_line(&mut buffer).unwrap();
        if bytes == 0 {
            break;
        }
        let mut iter = buffer.trim_end().split_ascii_whitespace();
        let first = iter.next().unwrap();
        match first.parse::<i64>() {
            Ok(number) => {
                let mut numbers = Vec::new();
                numbers.push(number);
                numbers.extend(iter.map(|x| x.parse::<i64>().unwrap()));
                rows.push(numbers);
            },
            Err(_) => {
                ops.push(first.to_string());
                ops.extend(iter.map(|x| x.to_string()));
            }
        }
    }
     */

    let mut lines = Vec::new();

    loop {
        let mut buffer = String::new();
        let bytes = io::stdin().read_line(&mut buffer).unwrap();
        if bytes == 0 {
            break;
        }
        buffer.pop();
        lines.push(buffer.to_string());
    }

    ops.extend(
        lines
            .pop()
            .unwrap()
            .split_ascii_whitespace()
            .map(|x| x.to_string()),
    );

    let lines2: Vec<Vec<char>> = lines.iter().map(|x| x.chars().collect()).collect();

    let mut row = Vec::<i64>::new();

    for col in (0..lines2[0].len()).rev() {
        let mut numbers = Vec::new();
        for line in &lines2 {
            if line[col] != ' ' {
                numbers.push(line[col].to_digit(10).unwrap());
            }
        }
        match numbers.pop() {
            Some(number) => {
                let mut tmp = number;
                let mut tmp2 = 10;
                while let Some(number) = numbers.pop() {
                    tmp += number * tmp2;
                    tmp2 *= 10;
                }
                row.push(tmp.into());
            }
            None => {
                rows.insert(0, row);
                row = Vec::new();
            }
        }
    }

    rows.insert(0, row);

    let mut column = Vec::new();

    for col in 0..ops.len() {
        let mut result = 0;
        match ops[col].as_str() {
            "+" => {
                for row in &rows[col] {
                    result += row;
                }
            }
            "*" => {
                result = 1;
                for row in &rows[col] {
                    result *= row;
                }
            }
            &_ => todo!(),
        }
        column.push(result);
    }

    println!("{}", column.iter().sum::<i64>())
}