diff --git a/02/build.zig b/02/build.zig new file mode 100644 index 0000000..cf6ba36 --- /dev/null +++ b/02/build.zig @@ -0,0 +1,14 @@ +const Builder = @import("std").build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + const exe = b.addExecutable("02", "src/main.zig"); + exe.setBuildMode(mode); + exe.install(); + + const run_cmd = exe.run(); + run_cmd.step.dependOn(b.getInstallStep()); + + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); +} diff --git a/02/input b/02/input new file mode 100644 index 0000000..d58f471 --- /dev/null +++ b/02/input @@ -0,0 +1 @@ +1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,13,19,2,9,19,23,1,23,6,27,1,13,27,31,1,31,10,35,1,9,35,39,1,39,9,43,2,6,43,47,1,47,5,51,2,10,51,55,1,6,55,59,2,13,59,63,2,13,63,67,1,6,67,71,1,71,5,75,2,75,6,79,1,5,79,83,1,83,6,87,2,10,87,91,1,9,91,95,1,6,95,99,1,99,6,103,2,103,9,107,2,107,10,111,1,5,111,115,1,115,6,119,2,6,119,123,1,10,123,127,1,127,5,131,1,131,2,135,1,135,5,0,99,2,0,14,0 diff --git a/02/src/main.zig b/02/src/main.zig new file mode 100644 index 0000000..c989e66 --- /dev/null +++ b/02/src/main.zig @@ -0,0 +1,71 @@ +const std = @import("std"); + +// Load the whole program into memory in one go +fn loadProgram() anyerror![]u32 { + const file = std.io.getStdIn(); + const stream = &file.inStream().stream; + var program = [_]u32{0} ** 1024; + var buf = [_]u8{0} ** 255; + var i: u32 = 0; + + while (try stream.readUntilDelimiterOrEof(&buf, ',')) |num| { + var trimmed = std.mem.trimRight(u8, num, "\r\n"); + program[i] = try std.fmt.parseInt(u32, trimmed, 10); + + std.debug.warn("{},", program[i]); + + i += 1; + } + + std.debug.warn("\n"); + + return program[0..program.len]; +} + +pub fn main() anyerror!void { + var program = try loadProgram(); + + // Initial program state. + var ip: u32 = 0; + var exit: bool = false; + + // Gravity assist modifications + program[1] = 12; + program[2] = 2; + + while (!exit) { + std.debug.warn(" IP {d:4}: ", ip); + const opcode = switch (program[ip]) { + 1 => { + var a = program[program[ip + 1]]; + var b = program[program[ip + 2]]; + var dest = program[ip + 3]; + var result = a + b; + + std.debug.warn("ADD: [{}] + [{}] => {} : {} + {} = {} => {}\n", ip + 1, ip + 2, dest, a, b, result, dest); + program[dest] = result; + ip += 4; + }, + 2 => { + var a = program[program[ip + 1]]; + var b = program[program[ip + 2]]; + var dest = program[ip + 3]; + var result = a * b; + + std.debug.warn("MULT: [{}] + [{}] => {} : {} + {} = {} => {}\n", ip + 1, ip + 2, dest, a, b, result, dest); + program[dest] = result; + ip += 4; + }, + 99 => { + std.debug.warn("EXIT\n"); + exit = true; + }, + else => { + std.debug.warn("Unknown opcode at IP {}: {}", ip, program[ip]); + exit = true; + }, + }; + } + + std.debug.warn("Part 1: {}\n", program[0]); +}