Day 2 done, started working on improving build.zig

main
Joey Hines 2022-12-02 12:51:53 -07:00
parent ae8b29d9f8
commit 89ff0eda4e
Signed by: joeyahines
GPG Key ID: 995E531F7A569DDB
4 changed files with 2698 additions and 27 deletions

View File

@ -11,26 +11,32 @@ pub fn build(b: *std.build.Builder) void {
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const dayPath = "src/day1.zig";
const exe = b.addExecutable("advent_of_code", dayPath);
exe.setTarget(target);
exe.setBuildMode(mode);
exe.install();
const days = [_]u8{1, 2};
const run_cmd = exe.run();
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
for (days) |day| {
const dayPath = b.fmt("src/day{}.zig", .{day});
const dayName = b.fmt("day{}", .{day});
const exe = b.addExecutable(dayName, dayPath);
exe.setTarget(target);
exe.setBuildMode(mode);
exe.install();
const run_cmd = exe.run();
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
const exe_tests = b.addTest(dayPath);
exe_tests.setTarget(target);
exe_tests.setBuildMode(mode);
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&exe_tests.step);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
const exe_tests = b.addTest(dayPath);
exe_tests.setTarget(target);
exe_tests.setBuildMode(mode);
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&exe_tests.step);
}

2500
inputs/day2.txt 100644

File diff suppressed because it is too large Load Diff

View File

@ -35,11 +35,4 @@ pub fn main() !void {
}
std.debug.print("Total calories of the top three elves: {}\n", .{sum});
}
test "simple test" {
var list = std.ArrayList(i32).init(std.testing.allocator);
defer list.deinit(); // try commenting this out and see if zig detects the memory leak!
try list.append(42);
try std.testing.expectEqual(@as(i32, 42), list.pop());
}
}

172
src/day2.zig 100644
View File

@ -0,0 +1,172 @@
const std = @import("std");
const Outcomes = enum(u16) {
Lost = 0,
Draw = 3,
Win = 6,
INVALID = 99,
pub fn from_guide(value: u8) Outcomes{
return switch(value) {
'X' => Outcomes.Lost,
'Y' => Outcomes.Draw,
'Z' => Outcomes.Win,
else => Outcomes.INVALID,
};
}
};
const RPSStates = enum(i8) {
Rock = 0,
Paper =1,
Scissors = 2,
INVALID = 99,
_,
pub fn from_opponent(value: u8) RPSStates {
return switch(value) {
'A' => RPSStates.Rock,
'B' => RPSStates.Paper,
'C' => RPSStates.Scissors,
else => RPSStates.INVALID
};
}
pub fn from_me(value: u8) RPSStates {
return switch(value) {
'X' => RPSStates.Rock,
'Y' => RPSStates.Paper,
'Z' => RPSStates.Scissors,
else => RPSStates.INVALID
};
}
pub fn get_move_needed(outcome_needed: Outcomes, opp_choice: RPSStates) RPSStates {
return switch(outcome_needed) {
.Lost => opp_choice.get_strong_to_move(),
.Draw => opp_choice,
.Win => opp_choice.get_weak_to_move(),
else => unreachable
};
}
pub fn outcome(self: RPSStates, opp_choice: RPSStates) Outcomes {
if (self == opp_choice) {
return Outcomes.Draw;
}
else {
if (self.get_strong_to_move() == opp_choice) {
return Outcomes.Win;
}
else {
return Outcomes.Lost;
}
}
}
pub fn score_round(self: RPSStates, opp_choice: RPSStates) u16 {
var score: u16 = switch(self) {
.Rock => 1,
.Paper => 2,
.Scissors => 3,
else => unreachable
};
score += @enumToInt(self.outcome(opp_choice));
return score;
}
pub fn get_weak_to_move(self: RPSStates) RPSStates {
return @intToEnum(RPSStates, @mod((@enumToInt(self) + 1), 3));
}
pub fn get_strong_to_move(self: RPSStates) RPSStates {
return @intToEnum(RPSStates, @mod((@enumToInt(self) - 1), 3));
}
};
pub fn part1(opp_letter: u8, my_letter: u8) u16 {
const opp_choice = RPSStates.from_opponent(opp_letter);
const my_choice = RPSStates.from_me(my_letter);
return my_choice.score_round(opp_choice);
}
pub fn part2(opp_letter: u8, my_letter: u8) u16 {
const opp_choice = RPSStates.from_opponent(opp_letter);
const win_cond = Outcomes.from_guide(my_letter);
const my_choice = RPSStates.get_move_needed(win_cond, opp_choice);
return my_choice.score_round(opp_choice);
}
pub fn main() !void {
var file = try std.fs.cwd().openFile("inputs/day2.txt", .{});
defer file.close();
var buf_reader = std.io.bufferedReader(file.reader());
var in_stream = buf_reader.reader();
var buf: [1024]u8 = undefined;
var score_part1: u16 = 0;
var score_part2: u16 = 0;
while (try in_stream.readUntilDelimiterOrEof(&buf, '\n')) |line| {
const opp_letter: u8 = line[0];
const my_letter: u8 = line[2];
score_part1 += part1(opp_letter, my_letter);
score_part2 += part2(opp_letter, my_letter);
}
std.debug.print("PART1: My total score: {}\n", .{score_part1});
std.debug.print("PART2: My total score: {}\n", .{score_part2});
}
test "Win Conditions" {
var opp = RPSStates.Paper;
var me = RPSStates.Rock;
var score = me.score_round(opp);
try std.testing.expect(score == 1);
opp = RPSStates.Scissors;
me = RPSStates.Paper;
score = me.score_round(opp);
try std.testing.expect(score == 2);
opp = RPSStates.Rock;
me = RPSStates.Scissors;
score = me.score_round(opp);
try std.testing.expect(score == 3);
opp = RPSStates.Rock;
me = RPSStates.Paper;
score = me.score_round(opp);
try std.testing.expect(me.outcome(opp) == Outcomes.Win);
try std.testing.expect(score == 8);
opp = RPSStates.Paper;
me = RPSStates.Scissors;
score = me.score_round(opp);
try std.testing.expect(score == 9);
opp = RPSStates.Scissors;
me = RPSStates.Rock;
score = me.score_round(opp);
try std.testing.expect(score == 7);
}