summaryrefslogtreecommitdiff
path: root/src/day06.zig
blob: 410580077681f3f561019006092b4c79362d2539 (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
const std = @import("std");
const print = std.debug.print;

pub fn solve(part: []u8, reader: *std.Io.Reader, allocator: std.mem.Allocator) !void {
    if (std.mem.eql(u8, part, "1")) {
        try part1(reader, allocator);
    } else {
        try part2(reader, allocator);
    }
}

fn part1(reader: *std.Io.Reader, allocator: std.mem.Allocator) !void {
    var output: usize = 0;
    var problems = try std.ArrayList(std.ArrayList(usize)).initCapacity(allocator, 0);
    defer problems.deinit(allocator);

    while (reader.takeDelimiter('\n')) |line| {
        if (line == null) {
            break;
        }

        var split = std.mem.splitScalar(u8, line.?, ' ');
        var n: usize = 0;
        while(split.next()) |part| {
            if (part.len > 0){

                if (part[0] == '+') {
                    for(problems.items[n].items) |number| {
                        output += number;
                    }
                    problems.items[n].deinit(allocator);
                } else if (part[0] == '*') {
                    var tmp: usize = 1;
                    for(problems.items[n].items) |number| {
                        tmp *= number;
                    }
                    output += tmp;
                    problems.items[n].deinit(allocator);
                } else {
                    const number = try std.fmt.parseInt(usize, part, 10);

                    if (n >= problems.items.len) {
                        try  problems.append(allocator, try std.ArrayList(usize).initCapacity(allocator, 0));
                    }

                    try problems.items[n].append(allocator, number);
                }

                n += 1;
            }
        }

    } else |_| {}

    print("{d}\n", .{output});
}


fn part2(reader: *std.Io.Reader, allocator: std.mem.Allocator) !void {
    var output: usize = 0;
    var problems = try std.ArrayList([]u8).initCapacity(allocator, 0);
    defer problems.deinit(allocator);

    while (reader.takeDelimiter('\n')) |line| {
        if (line == null) {
            break;
        }

        try problems.append(allocator, line.?);
    } else |_| {}


    var n: usize = 0;
    var accum: usize = 1;
    var operator = problems.items[problems.items.len - 1][0];
    while(n < problems.items[0].len) {
        var number: usize = 0;
        for (0..problems.items.len - 1) |i| {
            if (problems.items[i][n] != ' ') {
                number *= 10;
                number += problems.items[i][n] - '0';
            }
        }

        n += 1;
        if (number == 0) {
            if (operator == '*') {
                output += accum;
            }
            operator = problems.items[problems.items.len - 1][n];
            accum = 1;
        } else if (operator == '+') {
            output += number;
        } else {
            accum *= number;
        }
    }

    print("{d}\n", .{output});
}