commit 2731cabf57beb5d1331af00d10929971b631591d
parent 81f21c1a2d2f250b13df1ad394465f10bb65132e
Author: bsandro <email@bsandro.tech>
Date: Wed, 25 Dec 2024 22:06:19 +0200
Day 25 p1
Diffstat:
A | day25/Makefile | | | 28 | ++++++++++++++++++++++++++++ |
A | day25/input.txt | | | 3999 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | day25/main.cpp | | | 77 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | day25/test1.txt | | | 39 | +++++++++++++++++++++++++++++++++++++++ |
4 files changed, 4143 insertions(+), 0 deletions(-)
diff --git a/day25/Makefile b/day25/Makefile
@@ -0,0 +1,28 @@
+NAME=$(shell basename ${PWD})
+SRC=$(wildcard *.cpp)
+DEPS:=$(wildcard *.hpp)
+OBJ:=$(SRC:.cpp=.o)
+CXXFLAGS=-O2 -std=c++23 -Werror -Wall -Wextra -I. -I../include
+LDFLAGS=-lstdc++
+
+all: $(NAME)
+
+.PHONY: clean run
+
+clean:
+ rm -f $(OBJ) $(NAME)
+
+%.o : %.c $(DEPS)
+ @$(CC) $(CFLAGS) -c $< -o $@
+
+$(NAME): $(OBJ)
+ @$(CC) $(OBJ) -o $@ $(LDFLAGS)
+
+run: $(NAME)
+ @./$(NAME) input.txt
+
+test1: $(NAME)
+ @./$(NAME) test1.txt
+
+test2: $(NAME)
+ @./$(NAME) test2.txt
diff --git a/day25/input.txt b/day25/input.txt
@@ -0,0 +1,3999 @@
+.....
+#....
+#....
+##..#
+###.#
+#####
+#####
+
+#####
+###.#
+###..
+.##..
+..#..
+.....
+.....
+
+.....
+.....
+.....
+.#...
+##...
+###.#
+#####
+
+#####
+#####
+##.#.
+##...
+.#...
+.#...
+.....
+
+#####
+###.#
+###.#
+###..
+##...
+.#...
+.....
+
+#####
+###.#
+.#..#
+....#
+....#
+....#
+.....
+
+#####
+#####
+.##.#
+.##.#
+..#.#
+..#..
+.....
+
+#####
+##.##
+##.##
+##.##
+.#.##
+.#..#
+.....
+
+#####
+#####
+##.##
+#..##
+#..#.
+.....
+.....
+
+.....
+.....
+#..#.
+#..#.
+##.#.
+##.#.
+#####
+
+#####
+#####
+#####
+###.#
+#.#.#
+#....
+.....
+
+#####
+.####
+.####
+.#.##
+...##
+...#.
+.....
+
+.....
+#....
+##...
+##..#
+##.##
+##.##
+#####
+
+#####
+##.##
+.#.##
+.#.#.
+.#.#.
+.....
+.....
+
+.....
+...#.
+#..#.
+#..#.
+##.##
+#####
+#####
+
+#####
+####.
+#.#..
+#.#..
+..#..
+..#..
+.....
+
+#####
+#####
+#.##.
+#.##.
+#.##.
+..#..
+.....
+
+.....
+...#.
+...#.
+..###
+..###
+#.###
+#####
+
+.....
+.....
+.....
+...#.
+.#.#.
+##.#.
+#####
+
+#####
+####.
+.###.
+.#.#.
+.#.#.
+.....
+.....
+
+#####
+#####
+##.##
+##..#
+.#..#
+....#
+.....
+
+.....
+..#..
+..#..
+.##..
+.##..
+###.#
+#####
+
+.....
+.#...
+##...
+##...
+##..#
+###.#
+#####
+
+#####
+#####
+#####
+##.#.
+#..#.
+#....
+.....
+
+.....
+.#...
+.##..
+###..
+###.#
+#####
+#####
+
+.....
+.....
+....#
+#...#
+##.##
+##.##
+#####
+
+.....
+....#
+#..##
+#..##
+#.###
+#####
+#####
+
+.....
+.....
+...#.
+...##
+#.###
+#.###
+#####
+
+#####
+#####
+.####
+.#.#.
+.#.#.
+...#.
+.....
+
+#####
+.####
+..###
+..##.
+..##.
+..#..
+.....
+
+.....
+.....
+.#...
+.#...
+.#...
+###.#
+#####
+
+.....
+...#.
+...#.
+.#.#.
+.#.##
+##.##
+#####
+
+#####
+.####
+.##.#
+.##.#
+.##..
+.#...
+.....
+
+.....
+...#.
+...#.
+...#.
+.#.#.
+####.
+#####
+
+.....
+.....
+.....
+#...#
+#...#
+##.##
+#####
+
+#####
+#####
+###.#
+###.#
+.#..#
+.....
+.....
+
+.....
+#..#.
+#..##
+##.##
+##.##
+#####
+#####
+
+.....
+.....
+.....
+.....
+#.#..
+#.##.
+#####
+
+#####
+####.
+###..
+###..
+###..
+#.#..
+.....
+
+.....
+.....
+.#...
+.#..#
+.##.#
+.##.#
+#####
+
+#####
+#.###
+..###
+..###
+...#.
+.....
+.....
+
+#####
+#####
+###.#
+###.#
+#.#.#
+#....
+.....
+
+#####
+#####
+##.##
+.#.#.
+...#.
+...#.
+.....
+
+.....
+....#
+.#..#
+.#..#
+###.#
+#####
+#####
+
+#####
+###.#
+.##.#
+.#..#
+.#..#
+....#
+.....
+
+#####
+##.##
+##.##
+#..##
+....#
+.....
+.....
+
+#####
+##.##
+##.##
+#..#.
+#..#.
+...#.
+.....
+
+#####
+###.#
+###.#
+#.#.#
+#...#
+#...#
+.....
+
+.....
+.....
+....#
+#...#
+#.#.#
+#####
+#####
+
+#####
+#####
+#####
+#####
+#.#.#
+#.#.#
+.....
+
+.....
+.#.#.
+.#.#.
+##.##
+##.##
+#####
+#####
+
+.....
+..#.#
+.##.#
+.##.#
+.##.#
+.####
+#####
+
+#####
+####.
+####.
+#.##.
+#.##.
+...#.
+.....
+
+#####
+###.#
+.##.#
+.#...
+.#...
+.#...
+.....
+
+.....
+..#..
+.##..
+.##..
+.##.#
+.####
+#####
+
+.....
+.#...
+.#...
+.#..#
+##.##
+##.##
+#####
+
+#####
+#.#.#
+..#.#
+..#..
+..#..
+..#..
+.....
+
+#####
+#.###
+#.##.
+..##.
+..##.
+..#..
+.....
+
+.....
+.#...
+.#...
+.#.#.
+####.
+#####
+#####
+
+#####
+####.
+####.
+.###.
+..#..
+.....
+.....
+
+.....
+#....
+#....
+##...
+##...
+###.#
+#####
+
+#####
+###.#
+#.#.#
+#.#..
+.....
+.....
+.....
+
+#####
+#.###
+#.###
+#.#.#
+#.#.#
+..#..
+.....
+
+#####
+###.#
+.##.#
+..#.#
+..#..
+.....
+.....
+
+.....
+....#
+.#..#
+##..#
+##..#
+##.##
+#####
+
+.....
+..#..
+#.#.#
+#.#.#
+#.#.#
+#.###
+#####
+
+#####
+#####
+####.
+##.#.
+##.#.
+.#...
+.....
+
+.....
+.#...
+.#...
+.#.#.
+##.#.
+#####
+#####
+
+.....
+...#.
+#..#.
+#..#.
+#..##
+#.###
+#####
+
+#####
+##.##
+#..#.
+#....
+#....
+.....
+.....
+
+#####
+.####
+.####
+..##.
+...#.
+.....
+.....
+
+#####
+#####
+#####
+####.
+##.#.
+.#.#.
+.....
+
+.....
+.....
+.....
+..#..
+.###.
+.####
+#####
+
+#####
+##.##
+#..##
+#..##
+#..#.
+#..#.
+.....
+
+.....
+.....
+.....
+#.#..
+###.#
+###.#
+#####
+
+.....
+.....
+...#.
+#..#.
+#.##.
+####.
+#####
+
+#####
+#####
+####.
+####.
+.##..
+.#...
+.....
+
+.....
+#..#.
+##.##
+##.##
+#####
+#####
+#####
+
+#####
+###.#
+###.#
+#.#.#
+..#..
+..#..
+.....
+
+.....
+.....
+#....
+#..#.
+#..#.
+#.##.
+#####
+
+.....
+.....
+..#..
+#.#..
+#.#..
+###.#
+#####
+
+#####
+#####
+##.##
+.#.#.
+.#...
+.#...
+.....
+
+.....
+..#..
+..#.#
+..#.#
+.####
+.####
+#####
+
+#####
+.####
+.#.##
+.#..#
+....#
+.....
+.....
+
+#####
+###.#
+###..
+#.#..
+#.#..
+.....
+.....
+
+#####
+##.##
+##..#
+.#...
+.#...
+.....
+.....
+
+#####
+###.#
+.##.#
+.##.#
+.#...
+.#...
+.....
+
+.....
+#....
+##...
+##..#
+###.#
+#####
+#####
+
+.....
+.....
+.#.#.
+.#.#.
+.###.
+.###.
+#####
+
+#####
+##.##
+#...#
+....#
+....#
+.....
+.....
+
+#####
+##.#.
+#..#.
+#..#.
+#..#.
+.....
+.....
+
+#####
+##.##
+.#.#.
+.....
+.....
+.....
+.....
+
+#####
+#####
+#####
+#.#.#
+....#
+....#
+.....
+
+#####
+#####
+###.#
+.##.#
+..#.#
+..#.#
+.....
+
+.....
+..#..
+..#..
+.##..
+.##.#
+#####
+#####
+
+.....
+.....
+.....
+#.#.#
+#.###
+#.###
+#####
+
+#####
+#####
+####.
+##.#.
+#..#.
+...#.
+.....
+
+#####
+####.
+#.#..
+#....
+#....
+.....
+.....
+
+#####
+#####
+#.###
+#.#.#
+..#..
+.....
+.....
+
+#####
+####.
+#.##.
+#.##.
+#..#.
+...#.
+.....
+
+#####
+###.#
+.##.#
+.##.#
+..#.#
+.....
+.....
+
+#####
+####.
+####.
+#.#..
+.....
+.....
+.....
+
+.....
+#..#.
+#..#.
+#.##.
+#.##.
+####.
+#####
+
+.....
+.....
+..#..
+..#..
+.##..
+.###.
+#####
+
+#####
+#.###
+#.##.
+#.##.
+#..#.
+...#.
+.....
+
+#####
+####.
+.##..
+.##..
+.#...
+.#...
+.....
+
+.....
+#..#.
+#..#.
+#.##.
+#.##.
+#.###
+#####
+
+#####
+#.###
+#.#.#
+#.#.#
+#.#.#
+....#
+.....
+
+#####
+####.
+.###.
+.##..
+..#..
+.....
+.....
+
+.....
+....#
+.#..#
+.#..#
+.##.#
+#####
+#####
+
+#####
+.#.##
+.#.##
+.#.#.
+.#...
+.#...
+.....
+
+.....
+..#..
+#.#.#
+###.#
+#####
+#####
+#####
+
+#####
+#.###
+#.###
+#..#.
+.....
+.....
+.....
+
+#####
+#####
+##.#.
+##.#.
+#..#.
+#....
+.....
+
+#####
+####.
+####.
+###..
+#.#..
+.....
+.....
+
+.....
+.#..#
+.#..#
+.#..#
+.#.##
+##.##
+#####
+
+.....
+.....
+#....
+##.#.
+####.
+#####
+#####
+
+#####
+#####
+##.#.
+##.#.
+#..#.
+#..#.
+.....
+
+#####
+#.###
+#.###
+..###
+..#.#
+..#.#
+.....
+
+.....
+.....
+#.#..
+#.#..
+###..
+####.
+#####
+
+.....
+.....
+#.#..
+#.#.#
+#.#.#
+#####
+#####
+
+.....
+..#.#
+.####
+.####
+.####
+.####
+#####
+
+.....
+....#
+....#
+#.#.#
+#.#.#
+#####
+#####
+
+#####
+.#.#.
+.#.#.
+.#.#.
+.#.#.
+.....
+.....
+
+.....
+.#...
+.#.#.
+.#.#.
+.#.#.
+#####
+#####
+
+#####
+##.#.
+#....
+#....
+#....
+.....
+.....
+
+.....
+.#..#
+.##.#
+###.#
+###.#
+#####
+#####
+
+.....
+.....
+...#.
+...#.
+.#.#.
+.###.
+#####
+
+#####
+####.
+####.
+#.##.
+...#.
+.....
+.....
+
+.....
+.....
+.....
+#...#
+#.#.#
+#.###
+#####
+
+#####
+#####
+#####
+###.#
+#.#.#
+....#
+.....
+
+.....
+.....
+.#..#
+.#.##
+##.##
+#####
+#####
+
+#####
+#####
+###.#
+##..#
+##..#
+.#...
+.....
+
+.....
+..#..
+#.#..
+#.##.
+####.
+#####
+#####
+
+.....
+....#
+#..##
+#..##
+#..##
+#.###
+#####
+
+.....
+#..#.
+#..#.
+#..#.
+#..#.
+##.##
+#####
+
+.....
+.#...
+.##..
+###..
+####.
+####.
+#####
+
+.....
+.#...
+.##..
+###.#
+#####
+#####
+#####
+
+.....
+#....
+#.#..
+#.##.
+#.##.
+#####
+#####
+
+.....
+#....
+#....
+#..#.
+##.#.
+##.##
+#####
+
+.....
+.....
+..#..
+..#..
+#.##.
+####.
+#####
+
+#####
+###.#
+###.#
+###.#
+#.#.#
+#...#
+.....
+
+#####
+.##.#
+.##.#
+.##.#
+.##.#
+..#..
+.....
+
+.....
+....#
+..#.#
+..#.#
+.##.#
+.##.#
+#####
+
+#####
+.##.#
+.##.#
+..#..
+..#..
+.....
+.....
+
+#####
+.###.
+.#.#.
+.#.#.
+.#.#.
+.....
+.....
+
+#####
+####.
+####.
+###..
+.#...
+.#...
+.....
+
+.....
+.#..#
+.#.##
+.####
+.####
+#####
+#####
+
+#####
+#.###
+#.###
+#.#.#
+..#.#
+....#
+.....
+
+.....
+#....
+##.#.
+##.#.
+##.#.
+#####
+#####
+
+.....
+.....
+#.#..
+#.#.#
+#.###
+#####
+#####
+
+#####
+#.#.#
+#.#.#
+#...#
+#...#
+.....
+.....
+
+.....
+.....
+.....
+#.#.#
+#.#.#
+#.###
+#####
+
+.....
+.....
+....#
+..#.#
+..###
+.####
+#####
+
+#####
+#.###
+#.##.
+#.##.
+#.##.
+..#..
+.....
+
+.....
+#....
+#....
+#....
+#....
+##.#.
+#####
+
+#####
+#####
+##.##
+.#..#
+.#..#
+....#
+.....
+
+#####
+#.###
+..#.#
+..#.#
+..#.#
+..#..
+.....
+
+.....
+.....
+...#.
+..##.
+..##.
+.####
+#####
+
+.....
+.#...
+.#...
+##.#.
+##.#.
+####.
+#####
+
+#####
+#####
+#####
+.####
+.###.
+..#..
+.....
+
+.....
+.....
+..#..
+#.#..
+###.#
+###.#
+#####
+
+#####
+#.##.
+..#..
+..#..
+..#..
+.....
+.....
+
+#####
+#####
+####.
+#.#..
+..#..
+.....
+.....
+
+.....
+.#...
+.#...
+.#.#.
+#####
+#####
+#####
+
+#####
+#####
+.###.
+..#..
+.....
+.....
+.....
+
+.....
+#....
+#....
+#.#.#
+#.#.#
+#.###
+#####
+
+.....
+...#.
+#..#.
+#.###
+#.###
+#####
+#####
+
+#####
+#####
+#####
+.#.##
+...#.
+.....
+.....
+
+.....
+#....
+#.#..
+#.#.#
+#.#.#
+#.#.#
+#####
+
+#####
+###.#
+###..
+##...
+#....
+#....
+.....
+
+#####
+##.##
+.#.##
+...#.
+.....
+.....
+.....
+
+.....
+...#.
+.#.#.
+.#.#.
+##.#.
+##.#.
+#####
+
+#####
+##.#.
+##.#.
+##.#.
+#..#.
+#....
+.....
+
+#####
+#.###
+#.###
+#.##.
+..##.
+..#..
+.....
+
+.....
+..#..
+..##.
+.####
+#####
+#####
+#####
+
+#####
+#.###
+#.##.
+#.#..
+..#..
+.....
+.....
+
+#####
+#####
+#####
+.####
+.#.#.
+...#.
+.....
+
+#####
+#####
+###.#
+##..#
+#...#
+#....
+.....
+
+#####
+#.###
+#.###
+#.###
+#..#.
+#....
+.....
+
+.....
+..#.#
+..#.#
+.##.#
+###.#
+###.#
+#####
+
+#####
+.####
+.#.##
+.#.##
+...##
+....#
+.....
+
+.....
+#....
+#..#.
+#.##.
+#.##.
+#.###
+#####
+
+#####
+###.#
+###.#
+###.#
+#.#..
+..#..
+.....
+
+.....
+.#..#
+.#..#
+##..#
+##..#
+##.##
+#####
+
+.....
+.....
+.#...
+###.#
+#####
+#####
+#####
+
+.....
+.....
+#....
+#..#.
+#..##
+##.##
+#####
+
+.....
+.#...
+.#...
+.#..#
+.##.#
+.####
+#####
+
+.....
+.....
+.....
+....#
+#.#.#
+#.#.#
+#####
+
+#####
+#.#.#
+#.#.#
+#.#..
+#.#..
+.....
+.....
+
+.....
+.....
+#.#..
+###.#
+#####
+#####
+#####
+
+.....
+.#...
+.#...
+.##..
+.###.
+####.
+#####
+
+#####
+##.##
+.#.##
+.#.#.
+.#.#.
+.#...
+.....
+
+.....
+.....
+..#.#
+..#.#
+.##.#
+.####
+#####
+
+.....
+....#
+..#.#
+..#.#
+.##.#
+.####
+#####
+
+.....
+.....
+....#
+....#
+..#.#
+#.###
+#####
+
+#####
+##.##
+##.#.
+##.#.
+##.#.
+.#.#.
+.....
+
+#####
+#####
+.#.##
+.#.##
+...#.
+...#.
+.....
+
+.....
+#...#
+#.#.#
+#.#.#
+#####
+#####
+#####
+
+.....
+..#..
+#.#..
+#.##.
+#.##.
+#.###
+#####
+
+.....
+..#..
+..#..
+..#..
+#.##.
+#.##.
+#####
+
+#####
+#.#.#
+#.#.#
+#.#.#
+.....
+.....
+.....
+
+#####
+##.##
+##.#.
+#..#.
+#....
+#....
+.....
+
+#####
+##.##
+##.##
+#..#.
+#..#.
+.....
+.....
+
+#####
+#####
+#.###
+#.###
+#.###
+#..#.
+.....
+
+#####
+#.###
+#.###
+#.###
+#.#.#
+..#..
+.....
+
+.....
+.....
+...#.
+...#.
+#.##.
+#.###
+#####
+
+.....
+....#
+....#
+...##
+..###
+.####
+#####
+
+.....
+....#
+#...#
+#..##
+##.##
+##.##
+#####
+
+.....
+.....
+#....
+#....
+##.#.
+##.##
+#####
+
+#####
+.####
+.#.##
+.#.#.
+.#.#.
+...#.
+.....
+
+#####
+##.##
+##.##
+#..##
+#..##
+...#.
+.....
+
+#####
+#####
+#####
+##.#.
+.#.#.
+.#...
+.....
+
+#####
+##.##
+##.##
+##.##
+##..#
+.#...
+.....
+
+.....
+.....
+..#..
+#.##.
+####.
+#####
+#####
+
+.....
+.....
+.....
+.#.#.
+#####
+#####
+#####
+
+#####
+#####
+####.
+#.#..
+#.#..
+..#..
+.....
+
+#####
+###.#
+###.#
+###.#
+.#..#
+.#...
+.....
+
+.....
+#....
+#...#
+##.##
+#####
+#####
+#####
+
+.....
+..#..
+..##.
+#.##.
+#.###
+#####
+#####
+
+.....
+.....
+..#..
+#.##.
+#.###
+#.###
+#####
+
+#####
+##.##
+##..#
+#....
+.....
+.....
+.....
+
+.....
+.....
+.#..#
+.#..#
+.#..#
+.#.##
+#####
+
+.....
+#.#..
+#.#..
+#.#.#
+#.#.#
+###.#
+#####
+
+.....
+.....
+...#.
+.#.#.
+####.
+####.
+#####
+
+.....
+...#.
+...#.
+..##.
+..##.
+#.###
+#####
+
+.....
+...#.
+...#.
+...#.
+#.##.
+#####
+#####
+
+.....
+.#.#.
+##.#.
+##.#.
+##.##
+##.##
+#####
+
+.....
+.....
+..#.#
+..#.#
+#.#.#
+#####
+#####
+
+#####
+#####
+.####
+.#.##
+...#.
+...#.
+.....
+
+#####
+#####
+#####
+.##.#
+.##..
+..#..
+.....
+
+.....
+..#..
+#.#..
+#.#.#
+#.###
+#.###
+#####
+
+.....
+.#.#.
+.#.##
+.#.##
+.#.##
+#####
+#####
+
+#####
+.####
+..#.#
+..#.#
+..#.#
+..#.#
+.....
+
+#####
+####.
+#.##.
+#.##.
+..##.
+..#..
+.....
+
+.....
+....#
+..#.#
+..###
+#.###
+#.###
+#####
+
+.....
+.#...
+.#...
+.#...
+.#.#.
+#####
+#####
+
+#####
+.####
+.##.#
+.##.#
+..#.#
+..#..
+.....
+
+#####
+#.##.
+...#.
+...#.
+...#.
+.....
+.....
+
+#####
+##.##
+##.##
+.#.#.
+.....
+.....
+.....
+
+.....
+.....
+#..#.
+##.#.
+##.##
+#####
+#####
+
+.....
+.....
+#.#..
+#.#..
+#.#.#
+###.#
+#####
+
+#####
+##.##
+##.##
+##.##
+#..##
+#...#
+.....
+
+#####
+###.#
+#.#.#
+..#.#
+..#.#
+.....
+.....
+
+.....
+#....
+#..#.
+##.##
+##.##
+#####
+#####
+
+.....
+.....
+#.#..
+#.#.#
+#####
+#####
+#####
+
+#####
+#####
+####.
+##.#.
+#..#.
+#....
+.....
+
+.....
+..#..
+.##.#
+.##.#
+.####
+#####
+#####
+
+#####
+#####
+####.
+#.##.
+#.##.
+#.#..
+.....
+
+#####
+#.###
+..###
+..#.#
+....#
+....#
+.....
+
+#####
+#####
+#####
+.#.##
+.#.##
+...#.
+.....
+
+#####
+#####
+#####
+##.##
+.#.#.
+...#.
+.....
+
+#####
+#####
+#####
+#.##.
+#.#..
+..#..
+.....
+
+.....
+.....
+#....
+#..#.
+#.##.
+#####
+#####
+
+#####
+#####
+####.
+###..
+##...
+#....
+.....
+
+#####
+####.
+####.
+#.##.
+#.#..
+..#..
+.....
+
+.....
+.....
+..#.#
+.##.#
+.####
+.####
+#####
+
+.....
+.#..#
+##..#
+##..#
+##..#
+##.##
+#####
+
+.....
+...#.
+#.##.
+#.###
+#.###
+#####
+#####
+
+#####
+##.#.
+##...
+.#...
+.....
+.....
+.....
+
+#####
+#####
+#####
+#####
+.#.##
+...#.
+.....
+
+.....
+.....
+....#
+...##
+.#.##
+#####
+#####
+
+.....
+.....
+#...#
+#...#
+#..##
+#.###
+#####
+
+.....
+.....
+#.#..
+#.##.
+#.##.
+#.###
+#####
+
+#####
+###.#
+###.#
+##..#
+##..#
+.#..#
+.....
+
+.....
+..#..
+..#.#
+..#.#
+#.#.#
+#.#.#
+#####
+
+#####
+.#.##
+.#.##
+.#..#
+.#..#
+.#...
+.....
+
+.....
+.....
+.....
+.....
+#.#..
+#.#.#
+#####
+
+#####
+.###.
+.##..
+.##..
+.##..
+.#...
+.....
+
+.....
+....#
+....#
+.#..#
+.#..#
+.##.#
+#####
+
+.....
+..#..
+#.#..
+#.#.#
+#####
+#####
+#####
+
+#####
+##.##
+##.##
+##.#.
+#....
+#....
+.....
+
+#####
+#####
+##.##
+.#.##
+.#..#
+.....
+.....
+
+.....
+...#.
+...#.
+.#.#.
+.#.#.
+.#.##
+#####
+
+#####
+#.###
+..###
+..##.
+..##.
+...#.
+.....
+
+.....
+.....
+...#.
+.#.#.
+.###.
+#####
+#####
+
+.....
+...#.
+#.##.
+#.##.
+####.
+####.
+#####
+
+.....
+.....
+.....
+#.#..
+#.#.#
+#####
+#####
+
+.....
+.#...
+.#..#
+.#..#
+.##.#
+###.#
+#####
+
+.....
+#.#..
+#.#..
+###..
+###..
+###.#
+#####
+
+.....
+.....
+.....
+#.#..
+#.##.
+#.##.
+#####
+
+.....
+.#...
+.#...
+##...
+##..#
+##.##
+#####
+
+#####
+.####
+.#.#.
+.#.#.
+.....
+.....
+.....
+
+.....
+.#...
+##..#
+###.#
+#####
+#####
+#####
+
+#####
+####.
+####.
+##.#.
+##...
+#....
+.....
+
+.....
+....#
+...##
+...##
+#.###
+#.###
+#####
+
+#####
+#####
+.#.##
+.#.#.
+.#...
+.....
+.....
+
+.....
+.....
+.....
+.#...
+##.#.
+#####
+#####
+
+#####
+#####
+###.#
+###..
+.#...
+.#...
+.....
+
+.....
+#.#..
+#.#.#
+#.#.#
+#.#.#
+###.#
+#####
+
+.....
+.....
+....#
+.#..#
+##.##
+##.##
+#####
+
+.....
+.....
+..#..
+..#..
+..#.#
+.####
+#####
+
+.....
+..#..
+#.#..
+###..
+###.#
+#####
+#####
+
+.....
+.#..#
+.#.##
+.#.##
+##.##
+##.##
+#####
+
+#####
+#.###
+#.###
+#.#.#
+..#.#
+..#..
+.....
+
+#####
+#####
+##.#.
+#..#.
+...#.
+.....
+.....
+
+.....
+....#
+.#..#
+.#..#
+##.##
+##.##
+#####
+
+#####
+#####
+#####
+#.###
+#.###
+...#.
+.....
+
+.....
+.....
+#....
+#.#.#
+###.#
+###.#
+#####
+
+#####
+.#.#.
+.#.#.
+.#.#.
+.#.#.
+...#.
+.....
+
+.....
+.....
+....#
+.#..#
+.##.#
+#####
+#####
+
+.....
+.#.#.
+.#.#.
+.#.##
+#####
+#####
+#####
+
+.....
+.....
+..#..
+.##..
+####.
+####.
+#####
+
+.....
+.....
+.#..#
+.#..#
+.#..#
+##.##
+#####
+
+.....
+.#..#
+##.##
+##.##
+##.##
+##.##
+#####
+
+.....
+...#.
+...#.
+..##.
+#.##.
+#.##.
+#####
+
+#####
+#####
+#.#.#
+#...#
+#...#
+#...#
+.....
+
+.....
+.#...
+##...
+###..
+###.#
+#####
+#####
+
+#####
+#####
+##.##
+#..##
+#..##
+...#.
+.....
+
+#####
+#####
+##.##
+#..#.
+#..#.
+#..#.
+.....
+
+.....
+.#...
+.#...
+.##.#
+.####
+#####
+#####
+
+.....
+.....
+.....
+.#.#.
+.#.#.
+#####
+#####
+
+.....
+#..#.
+#.###
+#.###
+#.###
+#.###
+#####
+
+#####
+#####
+#.###
+#.###
+#..#.
+#....
+.....
+
+.....
+...#.
+#..#.
+#..#.
+#..##
+##.##
+#####
+
+.....
+.....
+.#...
+.#.#.
+##.##
+##.##
+#####
+
+#####
+#.###
+#.###
+..#.#
+....#
+.....
+.....
+
+.....
+....#
+....#
+.#.##
+.#.##
+##.##
+#####
+
+#####
+##.##
+#..##
+...##
+...#.
+.....
+.....
+
+#####
+.##.#
+.##.#
+.#..#
+.#..#
+.....
+.....
+
+#####
+#####
+#####
+.###.
+..#..
+..#..
+.....
+
+#####
+.##.#
+.##.#
+.#..#
+.....
+.....
+.....
+
+.....
+#....
+#.#.#
+#.#.#
+#.#.#
+#####
+#####
+
+.....
+..#..
+.##..
+.##.#
+.##.#
+###.#
+#####
+
+.....
+.....
+...#.
+..##.
+#.###
+#.###
+#####
+
+.....
+....#
+....#
+...##
+...##
+.#.##
+#####
+
+.....
+....#
+....#
+...##
+.#.##
+.####
+#####
+
+#####
+#.##.
+#.##.
+#.#..
+#.#..
+..#..
+.....
+
+.....
+#....
+##.#.
+##.#.
+##.#.
+##.##
+#####
+
+.....
+.....
+.#.#.
+.#.#.
+.###.
+####.
+#####
+
+.....
+.#...
+.#.#.
+.###.
+.###.
+#####
+#####
+
+#####
+####.
+##.#.
+##.#.
+.#.#.
+.....
+.....
+
+#####
+#####
+###.#
+#.#..
+#.#..
+#....
+.....
+
+#####
+#####
+.#.##
+.#..#
+.#..#
+.#..#
+.....
+
+#####
+##.##
+##..#
+#...#
+.....
+.....
+.....
+
+#####
+#####
+####.
+###..
+#.#..
+..#..
+.....
+
+#####
+.#.##
+...##
+...##
+...##
+...#.
+.....
+
+#####
+#.###
+#.###
+..#.#
+.....
+.....
+.....
+
+.....
+..#.#
+..#.#
+#.###
+#####
+#####
+#####
+
+#####
+#####
+.####
+..###
+..#.#
+..#..
+.....
+
+.....
+.....
+..#.#
+..#.#
+.##.#
+#####
+#####
+
+.....
+.#...
+.##.#
+.##.#
+###.#
+###.#
+#####
+
+#####
+#####
+###.#
+#.#.#
+#.#.#
+#.#..
+.....
+
+#####
+#####
+#####
+.###.
+.#.#.
+.#.#.
+.....
+
+#####
+.####
+.###.
+.###.
+.##..
+.#...
+.....
+
+.....
+..#..
+..#..
+..##.
+..##.
+#.###
+#####
+
+#####
+###.#
+.##.#
+.##..
+.##..
+..#..
+.....
+
+#####
+#.###
+..###
+..###
+..#.#
+..#.#
+.....
+
+.....
+.....
+.....
+.#..#
+.#..#
+##.##
+#####
+
+#####
+#####
+#####
+.#.#.
+.#.#.
+.#.#.
+.....
+
+#####
+#####
+#####
+.####
+.#.##
+.#..#
+.....
+
+.....
+..#..
+.##..
+###..
+###.#
+###.#
+#####
+
+.....
+.....
+...#.
+...#.
+#.###
+#.###
+#####
+
+#####
+##.##
+.#.##
+...#.
+...#.
+.....
+.....
+
+.....
+....#
+...##
+#.###
+#####
+#####
+#####
+
+#####
+#####
+#####
+#.###
+..#.#
+....#
+.....
+
+.....
+..#..
+..#..
+#.#..
+#.#.#
+#.###
+#####
+
+#####
+.####
+.####
+.####
+..#.#
+..#..
+.....
+
+#####
+#.###
+..##.
+..##.
+..##.
+..#..
+.....
+
+#####
+.###.
+.#.#.
+.#...
+.#...
+.....
+.....
+
+.....
+...#.
+...##
+..###
+.####
+#####
+#####
+
+.....
+....#
+#.#.#
+###.#
+###.#
+###.#
+#####
+
+#####
+#.###
+#..##
+...#.
+...#.
+.....
+.....
+
+.....
+..#..
+..#..
+.##..
+###..
+###.#
+#####
+
+#####
+#.#.#
+#.#..
+#....
+.....
+.....
+.....
+
+#####
+###.#
+##..#
+##...
+.#...
+.....
+.....
+
+.....
+.....
+....#
+.#.##
+#####
+#####
+#####
+
+.....
+...#.
+...#.
+...#.
+#..#.
+#.##.
+#####
+
+.....
+.#...
+.#...
+.#.#.
+##.#.
+##.##
+#####
+
+#####
+###.#
+###.#
+###.#
+.#..#
+.#..#
+.....
+
+.....
+...#.
+..##.
+.###.
+.###.
+.###.
+#####
+
+#####
+.####
+.#.##
+.#.#.
+.#.#.
+.#...
+.....
+
+.....
+.#...
+##.#.
+##.#.
+##.##
+##.##
+#####
+
+#####
+#####
+###.#
+.##.#
+.##..
+.#...
+.....
+
+#####
+#####
+#.###
+..###
+..##.
+..#..
+.....
+
+.....
+...#.
+...#.
+#..#.
+#..##
+#.###
+#####
+
+.....
+.....
+.#.#.
+##.#.
+##.#.
+#####
+#####
+
+.....
+#....
+#..#.
+##.#.
+#####
+#####
+#####
+
+#####
+.####
+.##.#
+.#..#
+.#..#
+.#..#
+.....
+
+#####
+.##.#
+..#..
+.....
+.....
+.....
+.....
+
+.....
+.....
+.#..#
+.#.##
+.#.##
+##.##
+#####
+
+#####
+#####
+.####
+.##.#
+.#..#
+....#
+.....
+
+#####
+#.#.#
+....#
+....#
+....#
+.....
+.....
+
+.....
+.#...
+.#...
+##...
+##...
+##.#.
+#####
+
+#####
+#.###
+...##
+...#.
+.....
+.....
+.....
+
+#####
+##.##
+.#.##
+....#
+....#
+.....
+.....
+
+#####
+#####
+.#.#.
+...#.
+...#.
+...#.
+.....
+
+#####
+#####
+.#.#.
+.#.#.
+.#...
+.....
+.....
+
+.....
+.#..#
+.##.#
+.####
+#####
+#####
+#####
+
+#####
+#####
+#.###
+#.#.#
+.....
+.....
+.....
+
+.....
+#....
+#....
+#....
+##.#.
+#####
+#####
+
+.....
+.....
+.....
+....#
+#..##
+#.###
+#####
+
+#####
+.###.
+..##.
+...#.
+...#.
+.....
+.....
+
+#####
+##.#.
+##.#.
+#..#.
+#....
+#....
+.....
+
+.....
+....#
+....#
+.#.##
+.####
+#####
+#####
+
+#####
+#####
+.####
+.#.##
+.#..#
+.#..#
+.....
+
+#####
+#.###
+#.###
+#..##
+#...#
+.....
+.....
+
+.....
+.....
+#....
+#..#.
+#.##.
+#.###
+#####
+
+#####
+#.###
+#.#.#
+..#..
+..#..
+.....
+.....
+
+#####
+.####
+.##.#
+..#.#
+..#..
+.....
+.....
+
+#####
+###.#
+###.#
+###.#
+#.#..
+#....
+.....
+
+.....
+...#.
+..##.
+..###
+#.###
+#.###
+#####
+
+#####
+#####
+###.#
+#.#.#
+#...#
+#....
+.....
+
+.....
+..#..
+..#..
+#.##.
+#.##.
+####.
+#####
+
+#####
+.##.#
+.#...
+.#...
+.#...
+.....
+.....
+
+#####
+###.#
+###.#
+#.#.#
+..#.#
+..#.#
+.....
+
+#####
+.####
+.####
+.####
+..###
+..#.#
+.....
+
+#####
+#####
+#####
+##.##
+#...#
+.....
+.....
+
+.....
+.#.#.
+####.
+####.
+#####
+#####
+#####
+
+#####
+.####
+.####
+.#.#.
+.#...
+.#...
+.....
+
+#####
+#####
+##.#.
+##.#.
+.#.#.
+.#...
+.....
+
+.....
+.....
+.....
+.....
+.#.#.
+.#.##
+#####
+
+.....
+#..#.
+#..#.
+#.##.
+#.###
+#####
+#####
+
+.....
+...#.
+...##
+.#.##
+.####
+#####
+#####
+
+.....
+.....
+.....
+..#.#
+#.#.#
+###.#
+#####
+
+.....
+.#...
+.#...
+.#...
+.##.#
+.####
+#####
+
+#####
+###.#
+.##.#
+..#.#
+..#.#
+.....
+.....
+
+.....
+..#..
+..#..
+.##..
+.###.
+#####
+#####
+
+#####
+####.
+#.##.
+#.#..
+..#..
+..#..
+.....
+
+.....
+....#
+....#
+#..##
+##.##
+#####
+#####
+
+.....
+.....
+#....
+#..#.
+##.#.
+##.##
+#####
+
+#####
+#####
+.####
+.####
+.##.#
+.#..#
+.....
+
+.....
+.#...
+.#...
+##.#.
+####.
+####.
+#####
+
+.....
+...#.
+...#.
+...#.
+.#.##
+.#.##
+#####
+
+.....
+..#..
+..#..
+.##.#
+.####
+#####
+#####
+
+.....
+.....
+.....
+..#.#
+..#.#
+#.###
+#####
+
+#####
+#.###
+#..#.
+...#.
+...#.
+...#.
+.....
+
+#####
+#####
+#####
+#.#.#
+#.#.#
+#...#
+.....
+
+#####
+.####
+.####
+.#.##
+.#.##
+.#.#.
+.....
+
+#####
+###.#
+.#..#
+.#...
+.#...
+.#...
+.....
+
+.....
+#...#
+#.#.#
+#.#.#
+#.#.#
+#####
+#####
+
+.....
+#...#
+##..#
+###.#
+#####
+#####
+#####
+
+.....
+#....
+#.#.#
+#.###
+#.###
+#####
+#####
+
+#####
+#####
+##.##
+##.##
+##.##
+#..#.
+.....
+
+.....
+.....
+..#..
+..#..
+..#.#
+.##.#
+#####
+
+#####
+#####
+###.#
+#.#.#
+#.#..
+#.#..
+.....
+
+#####
+##.#.
+##.#.
+#..#.
+...#.
+.....
+.....
+
+.....
+.....
+..#.#
+#.#.#
+#.#.#
+#.###
+#####
+
+.....
+.....
+.....
+#.#..
+#.#.#
+###.#
+#####
+
+.....
+.....
+...#.
+...#.
+.#.##
+##.##
+#####
+
+.....
+..#..
+.##..
+.##..
+###.#
+#####
+#####
+
+#####
+#.###
+#.###
+...##
+....#
+....#
+.....
+
+#####
+#####
+##.##
+##.##
+#..#.
+#....
+.....
+
+#####
+.####
+.####
+..###
+..##.
+...#.
+.....
+
+#####
+#####
+#.###
+#.#.#
+#.#.#
+.....
+.....
+
+#####
+#####
+#.##.
+...#.
+.....
+.....
+.....
+
+#####
+#####
+####.
+#.##.
+#.#..
+..#..
+.....
+
+#####
+####.
+###..
+.#...
+.#...
+.....
+.....
+
+.....
+#..#.
+#..#.
+#..#.
+##.#.
+##.##
+#####
+
+#####
+##.##
+##.##
+.#.##
+.#.#.
+.....
+.....
+
+#####
+#####
+###.#
+###..
+.##..
+.#...
+.....
+
+.....
+.#...
+.#..#
+.#..#
+.#..#
+##.##
+#####
+
+#####
+##.##
+##.##
+#..##
+...#.
+.....
+.....
+
+#####
+.##.#
+.##.#
+.##.#
+.##.#
+..#.#
+.....
+
+.....
+...#.
+.#.#.
+##.##
+#####
+#####
+#####
+
+#####
+.####
+.####
+..#.#
+....#
+.....
+.....
+
+.....
+..#.#
+.##.#
+.##.#
+.####
+.####
+#####
+
+.....
+.....
+...#.
+.#.##
+.#.##
+.#.##
+#####
+
+.....
+...#.
+...#.
+.#.#.
+.###.
+.####
+#####
+
+.....
+.....
+...#.
+.#.##
+.#.##
+#####
+#####
+
+.....
+#....
+#....
+#.#..
+###.#
+###.#
+#####
+
+#####
+#####
+###.#
+##..#
+.#..#
+.#...
+.....
+
+#####
+#.###
+#.##.
+...#.
+.....
+.....
+.....
+
+#####
+###.#
+##..#
+##..#
+#...#
+#...#
+.....
+
+#####
+#####
+####.
+#.##.
+#..#.
+#....
+.....
+
+#####
+#####
+#.###
+#.###
+#..#.
+#..#.
+.....
+
+#####
+#####
+####.
+####.
+.#.#.
+.....
+.....
+
+.....
+#....
+#..#.
+#..##
+#..##
+#.###
+#####
+
+#####
+#.##.
+#..#.
+#..#.
+.....
+.....
+.....
+
+#####
+##.##
+##.##
+.#..#
+.#...
+.#...
+.....
+
+#####
+#####
+.####
+.##.#
+.#..#
+.#..#
+.....
+
+#####
+#.#.#
+..#.#
+..#..
+.....
+.....
+.....
+
+.....
+..#..
+.###.
+####.
+#####
+#####
+#####
+
+.....
+.....
+..#..
+.##.#
+.##.#
+###.#
+#####
+
+.....
+.....
+#..#.
+##.#.
+##.#.
+#####
+#####
+
+.....
+...#.
+...##
+#..##
+##.##
+##.##
+#####
+
+.....
+.....
+.....
+.#.#.
+.#.#.
+####.
+#####
+
+#####
+#####
+#.#.#
+#.#.#
+#.#.#
+....#
+.....
+
+.....
+.#...
+##.#.
+##.##
+#####
+#####
+#####
+
+#####
+#####
+##.##
+#...#
+....#
+....#
+.....
+
+#####
+#.##.
+#.##.
+#.##.
+#..#.
+...#.
+.....
+
+#####
+#####
+##.##
+##.#.
+#....
+#....
+.....
+
+#####
+.##.#
+.##..
+..#..
+.....
+.....
+.....
+
+.....
+..#.#
+.####
+.####
+.####
+#####
+#####
+
+.....
+.#...
+.#...
+##...
+##.#.
+##.#.
+#####
+
+.....
+.....
+..#..
+#.##.
+#.##.
+#####
+#####
+
+.....
+.....
+.....
+..#.#
+.##.#
+###.#
+#####
+
+#####
+#####
+#####
+.##.#
+.#..#
+....#
+.....
+
+.....
+.....
+.....
+..#.#
+.####
+.####
+#####
+
+#####
+.####
+..#.#
+..#.#
+..#.#
+....#
+.....
+
+.....
+....#
+..#.#
+.##.#
+###.#
+#####
+#####
+
+.....
+.#...
+.#..#
+.##.#
+.##.#
+###.#
+#####
+
+.....
+.#.#.
+.#.##
+.#.##
+#####
+#####
+#####
+
+#####
+#####
+.#.##
+.#..#
+....#
+.....
+.....
+
+.....
+#....
+#....
+#.#..
+#.#.#
+#.#.#
+#####
+
+.....
+..#..
+..##.
+.###.
+#####
+#####
+#####
+
+#####
+.####
+.###.
+..##.
+...#.
+.....
+.....
+
+.....
+.....
+..#..
+..#.#
+.####
+#####
+#####
+
+#####
+##.#.
+#..#.
+#....
+#....
+.....
+.....
+
+.....
+.....
+.....
+...#.
+.#.#.
+#####
+#####
diff --git a/day25/main.cpp b/day25/main.cpp
@@ -0,0 +1,77 @@
+#include <iostream>
+#include <filesystem>
+#include <fstream>
+#include <vector>
+#include <cstring>
+#include <cstdio>
+#include <tuple>
+#include <algorithm>
+#include "utils.hpp"
+
+typedef std::array<int, 5> Scheme;
+typedef std::pair<std::vector<Scheme>, std::vector<Scheme>> Data;
+
+Data read_file(const std::string &path) {
+ std::ifstream ifs(path, std::ios::binary);
+ if (!ifs.is_open()) {
+ throw std::runtime_error(path+":"+std::strerror(errno));
+ }
+ std::vector<Scheme> keys;
+ std::vector<Scheme> locks;
+ Scheme s{0}; // current schematics
+ bool is_key = false; // keys have line 0 empty; locks are upside down.
+ bool is_new = true; // resets on newline
+ while (1) {
+ std::string str;
+ std::getline(ifs, str);
+ if (str.empty()) {
+ is_new = true;
+ if (is_key) keys.push_back(s);
+ else locks.push_back(s);
+ } else {
+ if (is_new) {
+ is_key = (str == ".....");
+ is_new = false;
+ s.fill(is_key?-1:0);
+ } else {
+ for (int i=0;i<(int)str.size();++i) {
+ if (str[i]=='#') s[i]++;
+ }
+ }
+ }
+ if (!ifs) break;
+ }
+ return std::make_pair(keys, locks);
+}
+
+int64_t part1(Data &input [[ maybe_unused ]]) {
+ auto &[keys, locks] = input;
+ int64_t res = 0;
+ for (auto &l:locks) {
+ for (auto &k:keys) {
+ bool fits = true;
+ for (int i=0;i<5;++i) {
+ if (l[i]+k[i]>5) {
+ fits = false;
+ break;
+ }
+ }
+ if (fits) res++;
+ }
+ }
+ return res;
+}
+int64_t part2(Data &input [[ maybe_unused ]]) {
+ return 0;
+}
+
+int main(int argc, char **argv) {
+ Performance perf;
+ const std::string fname = argc>1 ? argv[1] : "test1.txt";
+ std::cout << "AoC 2024 day 25 " << fname << std::endl;
+ Data input = read_file(fname);
+ std::cout << "part1: " << part1(input) << std::endl;
+ std::cout << "part2: " << part2(input) << std::endl;
+
+ return 0;
+}
diff --git a/day25/test1.txt b/day25/test1.txt
@@ -0,0 +1,39 @@
+#####
+.####
+.####
+.####
+.#.#.
+.#...
+.....
+
+#####
+##.##
+.#.##
+...##
+...#.
+...#.
+.....
+
+.....
+#....
+#....
+#...#
+#.#.#
+#.###
+#####
+
+.....
+.....
+#.#..
+###..
+###.#
+###.#
+#####
+
+.....
+.....
+.....
+#....
+#.#..
+#.#.#
+#####