const std = @import("std"); const inputModule = @import("input.zig"); const indicatorsModule = @import("indicators.zig"); const MachineScheme = inputModule.MachineScheme; const readInput = inputModule.readInput; const Indicators = indicatorsModule.Indicators; const IndicatorSet = indicatorsModule.IndicatorSet; const createIndicators = indicatorsModule.createIndicators; const print = std.debug.print; const readInputIntoString = inputModule.readInputIntoString; const readMachineScheme = inputModule.readMachineScheme; pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const allocator = gpa.allocator(); var totalButtonPresses: i32 = 0; const machineSchemes = try readInput(allocator, "input.txt"); for (machineSchemes) |machineScheme| { var initialIndicators = try createIndicators(allocator, machineScheme); if (initialIndicators.isComplete()) { continue; } var buttonPresses: i32 = 1; var indicatorsSet = IndicatorSet.init(allocator); try initialIndicators.applyAllButtons(allocator, &indicatorsSet); outer: while(true) { var it = indicatorsSet.keyIterator(); while (it.next()) |indicators| { if (indicators.isComplete()) { break :outer; } } buttonPresses += 1; var nextIndicatorsSet = IndicatorSet.init(allocator); it = indicatorsSet.keyIterator(); while (it.next()) |indicators| { try indicators.applyAllButtons(allocator, &nextIndicatorsSet); } indicatorsSet = nextIndicatorsSet; } totalButtonPresses += buttonPresses; } print("total: {d}\n", .{totalButtonPresses}); }