diff --git a/src/day06.zig b/src/day06.zig index d1c1f50..5196398 100644 --- a/src/day06.zig +++ b/src/day06.zig @@ -14,54 +14,42 @@ const Solution = struct { b: usize, }; -const Race = struct { - time: usize, - distance: usize, -}; - fn solve(alloc: mem.Allocator, input: []const u8) !Solution { - const races: []Race = r: { + var result: usize = 1; + { var it = util.splitLines(input); const times = try util.parseIntsScalar(usize, alloc, it.next().?[10..], .{}); const distances = try util.parseIntsScalar(usize, alloc, it.next().?[10..], .{}); defer alloc.free(times); defer alloc.free(distances); - var al = try std.ArrayList(Race).initCapacity(alloc, times.len); - for (times, distances) |t, d| { - try al.append(.{ .time = t, .distance = d }); - } - break :r try al.toOwnedSlice(); - }; - defer alloc.free(races); - const bigRace: Race = r: { - var it = util.splitLines(input); - var vals: [2]usize = undefined; - for (0..vals.len) |i| { - const line = try mem.replaceOwned(u8, alloc, it.next().?[10..], " ", ""); - defer alloc.free(line); - vals[i] = try std.fmt.parseInt(usize, line, 10); + for (times, distances) |time, minDistance| { + var winning: usize = 0; + for (0..time - 1) |speed| { + const distance = speed * (time - speed); + if (distance > minDistance) winning += 1; + } + result *= winning; } - break :r .{ .time = vals[0], .distance = vals[1] }; - }; - - var result: usize = 1; - for (races) |race| { - var winning: usize = 0; - for (0..race.time - 1) |speed| { - const distance = speed * (race.time - speed); - if (distance > race.distance) winning += 1; - } - result *= winning; } var result2: usize = 1; - var winning2: usize = 0; - for (0..bigRace.time - 1) |speed| { - const distance = speed * (bigRace.time - speed); - if (distance > bigRace.distance) winning2 += 1; + { + var it = util.splitLines(input); + var td: [2]usize = undefined; + for (0..td.len) |i| { + const line = try mem.replaceOwned(u8, alloc, it.next().?[10..], " ", ""); + defer alloc.free(line); + td[i] = try std.fmt.parseInt(usize, line, 10); + } + + var winning2: usize = 0; + for (0..td[0] - 1) |speed| { + const distance = speed * (td[0] - speed); + if (distance > td[1]) winning2 += 1; + } + result2 *= winning2; } - result2 *= winning2; return .{ .a = result, .b = result2 }; }