82 lines
1.7 KiB
Zig
82 lines
1.7 KiB
Zig
const std = @import("std");
|
|
const alloc = std.heap.page_allocator;
|
|
|
|
pub const Races = struct {
|
|
times: List(u32),
|
|
distances: List(u32),
|
|
|
|
pub fn deinit(self: Races) void {
|
|
self.times.deinit();
|
|
self.distances.deinit();
|
|
}
|
|
};
|
|
|
|
const List = std.ArrayList;
|
|
|
|
pub fn calculate(time: u64, record_dist: u64) u64 {
|
|
var min: u64 = undefined;
|
|
|
|
for (1..time) |speed| {
|
|
const rem_race_time = time - speed;
|
|
const dist = rem_race_time * speed;
|
|
if (dist > record_dist) {
|
|
min = @intCast(speed);
|
|
break;
|
|
}
|
|
}
|
|
|
|
var max: u64 = undefined;
|
|
|
|
var speed: u64 = time - 1;
|
|
while (speed > 0) {
|
|
const rem_race_time = time - speed;
|
|
const dist = rem_race_time * speed;
|
|
|
|
if (dist > record_dist) {
|
|
max = speed;
|
|
break;
|
|
}
|
|
|
|
speed -= 1;
|
|
}
|
|
|
|
return max - min + 1;
|
|
}
|
|
|
|
pub fn parse(data: []const u8) !Races {
|
|
var lines = std.mem.tokenizeScalar(u8, data, '\n');
|
|
|
|
var times = List(u32).init(alloc);
|
|
|
|
{
|
|
const line = lines.next().?;
|
|
var numbers = std.mem.tokenizeScalar(u8, line, ' ');
|
|
_ = numbers.next();
|
|
|
|
while (numbers.next()) |num_str| {
|
|
const num = try std.fmt.parseInt(u32, num_str, 10);
|
|
try times.append(num);
|
|
}
|
|
}
|
|
|
|
var dists = List(u32).init(alloc);
|
|
|
|
{
|
|
const line = lines.next().?;
|
|
var numbers = std.mem.tokenizeScalar(u8, line, ' ');
|
|
_ = numbers.next();
|
|
|
|
while (numbers.next()) |num_str| {
|
|
const num = try std.fmt.parseInt(u32, num_str, 10);
|
|
try dists.append(num);
|
|
}
|
|
}
|
|
|
|
const races = .{
|
|
.times = times,
|
|
.distances = dists,
|
|
};
|
|
|
|
return races;
|
|
}
|