summary refs log blame commit diff
path: root/1/part2.zig
blob: aad482c22eecf86e599830c4ef35190a9171b97b (plain) (tree)
































































                                                                                  
const std = @import("std");

pub fn main() !void {
    var file = try std.fs.cwd().openFile("input", .{});
    defer file.close();

    var reader = file.reader();
    var output: [100]u8 = undefined;
    var output_fbs = std.io.fixedBufferStream(&output);
    const writer = output_fbs.writer();

    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    const allocator = gpa.allocator();
    var list1 = std.ArrayList(i32).init(allocator);
    defer list1.deinit();
    var map = std.AutoHashMap(i32, i32).init(allocator);
    defer map.deinit();

    while (true) {
        reader.streamUntilDelimiter(writer, '\n', null) catch |err| {
            switch (err) {
                error.EndOfStream => {
                    output_fbs.reset(); // clear buffer before exit
                    break;
                }, // file read till the end
                else => {
                    std.debug.print("Error while reading file: {any}\n", .{err});
                    return err;
                },
            }
        };

        const line = output_fbs.getWritten();
        std.debug.print("Line: {s}\n", .{line});
        var split = std.mem.splitSequence(u8, line, "   ");

        // TODO
        const on = split.next().?;
        const tw = split.next().?;
        const one: i32 = try std.fmt.parseInt(i32, on, 10);
        const two: i32 = try std.fmt.parseInt(i32, tw, 10);

        try list1.append(one);

        const val = map.get(two) orelse 0;

        try map.put(two, val + 1);

        // since steamUntilDelimiter keeps appending the read bytes to the buffer
        // we should clear it on every iteration so that only individual lines are
        // displayed on each iteration.
        output_fbs.reset();
    }

    var similarity_score: i32 = 0;

    for (list1.items) |item| {
        const val = map.get(item) orelse 0;
        similarity_score += item * val;
    }

    std.debug.print("Similarity score: {d}\n", .{similarity_score});

    std.debug.print("Hello, {s}!\n", .{"World"});
}