108 lines
2.8 KiB
Zig
108 lines
2.8 KiB
Zig
|
|
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);
|
||
|
|
}
|
||
|
|
}
|