const std = @import("std");

const path = "data/day07/input.txt";

const crabs = 1000;
const CrabType = u11;

pub fn parseInput() anyerror![crabs]CrabType {
    const in = @embedFile(path);
    const input = std.mem.trimRight(u8, in, "\r\n");
    var crbs = std.mem.tokenize(u8, input, ",");

    var ret: [crabs]CrabType = undefined;

    var idx: usize = 0;
    while (crbs.next()) |crab| : (idx += 1) {
        const crab_pos = try std.fmt.parseUnsigned(CrabType, crab, 10);
        ret[idx] = crab_pos;
    }

    std.sort.sort(CrabType, &ret, {}, comptime std.sort.asc(CrabType));

    return ret;
}

pub fn first(allocator: ?std.mem.Allocator) anyerror!usize {
    _ = allocator;

    const crbs = try parseInput();
    const pivot = crbs[crabs / 2];

    var fuel: usize = 0;
    for (crbs) |c| {
        if (c > pivot) {
            fuel += c - pivot;
        } else {
            fuel += pivot - c;
        }
    }
    return fuel;
}

pub fn main() anyerror!void {
    var timer = try std.time.Timer.start();
    const ret = try first(null);
    const f = timer.lap() / 1000;

    try std.testing.expectEqual(ret, @as(usize, 335271));

    std.debug.print("Day 7a result: {d} \t\ttime: {d}us\n", .{ ret, f });
}

test "day07a" {
    try std.testing.expectEqual(@as(usize, 335271), try first(std.testing.allocator));
}