const std = @import("std"); const print = std.debug.print; const assert = std.debug.assert; const ArrayList = std.ArrayList; const HashMap = std.HashMap; const mem = std.mem; const fin = mem.trim(u8, @embedFile("./input.txt"), &std.ascii.whitespace); var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const allocator = gpa.allocator(); fn evalutate(rd: i64, rt: i64) u64 { var timesBeat: u64 = 0; for (1..@bitCast(rt + 1)) |tt| { const t: i64 = @bitCast(tt); const d = t * rt - t * t; if (d > rd) { timesBeat += 1; } } assert(timesBeat != 0); return timesBeat; } pub fn part1(recTimes: []const i64, recDists: []const i64) void { var ans: u64 = 1; for (recDists, recTimes) |rd, rt| { ans *= evalutate(rd, rt); } print("{d}\n", .{ans}); } pub fn part2(recTimes: []const []const u8, recDists: []const []const u8) void { const rtStr = mem.concat(allocator, u8, recTimes) catch unreachable; const rdStr = mem.concat(allocator, u8, recDists) catch unreachable; defer { allocator.free(rtStr); allocator.free(rdStr); } const rt = std.fmt.parseInt(i64, rtStr, 10) catch unreachable; const rd = std.fmt.parseInt(i64, rdStr, 10) catch unreachable; const ans = evalutate(rd, rt); print("{d}\n", .{ans}); } pub fn main() !void { var recTimes = ArrayList(i64).init(allocator); var recDists = ArrayList(i64).init(allocator); var recTimesStr = ArrayList([]const u8).init(allocator); var recDistsStr = ArrayList([]const u8).init(allocator); defer { recTimes.deinit(); recDists.deinit(); recTimesStr.deinit(); recDistsStr.deinit(); } var splitLines = mem.splitScalar(u8, fin, '\n'); var timesText = mem.splitScalar(u8, splitLines.next().?, ' '); var distsText = mem.splitScalar(u8, splitLines.next().?, ' '); _ = timesText.next().?; _ = distsText.next().?; while (timesText.next()) |time| { try recTimes.append(std.fmt.parseInt(i64, time, 10) catch continue); try recTimesStr.append(time); } while (distsText.next()) |dist| { try recDists.append(std.fmt.parseInt(i64, dist, 10) catch continue); try recDistsStr.append(dist); } part1(recTimes.items, recDists.items); part2(recTimesStr.items, recDistsStr.items); }