day14 part1
This commit is contained in:
		
							
								
								
									
										78
									
								
								src/day14.zig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								src/day14.zig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | const std = @import("std"); | ||||||
|  | const util = @import("util.zig"); | ||||||
|  | const mem = std.mem; | ||||||
|  |  | ||||||
|  | pub fn main() !void { | ||||||
|  |     const input = @embedFile("data/day14.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, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | fn solve(alloc: mem.Allocator, input: []const u8) !Solution { | ||||||
|  |     const width = mem.indexOfScalar(u8, input, '\n').?; | ||||||
|  |     var height = mem.count(u8, input, &[_]u8{'\n'}); | ||||||
|  |     if (input[input.len - 1] != '\n') height += 1; | ||||||
|  |  | ||||||
|  |     var next_slot = try alloc.alloc(u32, width); | ||||||
|  |     defer alloc.free(next_slot); | ||||||
|  |     @memset(next_slot, 0); | ||||||
|  |  | ||||||
|  |     var weight: usize = 0; | ||||||
|  |  | ||||||
|  |     var it = util.splitLines(input); | ||||||
|  |     var row: u32 = 0; | ||||||
|  |     while (it.next()) |line| { | ||||||
|  |         if (line.len == 0) continue; | ||||||
|  |         for (line, 0..) |char, col| { | ||||||
|  |             switch (char) { | ||||||
|  |                 'O' => { | ||||||
|  |                     std.debug.print("rock at {}x{} moves to {}\n", .{ col, row, height - next_slot[col] }); | ||||||
|  |                     weight += height - next_slot[col]; | ||||||
|  |                     next_slot[col] += 1; | ||||||
|  |                     std.debug.print("{any}\n", .{next_slot}); | ||||||
|  |                 }, | ||||||
|  |                 '#' => { | ||||||
|  |                     std.debug.print("cube at {}x{}\n", .{ col, row }); | ||||||
|  |                     next_slot[col] = @as(u32, @intCast(row)) + 1; | ||||||
|  |                     std.debug.print("{any}\n", .{next_slot}); | ||||||
|  |                 }, | ||||||
|  |                 else => {}, | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         row += 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return .{ .a = weight, .b = 0 }; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | test "silver" { | ||||||
|  |     const input = | ||||||
|  |         \\O....#.... | ||||||
|  |         \\O.OO#....# | ||||||
|  |         \\.....##... | ||||||
|  |         \\OO.#O....O | ||||||
|  |         \\.O.....O#. | ||||||
|  |         \\O.#..O.#.# | ||||||
|  |         \\..O..#O..O | ||||||
|  |         \\.......O.. | ||||||
|  |         \\#....###.. | ||||||
|  |         \\#OO..#.... | ||||||
|  |     ; | ||||||
|  |     const sln = try solve(std.testing.allocator, input); | ||||||
|  |     try std.testing.expectEqual(@as(usize, 136), sln.a); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | test "gold" { | ||||||
|  |     const input = | ||||||
|  |         \\ | ||||||
|  |     ; | ||||||
|  |     _ = input; | ||||||
|  |     // const sln = try solve(std.testing.allocator, input); | ||||||
|  |     // try std.testing.expectEqual(@as(usize, 0), sln.b); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user