Day7
This commit is contained in:
107
day7/zig/main.zig
Normal file
107
day7/zig/main.zig
Normal file
@@ -0,0 +1,107 @@
|
||||
const std = @import("std");
|
||||
|
||||
const Tile = enum {
|
||||
start,
|
||||
empty,
|
||||
splitter,
|
||||
};
|
||||
|
||||
pub fn main() !void {
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
defer _ = gpa.deinit();
|
||||
|
||||
var stdin_buffer: [4096]u8 = undefined;
|
||||
var stdin_reader = std.fs.File.stdin().reader(&stdin_buffer);
|
||||
|
||||
const stdin = &stdin_reader.interface;
|
||||
|
||||
const allocator = gpa.allocator();
|
||||
var map = try std.ArrayList(std.ArrayList(Tile)).initCapacity(allocator, 1);
|
||||
defer map.deinit(allocator);
|
||||
|
||||
while (try stdin.takeDelimiter('\n')) |line| {
|
||||
var row = try std.ArrayList(Tile).initCapacity(allocator, 1);
|
||||
|
||||
for (line) |char| {
|
||||
switch (char) {
|
||||
'S' => {
|
||||
try row.append(allocator, Tile.start);
|
||||
},
|
||||
'.' => {
|
||||
try row.append(allocator, Tile.empty);
|
||||
},
|
||||
'^' => {
|
||||
try row.append(allocator, Tile.splitter);
|
||||
},
|
||||
else => unreachable,
|
||||
}
|
||||
}
|
||||
|
||||
try map.append(allocator, row);
|
||||
}
|
||||
|
||||
var start_x: usize = 0;
|
||||
for (map.items[0].items, 0..) |tile, i| {
|
||||
if (tile == Tile.start) {
|
||||
start_x = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var beammap = try std.ArrayList(std.ArrayList(u64)).initCapacity(allocator, 1);
|
||||
defer beammap.deinit(allocator);
|
||||
|
||||
for (0..map.items.len) |_| {
|
||||
var row = try std.ArrayList(u64).initCapacity(allocator, 1);
|
||||
|
||||
for (0..map.items[0].items.len) |_| {
|
||||
try row.append(allocator, 0);
|
||||
}
|
||||
|
||||
try beammap.append(allocator, row);
|
||||
}
|
||||
|
||||
beammap.items[0].items[start_x] = 1;
|
||||
|
||||
var task1: u32 = 0;
|
||||
|
||||
for (beammap.items, 0..) |beamrow, i| {
|
||||
for (beamrow.items, 0..) |has_beam, j| {
|
||||
if (has_beam > 0 and map.items[i].items[j] == Tile.splitter) {
|
||||
if (j != 0) {
|
||||
beammap.items[i].items[j - 1] += beammap.items[i].items[j];
|
||||
}
|
||||
if (j < beamrow.items.len - 1) {
|
||||
beammap.items[i].items[j + 1] += beammap.items[i].items[j];
|
||||
}
|
||||
beammap.items[i].items[j] = 0;
|
||||
task1 += 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Copy beams to next row
|
||||
if (i == beammap.items.len - 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (0..beamrow.items.len) |j| {
|
||||
beammap.items[i + 1].items[j] = beammap.items[i].items[j];
|
||||
}
|
||||
}
|
||||
|
||||
var task2: u64 = 0;
|
||||
for (beammap.items[beammap.items.len - 1].items) |n| {
|
||||
task2 += n;
|
||||
}
|
||||
|
||||
std.debug.print("{d}\n", .{task1});
|
||||
std.debug.print("{d}\n", .{task2});
|
||||
|
||||
for (map.items) |*row| {
|
||||
row.deinit(allocator);
|
||||
}
|
||||
|
||||
for (beammap.items) |*row| {
|
||||
row.deinit(allocator);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user