diff --git a/day6/data.txt b/day6/data.txt new file mode 100644 index 0000000..5dd51e5 --- /dev/null +++ b/day6/data.txt @@ -0,0 +1,2 @@ +Time: 50 74 86 85 +Distance: 242 1017 1691 1252 diff --git a/day6/main.zig b/day6/main.zig new file mode 100644 index 0000000..16de0e4 --- /dev/null +++ b/day6/main.zig @@ -0,0 +1,64 @@ +const std = @import("std"); + +pub fn main() !void { + // const times = [_]u8{ 7, 15, 30 }; + // const distances = [_]u8{ 9, 40, 200 }; + + const times = [_]u8{ 50, 74, 86, 85 }; + const distances = [_]u16{ 242, 1017, 1691, 1252 }; + + // Part 1 + var totals: u64 = 1; + for (times, 0..) |time, idx| { + var waysToWin: u8 = 0; + for (0..time) |ms| { + var dist: u16 = 0; + for (0..time - ms) |_| { + dist += @intCast(ms); + } + + if (dist > distances[idx]) { + waysToWin += 1; + } + } + totals *= waysToWin; + } + + std.debug.print("Part 1: {d}\n", .{totals}); + + // Part 2 + // const time = 71530; + // const distance = 940200; + const time = 50748685; + const distance = 242101716911252; + + var pivot: u32 = time / 2; + var max: u32 = pivot; + var min: u32 = 0; + var prev: u32 = pivot; + + var i: u8 = 0; + while (true) : (i += 1) { + var dist: u64 = 0; + for (0..(time - pivot)) |_| { + dist += pivot; + } + + if (dist > distance) { + max = pivot; + pivot -= (max - min) / 2; + } else { + min = pivot; + pivot += (max - min) / 2; + } + + if (prev == pivot) { + break; + } + prev = pivot; + } + + const num = time - (pivot * 2); + std.debug.print("Part 2: {}\n", .{num}); + // TODO: potentially off by one. Could actually figure it out or just try num + 1 in AoC +} diff --git a/day6/test.txt b/day6/test.txt new file mode 100644 index 0000000..28f5ae9 --- /dev/null +++ b/day6/test.txt @@ -0,0 +1,2 @@ +Time: 7 15 30 +Distance: 9 40 200