From dbb917c8ef7095c61e1c641404e9d0ecca3ef766 Mon Sep 17 00:00:00 2001 From: Patrick Auernig Date: Sun, 10 Dec 2023 21:12:28 +0100 Subject: [PATCH] Add solution for 2023 day 06 part 2 --- 2023/README.md | 2 +- 2023/day-06/common.zig | 30 ++++++++++++++++++++++++++++++ 2023/day-06/part_one.zig | 30 ++---------------------------- 2023/day-06/part_two.zig | 34 ++++++++++++++++++++++++++++++++++ README.md | 2 +- 5 files changed, 68 insertions(+), 30 deletions(-) create mode 100644 2023/day-06/part_two.zig diff --git a/2023/README.md b/2023/README.md index 32dee94..0d0d134 100644 --- a/2023/README.md +++ b/2023/README.md @@ -9,7 +9,7 @@ | [03] | ✓ | ✓ | [Zig] | | [04] | ✓ | ✓ | [Zig] | | [05] | ✓ | ✓ | [Zig] | -| [06] | | | | +| [06] | ✓ | ✓ | [Zig] | | [07] | | | | | [08] | | | | | [09] | | | | diff --git a/2023/day-06/common.zig b/2023/day-06/common.zig index ec11ae3..21ff08f 100644 --- a/2023/day-06/common.zig +++ b/2023/day-06/common.zig @@ -13,6 +13,36 @@ pub const Races = struct { 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'); diff --git a/2023/day-06/part_one.zig b/2023/day-06/part_one.zig index 13f6fe8..86a50a0 100644 --- a/2023/day-06/part_one.zig +++ b/2023/day-06/part_one.zig @@ -9,38 +9,12 @@ pub fn main() !void { const races = try common.parse(data); defer races.deinit(); - var prod: u32 = 1; + var prod: u64 = 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; + const nums_beat = common.calculate(race_time, race_record); prod *= nums_beat; } diff --git a/2023/day-06/part_two.zig b/2023/day-06/part_two.zig new file mode 100644 index 0000000..3318cf5 --- /dev/null +++ b/2023/day-06/part_two.zig @@ -0,0 +1,34 @@ +const std = @import("std"); +const common = @import("common.zig"); +const alloc = std.heap.page_allocator; +const Buffer = std.ArrayList(u8); + +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(); + + const time = try concat_numbers(races.times.items); + const record = try concat_numbers(races.distances.items); + + const nums_beat = common.calculate(time, record); + + try stdout.print("{d}\n", .{nums_beat}); +} + +fn concat_numbers(nums: []const u32) !u64 { + var buf = Buffer.init(alloc); + defer buf.deinit(); + + for (nums) |race_times| { + const segment = try std.fmt.allocPrint(alloc, "{d}", .{race_times}); + try buf.appendSlice(segment); + } + + const num = try std.fmt.parseInt(u64, buf.items, 10); + + return num; +} diff --git a/README.md b/README.md index af438d7..f044722 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,4 @@ - [2020](2020/README.md) (20% completed) - [2021](2021/README.md) (68% completed) - [2022](2022/README.md) (54% completed) -- [2023](2023/README.md) (20% completed) +- [2023](2023/README.md) (24% completed)