This commit is contained in:
		
							
								
								
									
										85
									
								
								src/day06.zig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								src/day06.zig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | |||||||
|  | const std = @import("std"); | ||||||
|  | const util = @import("util.zig"); | ||||||
|  | const mem = std.mem; | ||||||
|  |  | ||||||
|  | pub fn main() !void { | ||||||
|  |     const input = @embedFile("data/day06.txt"); | ||||||
|  |     const sln = try solve(util.gpa, input); | ||||||
|  |     std.debug.print("{d}\n", .{sln.a}); | ||||||
|  |     std.debug.print("{d}\n", .{sln.b}); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const Solution = struct { | ||||||
|  |     a: usize, | ||||||
|  |     b: usize, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | const Race = struct { | ||||||
|  |     time: usize, | ||||||
|  |     distance: usize, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | fn solve(alloc: mem.Allocator, input: []const u8) !Solution { | ||||||
|  |     const races: []Race = r: { | ||||||
|  |         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); | ||||||
|  |         } | ||||||
|  |         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; | ||||||
|  |     } | ||||||
|  |     result2 *= winning2; | ||||||
|  |  | ||||||
|  |     return .{ .a = result, .b = result2 }; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | test "silver" { | ||||||
|  |     const input = | ||||||
|  |         \\Time:      7  15   30 | ||||||
|  |         \\Distance:  9  40  200 | ||||||
|  |     ; | ||||||
|  |     const sln = try solve(std.testing.allocator, input); | ||||||
|  |     try std.testing.expectEqual(@as(usize, 288), sln.a); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | test "gold" { | ||||||
|  |     const input = | ||||||
|  |         \\Time:      7  15   30 | ||||||
|  |         \\Distance:  9  40  200 | ||||||
|  |     ; | ||||||
|  |     const sln = try solve(std.testing.allocator, input); | ||||||
|  |     try std.testing.expectEqual(@as(usize, 288), sln.b); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user