Compare commits
1 Commits
c737a84703
...
24669a60f0
Author | SHA1 | Date | |
---|---|---|---|
24669a60f0 |
@ -20,41 +20,48 @@ const Race = struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
fn solve(alloc: mem.Allocator, input: []const u8) !Solution {
|
fn solve(alloc: mem.Allocator, input: []const u8) !Solution {
|
||||||
var result: usize = 1;
|
const races: []Race = r: {
|
||||||
{
|
|
||||||
var it = util.splitLines(input);
|
var it = util.splitLines(input);
|
||||||
const times = try util.parseIntsScalar(usize, alloc, it.next().?[10..], .{});
|
const times = try util.parseIntsScalar(usize, alloc, it.next().?[10..], .{});
|
||||||
const distances = 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(times);
|
||||||
defer alloc.free(distances);
|
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);
|
||||||
|
|
||||||
for (times, distances) |time, minDistance| {
|
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);
|
||||||
|
}
|
||||||
|
break :r .{ .time = vals[0], .distance = vals[1] };
|
||||||
|
};
|
||||||
|
|
||||||
|
var result: usize = 1;
|
||||||
|
for (races) |race| {
|
||||||
var winning: usize = 0;
|
var winning: usize = 0;
|
||||||
for (0..time - 1) |speed| {
|
for (0..race.time - 1) |speed| {
|
||||||
const distance = speed * (time - speed);
|
const distance = speed * (race.time - speed);
|
||||||
if (distance > minDistance) winning += 1;
|
if (distance > race.distance) winning += 1;
|
||||||
}
|
}
|
||||||
result *= winning;
|
result *= winning;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
var result2: usize = 1;
|
var result2: usize = 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;
|
var winning2: usize = 0;
|
||||||
for (0..td[0] - 1) |speed| {
|
for (0..bigRace.time - 1) |speed| {
|
||||||
const distance = speed * (td[0] - speed);
|
const distance = speed * (bigRace.time - speed);
|
||||||
if (distance > td[1]) winning2 += 1;
|
if (distance > bigRace.distance) winning2 += 1;
|
||||||
}
|
}
|
||||||
result2 *= winning2;
|
result2 *= winning2;
|
||||||
}
|
|
||||||
|
|
||||||
return .{ .a = result, .b = result2 };
|
return .{ .a = result, .b = result2 };
|
||||||
}
|
}
|
||||||
@ -74,5 +81,5 @@ test "gold" {
|
|||||||
\\Distance: 9 40 200
|
\\Distance: 9 40 200
|
||||||
;
|
;
|
||||||
const sln = try solve(std.testing.allocator, input);
|
const sln = try solve(std.testing.allocator, input);
|
||||||
try std.testing.expectEqual(@as(usize, 71503), sln.b);
|
try std.testing.expectEqual(@as(usize, 288), sln.b);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user