From dcb1bd10e79ece102778a19e73ef0dd9f7b3abe3 Mon Sep 17 00:00:00 2001 From: Inga Date: Thu, 14 Dec 2023 14:17:34 +0000 Subject: [PATCH] day 13, part 2 --- day13-hard/build.zig | 70 +++ day13-hard/hard.in | 1311 +++++++++++++++++++++++++++++++++++++++ day13-hard/sample.in | 15 + day13-hard/src/main.zig | 150 +++++ 4 files changed, 1546 insertions(+) create mode 100644 day13-hard/build.zig create mode 100644 day13-hard/hard.in create mode 100644 day13-hard/sample.in create mode 100644 day13-hard/src/main.zig diff --git a/day13-hard/build.zig b/day13-hard/build.zig new file mode 100644 index 0000000..d78ea1d --- /dev/null +++ b/day13-hard/build.zig @@ -0,0 +1,70 @@ +const std = @import("std"); + +// Although this function looks imperative, note that its job is to +// declaratively construct a build graph that will be executed by an external +// runner. +pub fn build(b: *std.Build) void { + // Standard target options allows the person running `zig build` to choose + // what target to build for. Here we do not override the defaults, which + // means any target is allowed, and the default is native. Other options + // for restricting supported target set are available. + const target = b.standardTargetOptions(.{}); + + // Standard optimization options allow the person running `zig build` to select + // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not + // set a preferred release mode, allowing the user to decide how to optimize. + const optimize = b.standardOptimizeOption(.{}); + + const exe = b.addExecutable(.{ + .name = "day13-hard", + // In this case the main source file is merely a path, however, in more + // complicated build scripts, this could be a generated file. + .root_source_file = .{ .path = "src/main.zig" }, + .target = target, + .optimize = optimize, + }); + + // This declares intent for the executable to be installed into the + // standard location when the user invokes the "install" step (the default + // step when running `zig build`). + b.installArtifact(exe); + + // This *creates* a Run step in the build graph, to be executed when another + // step is evaluated that depends on it. The next line below will establish + // such a dependency. + const run_cmd = b.addRunArtifact(exe); + + // By making the run step depend on the install step, it will be run from the + // installation directory rather than directly from within the cache directory. + // This is not necessary, however, if the application depends on other installed + // files, this ensures they will be present and in the expected location. + run_cmd.step.dependOn(b.getInstallStep()); + + // This allows the user to pass arguments to the application in the build + // command itself, like this: `zig build run -- arg1 arg2 etc` + if (b.args) |args| { + run_cmd.addArgs(args); + } + + // This creates a build step. It will be visible in the `zig build --help` menu, + // and can be selected like this: `zig build run` + // This will evaluate the `run` step rather than the default, which is "install". + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); + + // Creates a step for unit testing. This only builds the test executable + // but does not run it. + const unit_tests = b.addTest(.{ + .root_source_file = .{ .path = "src/main.zig" }, + .target = target, + .optimize = optimize, + }); + + const run_unit_tests = b.addRunArtifact(unit_tests); + + // Similar to creating the run step earlier, this exposes a `test` step to + // the `zig build --help` menu, providing a way for the user to request + // running the unit tests. + const test_step = b.step("test", "Run unit tests"); + test_step.dependOn(&run_unit_tests.step); +} diff --git a/day13-hard/hard.in b/day13-hard/hard.in new file mode 100644 index 0000000..09ca5ce --- /dev/null +++ b/day13-hard/hard.in @@ -0,0 +1,1311 @@ +.##.###..####.. +....#..#.####.# +.##.###...##... +.##..###..##..# +.##..##..#..#.. +####.#####..### +####.##..####.. +#..###..#.##.#. +#..#....##..##. +...#.#.###..### +......#.#.##.#. +.....##...##... +#####...##..##. + +....#.#..#. +####.##.### +##.##..#### +..#.#.#.... +#...#.###.# +..#.###.### +..#.###.### +....#.###.# +..#.#.#.... +.#.#....##. +.#.#....##. +..#.#.#.... +....#.###.# +..#.###.### +..#.###.### +#...#.###.# +..#.#.#.... + +......########... +....#..#.##.#..#. +##....########... +###..#.#.##.#.#.. +...#....####....# +#####.########.## +..#....##..##.... +###....#.##.#.... +##.#.#..#..#..#.# +###.....####..... +###.#.##....##.#. +###.#####..#####. +...#...#.##.#...# +..#####......#### +..#.####.##.####. +......#.#.##.#... +..#.####.##.####. + +##.#.##.#.# +.###.##.### +.###.##.### +##.#.##.#.# +.########## +.########## +...##..##.. +..#.####.#. +###..##..## +###..##..## +##.##..##.# +##..#.....# +..#.####.#. +..#.#..#.#. +#..#.##.#.. +#.#.####.#. +##..#..#..# + +#.#..#.#. +#...##### +.#..##..# +##..#.#.# +..##.###. +..##.###. +##..#.#.# +.#..##..# +##..##### +#.#..#.#. +.###.#.#. +###.#...# +..#.#.#.. +...##.#.. +...##.#.. + +.######## +####.##.# +#.##..#.# +....#..#. +.#.##..## +#.###..## +...##..## +####.##.# +#....##.. +###...... +.#..####. +.####..## +.####..## +.#..####. +###...... +#....##.. +####.##.# + +..##..##..#.# +..##..##..#.# +##...####...# +#.......#..## +.#..##.#.#.#. +#.##.......#. +..#.#...##... +#.#..#.##..#. +#.#..#.##..#. +..#.#...##... +#.##.......#. +.#..##.#.#.#. +#.......#..## +##...####..## +..##..##..#.# + +##########. +###.##.#### +..######... +.##....##.. +##......### +###....#### +..#.##.#..# + +####.####.####### +...##.##.##...... +.############.#.. +###.##..##.###... +.#.#..##..#.#.#.. +##...####...###.. +#....#..#....##.. +....#....#....### +.#..#.##.#..#..## +...###..#.#...#.. +#..#......#..#.## + +..##...#.## +..##...#.## +....#.##..# +#...###.### +...##.##.#. +.####....#. +.#.#...#.#. +.#.###.#.#. +.#.###.#.#. +.#.#...#.#. +.####....#. +...##.##.#. +#...###.### +....#.##..# +..#....#.## + +...#####..# +.#...##...# +.##...#...# +##.#......# +..#..##.##. +..##.##.##. +##.#......# +##.#......# +..##.##.##. +..#..##.##. +##.#......# + +###..#.#. +##...#.#. +......#.. +##..#.### +##.###.## +..####.#. +....#.##. +....##.#. +#....#... +##..##.## +##..##.## +#....#... +....##.#. +....#.##. +..####.#. + +.####..#..#.. +.####........ +#.##.#..##..# +#######..#.## +##..##......# +######.####.# +.####..####.. + +#..###..##..### +#..##..####..## +.....###..####. +######..##..### +....#........#. +#####.#....#.## +#..#.#.####.#.# + +#..###...#.#..#.# +#..###...#.#..#.# +##...##.#.#.##### +#.####........#.. +##..#..#..#...#.. +.###.##..#####.## +....#..###..#.#.# +..###...#........ +..###.#.#........ +....#..###..#.#.# +.###.##..#####.## +##..#..#..#...#.. +#.####........#.. + +#..#..# +..###.# +..####. +###.#.# +.###..# +.###### +###.... +###.... +.###.## +.###..# +###.#.# +..####. +..###.# +#..#..# +#..#.#. +#...##. +#...##. + +.....###..... +##..#..#..### +.###.##.###.. +#..######..## +.##.#..#.##.. +.##......##.. +.###....###.. +##..#..#..### +.##.#..#.##.. + +.....###..#.. +#.#...#.#..## +#####.##.#### +#..#..##.#### +#...#####.### +##.###.###.## +.#.###....#.. +.#.###....... +##.###.###.## + +...#.#....# +..######### +###.####### +##..###..#. +..#.####### +##....####. +..#..#....# +###..##..## +....####### +##.###....# +#######..## +...###....# +##..####### +###..#.##.# +##....#..#. + +..##..####..###.. +######...##..##.# +######...##..#..# +..##..####..###.. +######.##...####. +..##...###..#.... +#.##.##.####..... +........#######.. +.#..#.#...#...#.. +#....##..##...### +##..##..###.##.#. +#....###.####.... +.#..#.#.###.#...# + +#....##..#... +.##.......#.. +##.##..##..## +.#.##..##..## +.##.......#.. +#....##..#... +#...###.###.. + +.#....#.. +##.##.### +##.##.### +.#....#.. +.######.# +##.##.### +........# +##.#..##. +.######.# + +.......##.####.## +......#.##.##.##. +.#..#.#.#.....##. +##..#####..#.#..# +#.##.#.#.##.#.... +..##...###.#.#..# +......#..#....... +.####....##...... +.......##.##.#### +.#..#.##.###..##. +########..###.##. + +.....####.... +#####....#### +##..##..##..# +#.##......##. +#.##########. +..##..##..##. +#.##..##..##. +.####.##.#### +##..#.##.#..# + +#...#.####. +..##.###..# +#.#.##..... +########..# +..#..###..# +#....##.... +##..#..#..# +#..####.... +#..####.... +##..#..#..# +#....##.... +..#..###..# +########..# + +##..#......#.#..# +#...#......#.#..# +..#.#.#.##..#.... +###.###.##...#### +#..##.#...#.#.##. +#.####..##.#.#### +...#.#...#.##.##. +#.####.###..##..# +##..#..##.....##. +####.....##.##..# +.#.....##.###.... + +###..#######. +.##..##.###.# +##.##.##.#.#. +##.##.##.#.#. +.##..##.###.# +###..#######. +#......#..#.# +..####.##...# +#.####.####.. +.#.##.#.##... +#.#..#.#...## +#......#####. +##########.#. + +.#..#.##..# +######.#..# +......###.# +#....###..# +.#..#.#.#.. +.........#. +###.######. +#....#.#.## +......#.### +######.#... +#....#.##.. +#....#.##.. +######.#... +......#.### +#....#.#.## + +....##......##. +..#..##.##.##.. +###..#.####.#.. +...##.#....#.## +.#...#.####.#.. +#####...##...## +..#...#....#... +#######.##.#### +##.#####..##### +....#...##...#. +###.#.#.##.#.#. +..#.##########. +...#..........# +..#...######... +####...#..#...# + +#.#.##..#.. +#.....#.### +#####.##.## +#.####..... +##..###.... +#...#...#.. +##...###.#. +.#.######.. +.#.######.. + +##.#.#..# +..#.##.## +#....#### +##.##.#.. +.##...### +.##...##. +##.##.#.. +#....#### +..#.##.## +##.#.#..# +.#..##.## +.#..##.## +##.#.#..# +..#.##.## +#....#### + +.##.###........#. +##.#.##...#.##### +.#..#.###.#####.# +.#..#.###.#####.# +##.#.##..##.##### +.##.###........#. +##.##..#....#.### +#...#....######## +.###.#..###.....# +.###.#..###.....# +#...#....######## +##.##..#....#.### +.##.###........#. + +#.#....#.##.### +...#..#...#.### +..........##### +##########..... +#.#.##.#.#..#.. +......#...#.### +.#......#...... +#..####..#.#... +....##....##.## +#.######.#..### +##.#..#.###..## +##......##.##.. +.##....##.##.## + +#.###.### +#.###.### +.##.##### +###.##..# +..##.#.## +.###.#.## +..#.#.#.# +.#.#...#. +#..###.#. +#..###.#. +.#.#...#. +..#.#.#.# +.###.#.## +..##.#.## +###.##..# +.##.##### +#####.### + +......#.#..###. +###..####....#. +####..###.###.. +###.######..... +#######.#.##... +#######.#.##... +###.######..... +####..###.###.. +###..####....#. +......#.#..###. +#####...#####.# +.#.###.#..#.### +###..###...#... +..##....##..... +###.##..##.#.#. +####...##.#.#.# +####..#.#.###.. + +...##...... +..#....##.. +###..###### +#.#.##....# +..###.#..#. +....#.####. +######.##.# + +#..##....###. +#..##....###. +#....#.###... +.####.##.#.## +.####..#...## +####.#...#... +.###...#.#... +.###...#.#.#. +####.#...#... +.####..#...## +.####.##.#.## + +..##..#.##...#.## +....##....#..#... +....##....#..#... +.###..#.##...#.## +####.....#.....## +#.##...##.##.##.. +.###.....####.### +#.#...###.##.##.. +#.....###.#####.. +##.##.#..#.#...## +.#####.##..#...## +.####.#.#....#### +.#.#.##.#.####... +..#..##...#.##### +.####...##..##... + +##..#.# +##..#.# +...###. +##.#.## +.#..### +..#..## +......# + +..##.## +##..### +.###..# +####.## +#.##.## +#.#...# +#.##### +###.... +#...... +.#.###. +.#.###. +#...... +###.... +#.##### +#.#...# +#.##.## +####.## + +#.####.#..###.##. +.#....#.#.#.##..# +##....##.##.##..# +.#....#.#.##..##. +###########..#..# +.#....#..#..##### +..#..#....###.##. +.#.##.#..#...#..# +#..##..##.##.#### +##....#####.##### +.###.##....##.... + +.####...##....# +#.##.##.##....# +########..####. +######.#..####. +.####...#...... +..##..#........ +#########...... +.####..###....# +#....#####...## +#....#.#.##..## +..##....#.####. +..##...######## +######...##..## +.####.#.#.#..#. +.#..#...#...... + +.#..#.#..## +.#..#.#..## +..####..... +##.....##.. +..#.#....#. +..####.###. +....#.##..# +##.#..###.# +##.#..###.# +....#.##..# +..####.###. +..#.#....## +##.....##.. +..####..... +.#..#.#..## + +#######..#...## +....#.#.#.###.# +##.....##...... +##.....##...... +....#.#.#.###.# +#######..#...## +#.##.#.###.###. +##..#.##.....#. +.#.##...####... +###.###..##..## +..##.....#..... +..##.....#..... +###.###..#...## + +.#.###.###### +.....#..#.#.. +#..#.##...... +..##.####.### +#.#...##...## +..#.###..#### +##.#.#..##... +.##.#.##.#.## +..###.#.#.#.. +.#.#.#.###.## +##.###..##... +##.###..##... +.#...#.###.## + +###..#####.##.### +..###.#####..#### +###....#.##..##.# +##.####..######.. +..#.#..##.#..#.## +##..###..#....#.. +###.##...######.. +....#..###....### +##..##.####..#### +##.#.#...#.##.#.. +..#.#####..##..## +#####.....#..#... +#######.##.##.##. +.....#.##.#..#.## +###..#.#.######## +..#..######..#### +##.##.....####... + +..#........ +#..#..##..# +####..##..# +..###....## +..###....## +####..##..# +...#..##..# +..#........ +#.##..##..# +...#.####.# +.#.#.#..#.# + +###.#.####. +.##.####### +.####.####. +###.#...... +##...#.##.# +.#.###....# +.####.#.... +#....##..## +.##....##.. +##.###....# +.#.#..#..#. +.##.#.#..#. +#.#..#.##.# +#.#####..## +.#.#.###### +#..####..## +#..####..## + +####.##.#.### +##.##.#.##### +###..#.#.#..# +##..#..#.#### +...#.##.##### +...#...#..... +..#.##.#..... +..###.#.##..# +##.#######..# + +.#.#.###### +.#....##..# +.##..#.#..# +.#####..##. +###.#..#### +...##.#.... +.#..##..... +.#..##..... +...##.#.... +###.#..#### +.######.##. +.##..#.#..# +.#....##..# + +####..##..# +.##........ +.##..####.. +####.....## +#####.##.## +.....#..#.. +....#....#. + +..#..#. +....#.# +##.##.# +##...## +...#... +##..##. +##.###. + +.####..#.#.##...# +.####.##.#..#...# +.####.#.....##..# +..##...#####...#. +#.##.#.###..##... +.####.#.#.##.###. +##..###..#...#... +.####.#....##.### +.####.#...###.### + +...#..##### +.....#..#.# +#.###..#.## +#.###..#.## +.....#..#.# +...#..##### +#.#...#.##. +#.#.#.##.## +#..#.##.... +.##...##..# +..#...##..# + +..####.##.# +...###.##.# +.#..##.##.# +.###.##..## +...#.#....# +#.#...####. +...#....... +.#.##.#..#. +#....#.##.# +#....###### +...#....... + +#..##...####...## +..#...###...##... +.#.#.##..##..##.# +..#...#..##..#... +..#.#.##.##.##.#. +.###.##.####.##.# +......#..##..#... +##.#.#..####..#.# +##.#.#..####..#.# + +##..###..#..#.# +.####.#.#.#..## +..##..###.#.### +#.##.#.....###. +#.##.#.....###. +..##..###.#.### +.####.#.###..## + +...#.######.##.## +...#.######.##.## +#..##.....####.#. +..#######..####.. +#....####.#.##.#. +..##..#.####..### +##...#.#.##.##.## +.#.#..#.....##... +##..##.##..#..#.. +###.#..##.#.##.#. +####..#.##......# +.######..######## +###.#.###.##..##. + +..##.###..#.#.. +#..#......###.. +.#.########.... +.#.########.... +#..#......###.. +..#..###..#.#.. +.#.##.#.#.#.... +.##.###..##..## +.#...##.###..## +.##.#.###.#.... +.####..#.#..### +#..#######..### +..##..#......## + +#.#..###....### +.........#.#.## +.#....###....## +#....###..#.... +#....###..#.... +.#....###....## +.........#.#.## +#.#..###....### +..#.#..#.##.... +#.#..##..#..#.# +...#...#......# +#.#..#.#####.## +#.#..#.######## + +.#.#.#...#. +.#.#.#...## +.#.#.#...## +.#.#.#...#. +#.#..###.## +####.#....# +##.##.#..## +#...#####.# +#..##...#.# +#.###...#.# +.#.#....### +###..#..#.# +#.......#.. +.##.#####.# +##.##....#. + +######..########. +....##..###..###. +#..#..####.##.### +.....#.#.#.##.#.# +#..##...##....##. +..........####... +#..##.###..##..## +.......#..####..# +.....#....####... +#..###.#..####..# +####..#####..###. +#####..###....### +#..#.##.########. + +.#..#......#. +#####.#..#.## +#####.#..#.## +.#..#......#. +###.##....##. +###..#....#.. +#.#..######.. +..###.####.## +#...########. +###.#......#. +#.########### +##.#.######.# +.#..##....##. +..#.##.#####. +##.#.#....#.# +##.##..##..## +###.###..###. + +##.####...... +..#...#.#.##. +##.#..##.#.## +##..####..##. +.....###..... +##..##.#..##. +..##....#.... +##.##...##### +..###.#.#.##. + +####.#### +..##.#### +##..#.##. +#####.... +#..#.#### +#..#.#### +#####.... +##..#.##. +.###.#### + +#.##.#.###.## +#.##.#.###.## +##..##..##### +.####.##.##.# +.###...###..# +.#..#..#..### +..##...##.### +#....#..###.# +.#..#.......# +..##..##..### +#....##.###.# +#....#.#..... +.####.##.###. +.####..####.# +..##..#.##... + +....##########... +.##.##......##.## +...####.##.####.. +####.########.### +#.#####.##.#####. +#..##.######.##.. +###.#..#..#..#.## + +.##.##.##.#.#...# +....##.....###..# +#.##..##.#.##..## +...#..#...#.###.. +#...##...###..... +#...##...####.... +...#..#...#.###.. + +.###.#. +####.## +####.## +.###.#. +.....## +###.### +.#..### +#.#...# +.##..## +..##.#. +..#.#.# +..#...# +..##.#. +.##..## +#.#...# + +########..##. +###.#....#... +...#.###.##.# +...#.###.##.# +###.#...##... +########..##. +.....#..#..#. +....#.#..#### +##....####.## +###...#...##. +##.####.#.#.# +##.###.##.##. +....#.###.##. +......###.#.# +..######..#.. +...#..####..# +######.#.##.. + +.####.#...##.#. +..##....#####.. +#.##.##..#####. +##..###.#.###.# +.####.#.#...... +#.##.###..#...# +#.##.###..#...# +.####.#.#...... +##..###.#.###.# +#.##.##..###### +..##....#####.. + +##..##.#.......#. +..#.##...#.#...## +#..###..##.#.#..# +.#.#...####.##..# +##.#..#..##....#. +...#.#######..### +.#.##......##..#. +.#.##......##..## +...#.#######..### +...#.#######..### +.#.##......##..## +.#.##......##..#. +...#.#######..### + +.......#.##.# +##..##.###..# +.........#..# +#.##.#..####. +#######...... +#.##.####...# +#.##.#####..# + +.####.##.## +.##..#####. +....#.##... +....#.##... +.##..#####. +.####.##.## +###.#####.. +...#.#..#.. +.#....###.. +.##...#.### +##......### +##......### +.##...#..## + +###.#.#.# +#.##.##.# +#.##.##.# +###.#...# +....#.#.# +..##..#.. +.#####.#. +#.#.#...# +...###### +..#..###. +##...##.. +#.###.### +.##.###.# +###...##. +###...##. + +#.####### +#..###### +#..#....# +.#.##..## +..###..## +...#....# +##.#####. +####....# +####....# +##.#####. +...#....# +..###..## +.#.##..## +#..#....# +#..###### +#.####### +.#....... + +.###.##...####### +###..#.#####.#..# +.####.#.##.##.#.# +.##.....##.##.#.# +...######.##.#.## +...######.##.#.## +.##.....##.##.#.# +.####.#.##.##.#.# +###..#.#####.#..# +.###.##...##.#### +##.###...##..##.. +##.###...##..##.. +.###.##...##.#### +###..#.#####.#..# +.####.#.##.##.#.# + +..####..# +...#..### +#..####.. +#.#.#.##. +#####..## +..##.#.#. +..##.#.#. +#####..## +#.#.#.##. +#..####.. +...#..### +..####..# +####.#### +.###.#### +..####..# +...#..### +#..####.. + +.##..#. +#..#..# +....### +#..#.#. +#..#.#. +....### +#..#..# +.##..#. +#...#.. +####..# +.##..#. +.....#. +#..##.# + +#.##..##. +#...##... +...####.. +.######## +#..#..#.. +#..#..#.. +#...##... +.##.##.## +.###..### +#...##... +.###..### + +##.##........##.# +########..####### +...##.######.##.. +..#.#.##..##.#.#. +....###.##.###... +##.#..######..#.# +##...#.####.....# +..###........###. +#####...##...#### +..#####....#####. +....####..####... +..#..#.#..#.#..#. +#####...##...#### + +...#.######.#.. +..##........##. +##.##########.# +###.##.##.##.## +##.#..####..#.# +..#####..#####. +####.######.### +##.#..#..#..#.# +####..#..#..### +..##...###..##. +##...#.##.#...# + +..##....##. +##.##..##.# +..########. +..#.##.#.#. +..##....##. +..#.####.#. +##.######.# + +#..#..##....### +....#.#..##..#. +....##.#######. +....##.#######. +....#.#..##..#. +#..#..##....### +#..##...##.##.# +#####.#...#.... +.......#...#.## +.......######.. +.##.##.#.###... +.##.##.###.#.## +..#...###..#... + +...#..#.###.#.. +##.#####....### +.....##..##.##. +###.##..##..... +###.#.##..#.### +###..##.#..##.# +...#.##.##..##. +.....#...#.###. +..#...####.###. +..##.###...#### +..###...####### +###.#.##.#..#.. +........#..##.. +....#..#.##...# +....#....##...# + +#.##.#..#.# +#.##.#..#.# +###..####.. +.##.#..#.#. +...##.##.## +###.##..##. +#....####.. + +##.#.#.##.#.. +...##....#### +.##..##.##### +#.##.##...### +#....##..##.# +..##..#.##..# +..##..#.##..# +#....##..##.# +#.##.##...### +.##..##.##### +...##....#### +##.#...##.#.. +##.#...##.#.. + +........#..#... +#######.#.##### +.####.#.####... +.####.#...###.. +#.##.#....#..#. +.#..#......##.. +.......##..###. +##..##....##### +######.#..##### +######.#..##### +##..##...###### + +#..#....##... +..##.##.##.## +###..##.##.## +##...##.##.## +###.....##... +.....##.##.## +..###.#....#. +#......####.. +#.##......... +..######..### +##..####..### +..#.#........ +#.##...#..#.. + +##.#.#... +#.#...... +#....#### +#....###. +#.#...... +##.#.#... +..#.#.#.# +..#.#.#.# +##.#.#... +#.#...... +#....###. + +.##..##..###.## +.###.##..###.## +###.#....#..#.. +..#....#.##..#. +##...#..#....#. +..####.##.#.#.. +..####.##.#.#.. + +.##...### +#..#.#..# +...#.#..# +##.##.... +######..# +######..# +##.##.... + +########...####.. +...##....######## +...##....#......# +###...##.##....## +..####..#.#....#. +#.####.#.##....## +###..###.#.#..#.# +###..###.######## +.######..###..### + +###.#.. +.#...## +####... +##.#.## +####.## +####.## +..###.. +..#..## +###.### +..#.... +###.... +##.#.## +##..#.. +..##### +###..## + +#..#..##### +#..#..##### +#####.##.#. +###.....#.# +###.###...# +..#.#..##.# +..#.#..##.# +###.###...# +###....##.# + +#..#.#.#.#.## +####.#..##### +...#....#.#.# +#..##.###.... +.....###..##. +####..#....## +#..##..#.#..# +#..##..#.#..# +####..#....## + +.#.#...#.#..#.# +##.####...##... +#.###.#........ +.#.##...######. +.#.##...######. +#.##..#........ +##.####...##... +.#.#...#.#..#.# +.#..##..######. + +####..### +.###.#### +...###.## +.......## +..#.#.### +###.##.## +#..#.##.. +###..#### +###..#### +...#.##.. +###.##.## +..#.#.### +.......## + +####.##..#### +######.####.. +#####.###.### +#..#..#.#..#. +#..#..#.#..#. +#####.###.### +######.####.. +####.##..#### +....#......## +.##..#..#.#.. +.##.##..#.... +##.#..#.##... +#..##.##...#. +......#..###. +.....#..##.## + +#.##..###.... +....######### +##.###....... +...##..##.... +...#.#.##.... +.#.##..#..... +...#####.#### +######..##### +....#.####### +#.#######.... +.###...#.#..# \ No newline at end of file diff --git a/day13-hard/sample.in b/day13-hard/sample.in new file mode 100644 index 0000000..f226414 --- /dev/null +++ b/day13-hard/sample.in @@ -0,0 +1,15 @@ +#.##..##. +..#.##.#. +##......# +##......# +..#.##.#. +..##..##. +#.#.##.#. + +#...##..# +#....#..# +..##..### +#####.##. +#####.##. +..##..### +#....#..# \ No newline at end of file diff --git a/day13-hard/src/main.zig b/day13-hard/src/main.zig new file mode 100644 index 0000000..3a622ac --- /dev/null +++ b/day13-hard/src/main.zig @@ -0,0 +1,150 @@ +const std = @import("std"); + +fn StackList(comptime T: type, comptime capacity_type: type, comptime capacity: capacity_type) type { + return struct { + const Self = @This(); + mem: [capacity]T, + length: capacity_type, + + fn add(self: *Self, value: T) void { + self.mem[self.length] = value; + self.length += 1; + } + + fn has(self: *Self, needle: T) bool { + for (0..self.length) |i| { + if (self.mem[i] == needle) { + return true; + } + } + + return false; + } + + fn getMutableSlice(self: *Self) []T { + return (&self.mem)[0..self.length]; + } + + fn getSlice(self: *const Self) []const T { + return self.mem[0..self.length]; + } + + fn init() Self { + return Self{ + .mem = undefined, + .length = 0, + }; + } + }; +} + +fn isMirroredHorizontallyAt(lines: []const []const u8, mirror_before: usize) bool { + var differences: u8 = 0; + + var a = mirror_before - 1; + var b = mirror_before; + + while (a >= 0 and b < lines.len) { + for (lines[a], lines[b]) |char_a, char_b| { + if (char_a != char_b) { + differences += 1; + if (differences > 1) { + return false; + } + } + } + + if (a == 0) { + break; + } + a -= 1; + + b += 1; + } + + return differences == 1; +} + +fn isMirroredVerticallyAt(lines: []const []const u8, mirror_before: usize) bool { + var differences: u8 = 0; + + for (lines) |line| { + var a = mirror_before - 1; + var b = mirror_before; + + while (a >= 0 and b < line.len) { + if (line[a] != line[b]) { + differences += 1; + if (differences > 1) { + return false; + } + } + + if (a == 0) { + break; + } + a -= 1; + + b += 1; + } + } + + return differences == 1; +} + +fn solveLines(lines: []const []const u8) usize { + var result: usize = 0; + + var column: usize = 1; + while (column < lines[0].len) : (column += 1) { + if (isMirroredVerticallyAt(lines, column)) { + result += column; + } + } + + var row: usize = 1; + while (row < lines.len) : (row += 1) { + if (isMirroredHorizontallyAt(lines, row)) { + result += 100 * row; + } + } + + return result; +} + +pub fn solveAll(reader: anytype) !usize { + var result: usize = 0; + while (true) { + var allocator_buffer: [10000]u8 = undefined; + var fba = std.heap.FixedBufferAllocator.init(&allocator_buffer); + var allocator = fba.allocator(); + + var lines = StackList([]const u8, usize, 100).init(); + var empty_line_reached = false; + + var line_buffer: [1000]u8 = undefined; + while (try reader.readUntilDelimiterOrEof(&line_buffer, '\n')) |line| { + if (line.len == 0) { + empty_line_reached = true; + break; + } + lines.add(try allocator.dupe(u8, line)); + } + + result += solveLines(lines.getSlice()); + + if (!empty_line_reached) { + return result; + } + } +} + +pub fn main() !void { + const stdout = std.io.getStdOut().writer(); + + const raw_in = std.io.getStdIn(); + var buffered_reader = std.io.bufferedReader(raw_in.reader()); + var reader = buffered_reader.reader(); + const result = try solveAll(&reader); + try stdout.print("{d}\n", .{result}); +}