Day 11
This commit is contained in:
		
							parent
							
								
									5b8558cac3
								
							
						
					
					
						commit
						72c23c19f2
					
				|  | @ -0,0 +1,27 @@ | |||
| const std = @import("std"); | ||||
| 
 | ||||
| pub fn build(b: *std.build.Builder) void { | ||||
|     // Standard target options allows the person running `zig build` to choose | ||||
|     // what target to build for. Here we do not override the defaults, which | ||||
|     // means any target is allowed, and the default is native. Other options | ||||
|     // for restricting supported target set are available. | ||||
|     const target = b.standardTargetOptions(.{}); | ||||
| 
 | ||||
|     // Standard release options allow the person running `zig build` to select | ||||
|     // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. | ||||
|     const mode = b.standardReleaseOptions(); | ||||
| 
 | ||||
|     const exe = b.addExecutable("day11", "src/main.zig"); | ||||
|     exe.setTarget(target); | ||||
|     exe.setBuildMode(mode); | ||||
|     exe.install(); | ||||
| 
 | ||||
|     const run_cmd = exe.run(); | ||||
|     run_cmd.step.dependOn(b.getInstallStep()); | ||||
|     if (b.args) |args| { | ||||
|         run_cmd.addArgs(args); | ||||
|     } | ||||
| 
 | ||||
|     const run_step = b.step("run", "Run the app"); | ||||
|     run_step.dependOn(&run_cmd.step); | ||||
| } | ||||
|  | @ -0,0 +1,10 @@ | |||
| 1564524226 | ||||
| 1384554685 | ||||
| 7582264835 | ||||
| 8812672272 | ||||
| 1161463137 | ||||
| 7831762344 | ||||
| 2855527748 | ||||
| 6141737874 | ||||
| 8611458313 | ||||
| 8215372443 | ||||
|  | @ -0,0 +1,133 @@ | |||
| const std = @import("std"); | ||||
| 
 | ||||
| pub fn main() anyerror!void { | ||||
|     var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); | ||||
|     defer arena.deinit(); | ||||
|     const alloc = &arena.allocator; | ||||
| 
 | ||||
|     // Read our input | ||||
|     var f = try std.fs.cwd().openFile("input", .{}); | ||||
|     defer f.close(); | ||||
|     var contents = try f.readToEndAlloc(alloc, std.math.maxInt(u32)); | ||||
|     defer alloc.free(contents); | ||||
| 
 | ||||
|     var map: [100]u8 = undefined; | ||||
|     var lit = std.mem.tokenize(contents, "\n"); | ||||
|     var line_number: u16 = 0; | ||||
|     while (lit.next()) |line| { | ||||
|         for (line) |c, i| { | ||||
|             map[i + @as(usize, line_number * 10)] = try std.fmt.parseInt(u8, line[i..i+1], 10); | ||||
|         } | ||||
|         line_number += 1; | ||||
|     } | ||||
| 
 | ||||
|     var step: u16 = 0; | ||||
|     var flashed = std.AutoHashMap(usize, void).init(alloc); | ||||
|     defer flashed.deinit(); | ||||
|     var flashes: u32 = 0; | ||||
|     while (step < 1000) { | ||||
|         // Increase energy level of octopuses by 1 | ||||
|         for (map) |v, i| { | ||||
|             map[i] += 1; | ||||
|         } | ||||
|         // Check for high energy octopi | ||||
|         for (map) |v, i| { | ||||
|             if (v > 9) { | ||||
|                 // Flash! | ||||
|                 try flash(i, map[0..], &flashed); | ||||
|             } | ||||
|         } | ||||
|         //std.log.debug("Step {} had {} octopi flash", .{step, flashed.count()}); | ||||
|         flashes += flashed.count(); | ||||
|         if (flashed.count() == 100) { | ||||
|             std.log.info("[Part 2] On step {}, all octopi flashed", .{step+1}); | ||||
|             break; | ||||
|         } | ||||
|         // Return all flashed octopi to 0 energy | ||||
|         var fit = flashed.keyIterator(); | ||||
|         while (fit.next()) |fi| { | ||||
|             map[fi.*] = 0; | ||||
|         } | ||||
|         flashed.clearRetainingCapacity(); | ||||
|         step += 1; | ||||
|         if (step == 100) { | ||||
|             std.log.info("[Part 1] After {} steps, {} octopi have flashed", | ||||
|                          .{step, flashes}); | ||||
|         } | ||||
|         // std.log.debug("After step:\n", .{}); | ||||
|         // var i: usize = 0; | ||||
|         // while (i < 10) : (i += 1) { | ||||
|         //     std.log.debug("{any}", .{map[i..i+10]}); | ||||
|         // } | ||||
|         // std.log.debug("\n", .{}); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn flash(i: usize, map: []u8, flashed: *std.AutoHashMap(usize, void)) anyerror!void { | ||||
|     if (flashed.contains(i)) { | ||||
|         return; | ||||
|     } | ||||
|     try flashed.putNoClobber(i, undefined); | ||||
|     var adjacents = get_adjacent_points(i, 10, 10); | ||||
|     for (adjacents) |adj| { | ||||
|         if (adj) |a| { | ||||
|             if (!flashed.contains(a)) { | ||||
|                 map[a] += 1; | ||||
|                 if (map[a] > 9) { | ||||
|                     try flash(a, map, flashed); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn get_adjacent_points(i: usize, width: usize, height: usize) [8]?usize { | ||||
|     var adjacents = [8] ?usize { | ||||
|         null, | ||||
|         null, | ||||
|         null, | ||||
|         null, | ||||
|         null, | ||||
|         null, | ||||
|         null, | ||||
|         null, | ||||
|     }; | ||||
|     var ai: usize = 0; | ||||
|     var bottom = i < ((height - 1) * width); | ||||
|     var top = i >= width; | ||||
|     var left = (i % width) != 0; | ||||
|     var right = (i % width) != (width - 1); | ||||
|     if (top) { | ||||
|         if (left) { | ||||
|             adjacents[ai] = i - width - 1; | ||||
|             ai += 1; | ||||
|         } | ||||
|         adjacents[ai] = i - width; | ||||
|         ai += 1; | ||||
|         if (right) { | ||||
|             adjacents[ai] = i - width + 1; | ||||
|             ai += 1; | ||||
|         } | ||||
|     } | ||||
|     if (left) { | ||||
|         adjacents[ai] = i - 1; | ||||
|         ai += 1; | ||||
|     } | ||||
|     if (right) { | ||||
|         adjacents[ai] = i + 1; | ||||
|         ai += 1; | ||||
|     } | ||||
|     if (bottom) { | ||||
|         if (left) { | ||||
|             adjacents[ai] = i + width - 1; | ||||
|             ai += 1; | ||||
|         } | ||||
|         adjacents[ai] = i + width; | ||||
|         ai += 1; | ||||
|         if (right) { | ||||
|             adjacents[ai] = i + width + 1; | ||||
|             ai += 1; | ||||
|         } | ||||
|     } | ||||
|     return adjacents; | ||||
| } | ||||
|  | @ -0,0 +1,10 @@ | |||
| 5483143223 | ||||
| 2745854711 | ||||
| 5264556173 | ||||
| 6141336146 | ||||
| 6357385478 | ||||
| 4167524645 | ||||
| 2176841721 | ||||
| 6882881134 | ||||
| 4846848554 | ||||
| 5283751526 | ||||
		Loading…
	
		Reference in New Issue