From dabcdfc2e135d4bfb6d21468c9211aeb2b80e98a Mon Sep 17 00:00:00 2001 From: Lucia Ceionia Date: Fri, 6 Dec 2024 01:48:26 -0600 Subject: [PATCH] i don't know why i did that so stupidly this is like 25x faster --- 06/src/main.zig | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/06/src/main.zig b/06/src/main.zig index a65800f..20bd095 100644 --- a/06/src/main.zig +++ b/06/src/main.zig @@ -101,38 +101,36 @@ fn run2(s: []const u8) !u64 { var map2: [256][256]u8 = undefined; @memcpy(&map2, &omap); - var prev_states = std.ArrayList(u32).init(alloc); y = 0; while (y < 256) : (y += 1) { if (map[y][2] == 0) continue; x = 0; while (x < 256) : (x += 1) { - // attempt new obstacle... this is ugly and painfully slow + // attempt new obstacle... this is ugly // but i'm lazy if (y == sy and x == sx) continue; if (map[y][x] == 'X') { - prev_states.clearRetainingCapacity(); map2[y][x] = '#'; var iy = sy; var ix = sx; dy = -1; dx = 0; + var dir: u8 = 0; + var prev_states: [256][256][4]bool = .{.{.{false}**4}**256}**256; while (map2[iy][ix] != 0) { - const state: u32 = @intCast((@as(usize,@bitCast(dy))<<24)|(@as(usize,@bitCast(dx))<<16)|(iy<<8)|(ix)); - const idx = std.mem.indexOfScalar(u32, prev_states.items, state); - if (idx) |_| { + if (prev_states[iy][ix][dir]) { total += 1; break; } - try prev_states.append(state); + prev_states[iy][ix][dir] = true; ny = @intCast(@as(isize,@intCast(iy)) + dy); nx = @intCast(@as(isize,@intCast(ix)) + dx); while (map2[ny][nx] == '#') { - if (dy == -1 and dx == 0) { dy = 0; dx = 1; } - else if (dy == 0 and dx == 1) { dy = 1; dx = 0; } - else if (dy == 1 and dx == 0) { dy = 0; dx = -1; } - else { dy = -1; dx = 0; } + if (dir == 0) { dy = 0; dx = 1; dir = 1; } + else if (dir == 1) { dy = 1; dx = 0; dir = 2; } + else if (dir == 2) { dy = 0; dx = -1; dir = 3; } + else { dy = -1; dx = 0; dir = 0; } ny = @intCast(@as(isize,@intCast(iy)) + dy); nx = @intCast(@as(isize,@intCast(ix)) + dx); }