const std = @import("std");
const max_score = 1000;
const p1_start = 7;
const p2_start = 9;
pub fn main() !void {
var timer = try std.time.Timer.start();
const ret = try first();
const t = timer.lap() / 1000;
try std.testing.expectEqual(@as(usize, 679329), ret);
std.debug.print("Day 21a result: {d} \t\ttime: {d}µs\n", .{ ret, t });
}
pub fn first() !usize {
var p1_pos: usize = p1_start;
var p2_pos: usize = p2_start;
var p1_score: usize = 0;
var p2_score: usize = 0;
var dice: usize = 1;
var round: usize = 1;
while (true) : (round += 1) {
// player 1
const d1 = (p1_pos + dice + dice + 1 + dice + 2) % 10;
if (d1 == 0) p1_pos = 10 else p1_pos = d1;
p1_score += p1_pos;
dice += 3;
// std.debug.print("p1: {d} {d}\n", .{ p1_pos, p1_score });
if (p1_score >= max_score) {
return p2_score * (6 * round - 3);
}
// player 2
const d2 = (p2_pos + dice + dice + 1 + dice + 2) % 10;
if (d2 == 0) p2_pos = 10 else p2_pos = d2;
p2_score += p2_pos;
dice += 3;
// std.debug.print("p2: {d} {d}\n", .{ p2_pos, p2_score });
if (p2_score >= max_score) {
return p1_score * (6 * round);
}
}
}
test "day21a" {
try std.testing.expectEqual(@as(usize, 679329), try first());
}