Solutions of most (39 out of 50 so far) puzzles in Zig (system language, alternative for C). My first experience with it.
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

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)});
}