+7
-7
src/day1.zig
+7
-7
src/day1.zig
···
1
1
const std = @import("std");
2
+
const Allocator = std.mem.Allocator;
2
3
3
-
pub fn run(input: []u8) !void {
4
+
pub fn run(_: Allocator, input: []u8) !struct { u64, u64 } {
4
5
var lines = std.mem.tokenizeScalar(u8, input, '\n');
5
6
6
7
var dial: u8 = 50;
7
-
var zeroes_p1: u64 = 0;
8
-
var zeroes_p2: u64 = 0;
8
+
var answer1: u64 = 0;
9
+
var answer2: u64 = 0;
9
10
while (lines.next()) |line| {
10
11
const direction: i2 = switch (line[0]) {
11
12
'L' => -1,
···
24
25
dial = @intCast(@mod(new_rotation, 100));
25
26
26
27
if (dial == 0) {
27
-
zeroes_p1 += 1;
28
+
answer1 += 1;
28
29
}
29
30
30
-
zeroes_p2 += zeroes_clicked;
31
+
answer2 += zeroes_clicked;
31
32
}
32
33
33
-
std.debug.print("Answer P1: {d}\n", .{zeroes_p1});
34
-
std.debug.print("Answer P2: {d}\n", .{zeroes_p2});
34
+
return .{ answer1, answer2 };
35
35
}
+3
-3
src/day2.zig
+3
-3
src/day2.zig
···
1
1
const std = @import("std");
2
+
const Allocator = std.mem.Allocator;
2
3
3
-
pub fn run(input: []u8) !void {
4
+
pub fn run(_: Allocator, input: []u8) !struct { u64, u64 } {
4
5
var ranges = std.mem.tokenizeScalar(u8, std.mem.trimEnd(u8, input, "\n"), ',');
5
6
6
7
var answer1: u64 = 0;
···
48
49
}
49
50
}
50
51
51
-
std.debug.print("Answer P1: {d}\n", .{answer1});
52
-
std.debug.print("Answer P2: {d}\n", .{answer2});
52
+
return .{ answer1, answer2 };
53
53
}
+3
-3
src/day3.zig
+3
-3
src/day3.zig
···
1
1
const std = @import("std");
2
+
const Allocator = std.mem.Allocator;
2
3
3
-
pub fn run(input: []u8) !void {
4
+
pub fn run(_: Allocator, input: []u8) !struct { u64, u64 } {
4
5
var lines = std.mem.tokenizeScalar(u8, input, '\n');
5
6
6
7
var answer1: u64 = 0;
···
10
11
answer2 += try calculateJoltage(line, 12);
11
12
}
12
13
13
-
std.debug.print("Answer P1: {d}\n", .{answer1});
14
-
std.debug.print("Answer P2: {d}\n", .{answer2});
14
+
return .{ answer1, answer2 };
15
15
}
16
16
17
17
fn calculateJoltage(line: []const u8, num_digits: usize) !u64 {
+3
-3
src/day4.zig
+3
-3
src/day4.zig
···
1
1
const std = @import("std");
2
+
const Allocator = std.mem.Allocator;
2
3
const StringTokenIterator = std.mem.TokenIterator(u8, .scalar);
3
4
4
5
const MAX_WIDTH = 137;
···
32
33
return .{ .data = grid, .maxX = line_len, .maxY = i };
33
34
}
34
35
35
-
pub fn run(input: []u8) !void {
36
+
pub fn run(_: Allocator, input: []u8) !struct { u64, u64 } {
36
37
var lines = std.mem.tokenizeScalar(u8, input, '\n');
37
38
38
39
const grid = try newGrid(&lines);
···
95
96
}
96
97
}
97
98
98
-
std.debug.print("Answer P1: {d}\n", .{answer1});
99
-
std.debug.print("Answer P2: {d}\n", .{answer2});
99
+
return .{ answer1, answer2 };
100
100
}
+2
-3
src/day5.zig
+2
-3
src/day5.zig
···
11
11
}
12
12
};
13
13
14
-
pub fn run(allocator: Allocator, input: []u8) !void {
14
+
pub fn run(allocator: Allocator, input: []u8) !struct { u64, u64 } {
15
15
var sections = std.mem.tokenizeSequence(u8, input, "\n\n");
16
16
17
17
var answer1: u64 = 0;
···
71
71
answer2 += item.high - item.low + 1;
72
72
}
73
73
74
-
std.debug.print("Answer P1: {d}\n", .{answer1});
75
-
std.debug.print("Answer P2: {d}\n", .{answer2});
74
+
return .{ answer1, answer2 };
76
75
}
+6
src/day6.zig
+6
src/day6.zig
+19
-14
src/main.zig
+19
-14
src/main.zig
···
1
1
const std = @import("std");
2
-
const day1 = @import("./day1.zig");
3
-
const day2 = @import("./day2.zig");
4
-
const day3 = @import("./day3.zig");
5
-
const day4 = @import("./day4.zig");
6
-
const day5 = @import("./day5.zig");
2
+
const days = .{
3
+
@import("./day1.zig"),
4
+
@import("./day2.zig"),
5
+
@import("./day3.zig"),
6
+
@import("./day4.zig"),
7
+
@import("./day5.zig"),
8
+
};
7
9
8
10
pub fn main() !void {
9
11
var args = std.process.args();
···
19
21
var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
20
22
const allocator = gpa.allocator();
21
23
22
-
const day = try std.fmt.parseInt(u4, day_str, 10);
24
+
const day_num = try std.fmt.parseInt(u4, day_str, 10);
23
25
24
-
const input_path = try std.fmt.allocPrint(allocator, "inputs/day{d}{s}.txt", .{ day, test_str });
26
+
const input_path = try std.fmt.allocPrint(allocator, "inputs/day{d}{s}.txt", .{ day_num, test_str });
25
27
defer allocator.free(input_path);
26
28
27
29
const input_file = try std.fs.cwd().openFile(input_path, .{});
···
33
35
const input_content = try reader.interface.allocRemaining(allocator, .unlimited);
34
36
defer allocator.free(input_content);
35
37
36
-
switch (day) {
37
-
1 => try day1.run(input_content),
38
-
2 => try day2.run(input_content),
39
-
3 => try day3.run(input_content),
40
-
4 => try day4.run(input_content),
41
-
5 => try day5.run(allocator, input_content),
42
-
else => {},
38
+
inline for (days, 1..) |day, i| {
39
+
if (i == day_num) {
40
+
std.debug.print("Day {d}\n\n", .{i});
41
+
42
+
const answer1, const answer2 = try day.run(allocator, input_content);
43
+
44
+
std.debug.print("Answer P1: {d}\n", .{answer1});
45
+
std.debug.print("Answer P2: {d}\n", .{answer2});
46
+
break;
47
+
}
43
48
}
44
49
}