diff --git a/2023/day-06/common.zig b/2023/day-06/common.zig new file mode 100644 index 0000000..ec11ae3 --- /dev/null +++ b/2023/day-06/common.zig @@ -0,0 +1,51 @@ +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 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; +} diff --git a/2023/day-06/inputs/puzzle.txt b/2023/day-06/inputs/puzzle.txt new file mode 100644 index 0000000..004fb1d --- /dev/null +++ b/2023/day-06/inputs/puzzle.txt @@ -0,0 +1,2 @@ +Time: 40 82 91 66 +Distance: 277 1338 1349 1063 \ No newline at end of file diff --git a/2023/day-06/inputs/sample.txt b/2023/day-06/inputs/sample.txt new file mode 100644 index 0000000..b39f49d --- /dev/null +++ b/2023/day-06/inputs/sample.txt @@ -0,0 +1,2 @@ +Time: 7 15 30 +Distance: 9 40 200 \ No newline at end of file diff --git a/2023/day-06/part_one.zig b/2023/day-06/part_one.zig new file mode 100644 index 0000000..13f6fe8 --- /dev/null +++ b/2023/day-06/part_one.zig @@ -0,0 +1,49 @@ +const std = @import("std"); +const common = @import("common.zig"); + +const data = @embedFile("inputs/puzzle.txt"); + +pub fn main() !void { + const stdout = std.io.getStdOut().writer(); + + const races = try common.parse(data); + defer races.deinit(); + + var prod: u32 = 1; + + for (races.times.items, 0..) |race_time, i| { + const race_record = races.distances.items[i]; + + var min: u32 = undefined; + + for (1..race_time) |speed| { + const rem_race_time = race_time - speed; + const dist = rem_race_time * speed; + if (dist > race_record) { + min = @intCast(speed); + break; + } + } + + var max: u32 = undefined; + + var speed: u32 = race_time - 1; + while (speed > 0) { + const rem_race_time = race_time - speed; + const dist = rem_race_time * speed; + + if (dist > race_record) { + max = speed; + break; + } + + speed -= 1; + } + + const nums_beat = max - min + 1; + + prod *= nums_beat; + } + + try stdout.print("{d}\n", .{prod}); +}