From d68ac82e5d1bf693783cbd00cbc97abef13d15ba Mon Sep 17 00:00:00 2001 From: ktkk Date: Wed, 10 Dec 2025 20:42:15 +0000 Subject: [PATCH] Finish day10, part 1 --- src/days/day10.zig | 78 +++++++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 25 deletions(-) diff --git a/src/days/day10.zig b/src/days/day10.zig index 8f2b7d4..e70ce94 100644 --- a/src/days/day10.zig +++ b/src/days/day10.zig @@ -3,14 +3,27 @@ const std = @import("std"); pub const title = "Day 10: Factory"; pub fn run(allocator: std.mem.Allocator) !void { - //const input = @embedFile("./input/day10.txt"); - const input = - \\[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7} - \\[...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2} - \\[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5} - ; + const input = @embedFile("./input/day10.txt"); + //const input = + // \\[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7} + // \\[...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2} + // \\[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5} + // ; + //const input = + // \\[#...#] (1,3) (2,3,4) (0,2,3) (0,1,2) (2,3) {37,24,60,50,16} + // \\[##...#..] (0,1,3,5,6) (0,1,5) (4) (5,6) (0,4,7) (1,2,5) (3) {23,18,2,26,14,36,25,7} + // ; var lines = std.mem.tokenizeScalar(u8, input, '\n'); + + var accumulator: usize = 0; + + var light_states: std.ArrayList(std.bit_set.IntegerBitSet(Machine.MaxLightCount)) = .empty; + defer light_states.deinit(allocator); + + var next_light_states: std.ArrayList(std.bit_set.IntegerBitSet(Machine.MaxLightCount)) = .empty; + defer next_light_states.deinit(allocator); + var i: usize = 0; while (lines.next()) |line| { defer i += 1; @@ -20,10 +33,41 @@ pub fn run(allocator: std.mem.Allocator) !void { std.debug.print("{f}\n", .{machine}); - const initial_lights_state: std.bit_set.IntegerBitSet(Machine.MaxLightCount) = .initEmpty(); - const button_presses = machine.pressButtonSequences(initial_lights_state); - std.debug.print("machine {d} required {d} button presses", .{i, button_presses}); + light_states.clearRetainingCapacity(); + try light_states.append(allocator, .initEmpty()); + + var buttons_pressed: usize = 0; + + outer: while (true) { + next_light_states.clearRetainingCapacity(); + + buttons_pressed += 1; + for (light_states.items) |state| { + for (machine.buttons) |button| { + const next_state = state.xorWith(button); + if (next_state.eql(machine.lights_goal)) { + break :outer; + } + try next_light_states.append(allocator, next_state); + } + } + + light_states.clearRetainingCapacity(); + try light_states.appendSlice(allocator, next_light_states.items); + } + + std.debug.print("machine {d} requires {d} button presses\n", .{i, buttons_pressed}); + + accumulator += buttons_pressed; } + + var buffer: [64]u8 = undefined; + var stdout_writer = std.fs.File.stdout().writer(&buffer); + const stdout = &stdout_writer.interface; + + try stdout.print("{d}\n", .{accumulator}); + + try stdout.flush(); } const Machine = struct { @@ -83,21 +127,5 @@ const Machine = struct { try w.print("({b})", .{button.mask}); } } - - pub fn pressButtonSequences( - self: Self, - initial_lights_state: std.bit_set.IntegerBitSet(MaxLightCount), - buttons_pressed: *usize, - ) usize { - var button_presses: usize = 0; - for (self.buttons) |button| { - const result = initial_lights_state.xorWith(button); - if (result.mask == self.lights_goal.mask) { - return 1; - } - button_presses += self.pressButtonSequences(result); - } - return button_presses; - } };