You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.5 KiB
53 lines
1.5 KiB
const std = @import("std");
|
|
|
|
fn addDigit(result: anytype, digit: u8) void {
|
|
result.* = (result.* * 10) + (digit - '0');
|
|
}
|
|
|
|
fn parseLine(line: []const u8) u64 {
|
|
var index: usize = 9;
|
|
while (line[index] == ' ') : (index += 1) {}
|
|
|
|
var result: u64 = 0;
|
|
while (index < line.len) : (index += 1) {
|
|
if (line[index] != ' ') {
|
|
addDigit(&result, line[index]);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
fn solve(time: u64, distance: u64) u64 {
|
|
// Boundaries:
|
|
// x * (time - x) = distance
|
|
// x^2 - time*x + distance = 0
|
|
// x = (time/2) +- sqrt((time/2)^2 - 4*distance)
|
|
|
|
//std.debug.print("computing for time = {d} distance = {d}\n", .{ time, distance });
|
|
const deviationx2 = std.math.sqrt(time * time - 4 * distance);
|
|
|
|
var min = ((time - deviationx2) / 2) - 5;
|
|
var max = ((time + deviationx2) / 2) - 5;
|
|
|
|
while (min * (time - min) <= distance) : (min += 1) {}
|
|
while (max * (time - max) > distance) : (max += 1) {}
|
|
|
|
//std.debug.print("min = {d}, max = {d}\n", .{ min, max });
|
|
|
|
return max - min;
|
|
}
|
|
|
|
pub fn main() !void {
|
|
const stdout = std.io.getStdOut().writer();
|
|
|
|
const raw_in = std.io.getStdIn();
|
|
var buffered_reader = std.io.bufferedReader(raw_in.reader());
|
|
var reader = buffered_reader.reader();
|
|
|
|
var line_buffer: [1000]u8 = undefined;
|
|
var times = parseLine((try reader.readUntilDelimiterOrEof(&line_buffer, '\n')).?);
|
|
var distances = parseLine((try reader.readUntilDelimiterOrEof(&line_buffer, '\n')).?);
|
|
|
|
try stdout.print("{d}\n", .{solve(times, distances)});
|
|
}
|
|
|