1
0

unwash day06 or something
Some checks failed
Build and test / test (push) Failing after 2m34s

This commit is contained in:
xeals 2023-12-06 16:31:54 +11:00
parent d848f3951b
commit fbca1996a5
Signed by: xeals
SSH Key Fingerprint: SHA256:pRv+8swQDA+/LuZ7NHj9m006BbKexlNK62OUA01ZZBc

View File

@ -14,54 +14,42 @@ const Solution = struct {
b: usize,
};
const Race = struct {
time: usize,
distance: usize,
};
fn solve(alloc: mem.Allocator, input: []const u8) !Solution {
const races: []Race = r: {
var result: usize = 1;
{
var it = util.splitLines(input);
const times = try util.parseIntsScalar(usize, alloc, it.next().?[10..], .{});
const distances = try util.parseIntsScalar(usize, alloc, it.next().?[10..], .{});
defer alloc.free(times);
defer alloc.free(distances);
var al = try std.ArrayList(Race).initCapacity(alloc, times.len);
for (times, distances) |t, d| {
try al.append(.{ .time = t, .distance = d });
}
break :r try al.toOwnedSlice();
};
defer alloc.free(races);
const bigRace: Race = r: {
var it = util.splitLines(input);
var vals: [2]usize = undefined;
for (0..vals.len) |i| {
const line = try mem.replaceOwned(u8, alloc, it.next().?[10..], " ", "");
defer alloc.free(line);
vals[i] = try std.fmt.parseInt(usize, line, 10);
for (times, distances) |time, minDistance| {
var winning: usize = 0;
for (0..time - 1) |speed| {
const distance = speed * (time - speed);
if (distance > minDistance) winning += 1;
}
result *= winning;
}
break :r .{ .time = vals[0], .distance = vals[1] };
};
var result: usize = 1;
for (races) |race| {
var winning: usize = 0;
for (0..race.time - 1) |speed| {
const distance = speed * (race.time - speed);
if (distance > race.distance) winning += 1;
}
result *= winning;
}
var result2: usize = 1;
var winning2: usize = 0;
for (0..bigRace.time - 1) |speed| {
const distance = speed * (bigRace.time - speed);
if (distance > bigRace.distance) winning2 += 1;
{
var it = util.splitLines(input);
var td: [2]usize = undefined;
for (0..td.len) |i| {
const line = try mem.replaceOwned(u8, alloc, it.next().?[10..], " ", "");
defer alloc.free(line);
td[i] = try std.fmt.parseInt(usize, line, 10);
}
var winning2: usize = 0;
for (0..td[0] - 1) |speed| {
const distance = speed * (td[0] - speed);
if (distance > td[1]) winning2 += 1;
}
result2 *= winning2;
}
result2 *= winning2;
return .{ .a = result, .b = result2 };
}