const std = @import("std"); const common = @import("common.zig"); const Idx = common.Idx; const AtomicIdx = std.atomic.Value(Idx); const AtomicOrder = std.builtin.AtomicOrder; const Mappings = common.Mappings; const List = std.ArrayList; const alloc = std.heap.page_allocator; const data = @embedFile("inputs/puzzle.txt"); pub fn main() !void { const stdout = std.io.getStdOut().writer(); const parsed = try common.parse(data); const mappings = parsed.mappings; const seeds = parsed.seeds; var chunk = std.mem.window(Idx, seeds.items, 2, 2); var threads = List(std.Thread).init(alloc); var min_loc = AtomicIdx.init(18_446_744_073_709_551_615); // Just brute force this bitch while (chunk.next()) |pair| { const start = pair[0]; const end = pair[0] + pair[1]; const thread = try std.Thread.spawn(.{}, get_min_location, .{ &mappings, &min_loc, start, end }); try threads.append(thread); } for (threads.items) |thread| { thread.join(); } try stdout.print("{d}\n", .{min_loc.raw}); } fn get_min_location(mappings: *const Mappings, min_loc: *AtomicIdx, start: Idx, end: Idx) !void { for (start..end) |seed| { const ss_map = mappings.get(.{ .Seed, .Soil }).?; const soil = ss_map.get(seed); const sf_map = mappings.get(.{ .Soil, .Fertilizer }).?; const fert = sf_map.get(soil); const fw_map = mappings.get(.{ .Fertilizer, .Water }).?; const water = fw_map.get(fert); const wl_map = mappings.get(.{ .Water, .Light }).?; const light = wl_map.get(water); const lt_map = mappings.get(.{ .Light, .Temperature }).?; const temp = lt_map.get(light); const th_map = mappings.get(.{ .Temperature, .Humidity }).?; const humi = th_map.get(temp); const hl_map = mappings.get(.{ .Humidity, .Location }).?; const loc = hl_map.get(humi); if (loc < min_loc.load(AtomicOrder.SeqCst)) { min_loc.store(loc, AtomicOrder.SeqCst); } } }