about summary refs log tree commit diff
path: root/aoc/2021/05/part-two.zig
blob: 2c7ed838bebf4f617a10bb897cf308c9fea494e1 (plain) (blame)
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
const allocator = std.heap.page_allocator;
const parseUnsigned = std.fmt.parseUnsigned;
const print = std.debug.print;
const set = std.mem.set;
const swap = std.mem.swap;
const std = @import("std");
const tokenize = std.mem.tokenize;

inline fn index(x: usize, y: usize) usize {
    return x * 1000 + y;
}

pub fn main() !void {
    const diagram = try allocator.alloc(u16, 1_000_000);
    defer allocator.free(diagram);
    set(u16, diagram, 0);

    var input = tokenize(@embedFile("input"), "\n");
    while (input.next()) |line| {
        var segment = tokenize(line, " -> ");
        var point = tokenize(segment.next().?, ",");
        var x1 = try parseUnsigned(usize, point.next().?, 10);
        var y1 = try parseUnsigned(usize, point.next().?, 10);
        point = tokenize(segment.next().?, ",");
        var x2 = try parseUnsigned(usize, point.next().?, 10);
        var y2 = try parseUnsigned(usize, point.next().?, 10);

        if (x1 == x2) {
            if (y1 > y2) swap(usize, &y1, &y2);
            while (y1 <= y2) : (y1 += 1)
                diagram[index(x1, y1)] += 1;
        } else if (y1 == y2) {
            if (x1 > x2) swap(usize, &x1, &x2);
            while (x1 <= x2) : (x1 += 1)
                diagram[index(x1, y1)] += 1;
        } else while (true) {
            diagram[index(x1, y1)] += 1;
            if (x1 == x2 or y1 == y2) break;
            if (x1 > x2) x1 -= 1 else x1 += 1;
            if (y1 > y2) y1 -= 1 else y1 += 1;
        }
    }

    var result: usize = 0;
    for (diagram) |point|
        result += @boolToInt(point > 1);
    print("{}\n", .{ result });
}