Skip to content

Instantly share code, notes, and snippets.

@rhamorim
Last active December 1, 2021 15:19
Show Gist options
  • Select an option

  • Save rhamorim/766e9748a80a9c3ebb51297e1df9e453 to your computer and use it in GitHub Desktop.

Select an option

Save rhamorim/766e9748a80a9c3ebb51297e1df9e453 to your computer and use it in GitHub Desktop.
Core of the Zig solution for day 1 of Advent of Code 2021
fn part1(reports: []const u32) u32 {
var last_report: ?u32 = null;
var increased: u32 = 0;
for (reports) |report| {
if (report > (last_report orelse report)) {
increased += 1;
}
last_report = report;
}
return increased;
}
fn SlidingWindow(comptime size: u8) type {
return struct {
const Self = @This();
values: [size]u32 = undefined,
pos: u32 = 0,
fn sum(self: Self) ?u32 {
if (self.pos < size) {
return null;
} else {
var s: u32 = 0;
for (self.values) |v| s += v;
return s;
}
}
fn add(self: *Self, value: u32) void {
self.values[self.pos % size] = value;
self.pos += 1;
}
};
}
fn part2(reports: []const u32) u32 {
var last_report: ?u32 = null;
var increased: u32 = 0;
var sliding_window = SlidingWindow(3){};
for (reports) |value| {
sliding_window.add(value);
if (sliding_window.sum()) |report| {
if (report > (last_report orelse report)) {
increased += 1;
}
last_report = report;
}
}
return increased;
}
@rhamorim
Copy link
Author

rhamorim commented Dec 1, 2021

Ah, just noticed a bug. "if (self.pos < 3) {" should instead be "if (self.pos < size) {". Fixed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment