const std = @import("std");
const path = "data/day07/input.txt";
const crabs = 1000;
const CrabType = u11;
const P2 = struct {
crs: [crabs]CrabType = undefined,
sum: usize,
};
fn parseInput() anyerror!P2 {
const in = @embedFile(path);
const input = std.mem.trimRight(u8, in, "\r\n");
var crbs = std.mem.tokenize(u8, input, ",");
var ret = P2{ .sum = 0 };
var idx: usize = 0;
while (crbs.next()) |crab| : (idx += 1) {
const crab_pos = try std.fmt.parseUnsigned(CrabType, crab, 10);
ret.crs[idx] = crab_pos;
ret.sum += crab_pos;
}
ret.sum = ret.sum / crabs;
return ret;
}
pub fn second(allocator: ?std.mem.Allocator) anyerror!usize {
_ = allocator;
const crbs = try parseInput();
var fuel: usize = 0;
for (crbs.crs) |c| {
var diff: usize = undefined;
if (c > crbs.sum) {
diff = c - crbs.sum;
} else {
diff = crbs.sum - c;
}
fuel += (diff * (diff + 1)) / 2;
}
return fuel;
}
pub fn main() anyerror!void {
var timer = try std.time.Timer.start();
const ret = try second(null);
const s = timer.lap() / 1000;
try std.testing.expectEqual(ret, @as(usize, 95851339));
std.debug.print("Day 7b result: {d} \ttime: {d}us\n", .{ ret, s });
}
test "day07b" {
try std.testing.expectEqual(@as(usize, 95851339), try second(std.testing.allocator));
}