const std = @import("std");
fn readInputFile(allocator: std.mem.Allocator, filename: []const u8) anyerror![]u32 {
const file = try std.fs.cwd().openFile(filename, .{ .read = true });
defer file.close();
var result = std.ArrayList(u32).init(allocator);
var index: u32 = 0;
var buffer: [8]u8 = undefined;
const reader = file.reader();
while (true) {
var byte = reader.readByte() catch break;
buffer[index] = byte;
if (byte == '\r' or byte == '\n') {
var until = index;
index = 0;
const value = std.fmt.parseUnsigned(u32, buffer[0..until], 10) catch continue;
try result.append(value);
} else {
index += 1;
}
}
return result.items;
}
pub fn task1(depth_values: []const u32) u32 {
var result: u32 = 0;
var prev = depth_values[0];
for (depth_values) |depth| {
if (depth > prev) {
result += 1;
}
prev = depth;
}
return result;
}
pub fn task2(depth_values: []const u32) u32 {
var result: u32 = 0;
var prev_batch: u32 = 0;
var batch_index: u32 = 0;
var batch_value: u32 = 0;
var count: u32 = 0;
while (batch_index < depth_values.len) {
batch_value += depth_values[batch_index];
batch_index += 1;
count += 1;
if (count == 3) {
if (prev_batch > 0 and batch_value > prev_batch) {
result += 1;
}
batch_index -= 2;
prev_batch = batch_value;
count = 0;
batch_value = 0;
}
}
return result;
}
pub fn main() anyerror!void {
var buffer: [65536]u8 = undefined;
const allocator = std.heap.FixedBufferAllocator.init(&buffer).allocator();
const input = try readInputFile(allocator, "input.txt");
const task_1_result = task1(input);
std.log.info("Task 1 result: {}", .{task_1_result});
const task_2_result = task2(input);
std.log.info("Task 2 result: {}", .{task_2_result});
}