diff options
| author | xander <xander@biltopia.org> | 2025-12-07 13:12:06 +0100 |
|---|---|---|
| committer | xander <xander@biltopia.org> | 2025-12-07 13:12:06 +0100 |
| commit | 516e6ed4a9066fa43d6159b2a0ec58416ab28013 (patch) | |
| tree | 9925207e97b9e6e1fd83a55bdb878c43071cf73a /src/day05.zig | |
| download | aoc2025-516e6ed4a9066fa43d6159b2a0ec58416ab28013.tar.xz aoc2025-516e6ed4a9066fa43d6159b2a0ec58416ab28013.zip | |
solve up to day 7
Diffstat (limited to 'src/day05.zig')
| -rw-r--r-- | src/day05.zig | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/day05.zig b/src/day05.zig new file mode 100644 index 0000000..2f971f9 --- /dev/null +++ b/src/day05.zig @@ -0,0 +1,107 @@ +const std = @import("std"); +const print = std.debug.print; + +pub fn solve(part: []u8, reader: *std.Io.Reader, allocator: std.mem.Allocator) !void { + if (std.mem.eql(u8, part, "1")) { + try part1(reader, allocator); + } else { + try part2(reader, allocator); + } +} + +const Range = struct { start: usize, end: usize }; + +fn part1(reader: *std.Io.Reader, allocator: std.mem.Allocator) !void { + var output: usize = 0; + + var ranges = try std.ArrayList(Range).initCapacity(allocator, 0); + defer ranges.deinit(allocator); + + while (reader.takeDelimiter('\n')) |line| { + if (line == null or line.?.len == 0){ + break; + } + + var split = std.mem.splitScalar(u8, line.?, '-'); + const start = try std.fmt.parseInt(usize, split.next().?, 10); + const end = try std.fmt.parseInt(usize, split.next().?, 10); + + try ranges.append(allocator, Range{ .start=start, .end=end}); + + } else |_| {} + + while (reader.takeDelimiter('\n')) |line| { + if (line == null) { + break; + } + + const id = try std.fmt.parseInt(usize, line.?, 10); + + for(ranges.items) |range| { + if (id >= range.start and id <= range.end) { + output += 1; + break; + } + } + + } else |_| {} + + print("{d}\n", .{output}); +} + +fn cmp(_: void, a: Range, b: Range) bool { + return a.start < b.start; +} + +fn part2(reader: *std.Io.Reader, allocator: std.mem.Allocator) !void { + var output: usize = 0; + + var ranges = try std.ArrayList(Range).initCapacity(allocator, 0); + defer ranges.deinit(allocator); + + while (reader.takeDelimiter('\n')) |line| { + if (line == null or line.?.len == 0){ + break; + } + + var split = std.mem.splitScalar(u8, line.?, '-'); + const start = try std.fmt.parseInt(usize, split.next().?, 10); + const end = try std.fmt.parseInt(usize, split.next().?, 10); + + try ranges.append(allocator, Range{ .start=start, .end=end}); + + } else |_| {} + + + std.mem.sort(Range,ranges.items, {}, cmp); + + var more = try std.ArrayList(Range).initCapacity(allocator, 0); + defer more.deinit(allocator); + + outer: for (ranges.items) |r| { + + const start = r.start; + const end = r.end; + + for (more.items) |*range| { + if (start >= range.start and start <= range.end) { + if (end > range.end){ + range.end = end; + } + continue :outer; + } else if (start < range.start and end >= range.start) { + range.start = start; + continue :outer; + } + } + + try more.append(allocator, Range{ .start=start, .end=end}); + + } + + for (more.items) |range| { + output += range.end - range.start + 1; + } + + print("{d}\n", .{output}); +} |
