Advent of Code 2023 - Day 13
Sample
sample = """
#.##..##.
..#.##.#.
##......#
##......#
..#.##.#.
..##..##.
#.#.##.#.
#...##..#
#....#..#
..##..###
#####.##.
#####.##.
..##..###
#....#..#
"""
"#.##..##.\n..#.##.#.\n##......#\n##......#\n..#.##.#.\n..##..##.\n#.#.##.#.\n\n#...##..#\n#....#..#\n..##..###\n#####.##.\n#####.##.\n..##..###\n#....#..#\n"
Input
input = """
##.####.######.##
.#.#..#.#....#.#.
...#..#...##...#.
###....########..
#..#..#..####..#.
.#.#..#.#.##.#.#.
...####...##...##
..##..##......##.
##.#..#.######.#.
..#....#....#.#..
..#....#......#..
#...##...####...#
#.######.####.###
..##..##......##.
#........####....
.##......
###.####.
##.##...#
..###..##
...##..##
#..#.##.#
..#......
.##..##..
.##..##..
.......####..##..
.####.##.#.#....#
.####...#.#.####.
######.##.#######
........#..#....#
.####....########
......###.###..##
#....##.###......
.####...#.###..##
#....####.##....#
........##..#####
##..##.####.####.
######..#....##..
#....#..####....#
.####.##.#.######
..####...####
..####...####
#...###...###
...##########
#.#..#..##.##
#.#.##.#..#..
.#.#..##..#..
##..###....##
#.###...##.#.
#....##..
#.###..##
##...##..
#..######
##.#....#
#.#......
#####..##
##.######
.#.######
##...##..
..#......
.#.##..##
.##......
#.#......
#####..##
...######
.####..##
..##.##...###
##.#.####.#..
...#######.##
###..##.####.
#####.....###
######...###.
..##..##...##
..#..###..##.
####.##...#.#
...#.#..#..##
..##.#.#.####
###..###....#
###....#.####
..##.##.##...
..##.##..#...
....#...####..#
.###.....####.#
###.#.##..#.#..
#.#.######...#.
#.#####.#..#.#.
...#......#.##.
####....#......
#.#..#..#####.#
##..#.##...#.##
...#.#.###.###.
..####.##...#.#
..####.##...#.#
...#.#..##.###.
...#.#..##.###.
..####.##...#.#
..####.##...#.#
...#.#.###.###.
#...#...#...##.#.
....#...#...##.#.
..##.###.##..###.
#.#.#.#.#.###..#.
......##.#.#.##.#
.#..#..#...#..#..
##.##.....####..#
####.##...#.###..
####.##...#.###..
##.##.....####..#
.#..#..#...#..#..
......##.#.#.##.#
#.#.#.#.#.###..#.
..##....#.#.##.#.
..#......#..#.#..
##.###.#..##..##.
.#.###....##.##..
#....##.#...##.##
#.#..##.#.####.##
#.#..##.#.####..#
#....##.#...##.##
.#.###....##.##..
##.###.#..##..##.
..#......#..#.#..
..##....#.#.##.#.
..##....#.#.##.#.
.#..#.#...##.
#....#.#.....
.......##..##
......###....
.#..#.#...##.
.#..#.#......
..##..#.####.
......#..#.##
........#..#.
#....###.####
#....##..####
#................
#...####...#..#..
.#.######.#.##.#.
.#.######.#....#.
..#.####.#..##..#
#..######..####..
.....##.....##...
#...#.#####
##.#..#.##.
##.........
#..#...#.##
..#.##.#...
##..#.###..
##..#.###..
...#.#...#..#.#
#....##.....#.#
..#..#..#####.#
.##....#...#...
##..........###
......#...####.
####.#.#.##.###
..#.#..##..####
..#.#..##.#####
..#.#..##.#####
..#.#..##..####
###.#......
.#.#.##..##
.###..##...
##...######
##.#####.##
#####.#.#..
..###.##.##
.#######.##
.#.##..#...
#....#.#...
.#..####.##
##.###..#..
##.#.##...#
#.##.##....
..##.#.#...
.#..#.##.##
.#..#.##.##
.......##....
..#.#..##..#.
..#....##....
..#..##..##..
...##......##
..#..##..##..
##.###....###
......#..#...
#######..###.
####..##.
.#..#...#
###..####
###..#.##
.#..#...#
####..##.
#####.#..
.#.#...#.
.####.#.#
#.#.#...#
..##.###.
##..##..#
...#.###.
...#.###.
##..##..#
#.###..####
.#..##...##
##.##.#.#..
.#..#...###
.##..#..###
####.##.###
####.#..###
#######..##
######....#
.####......
#....#.##.#
######....#
#....##..##
#######..##
.####......
.........#.
.####......
.####.#..#.
#.##.######
######.##.#
##..##.##.#
..##..####.
#....#.##.#
.####......
#.#..#..##.
#####.###..
##.##.##...
##.##.##...
#####.###..
#.#..#..##.
###...#.#.#
.#.#....###
.#.#....###
###...#...#
#.#..#..##.
#####.#..#.
#.###.####.
#..###.##.#
.##.###..##
....#..##..
#..##.#..#.
......####.
##.#.######
.#.#.#.##.#
..###.##.#.
##..#######
#.##.######
.####......
..#....##..
#.###......
.#..#.####.
..#..#....#
.#.###....#
.#.###....#
..#..#....#
##.#.####.#.###
.##...##...##..
.############..
...########...#
#....#..#....##
....#....#.....
..#.#.##.#.#...
.#.#...#..#...#.#
.#.#...#..#...#.#
###.###.##.###.##
#....##....##....
#.#..##.##.##..#.
#.#.###....#####.
###.##########.##
#..#.#.#..#.#.#..
#.#...#.##.#...#.
..##.#.####.#.##.
#####.######.####
.#..####..#..#.
.##.#...#.#...#
##.####.###.###
.#.#####..####.
..##..##..#.###
..##..##..#.###
.#.#####..####.
##.####.###.###
.##.#...#.#...#
.#..####..#..#.
.#.###..#######
##.##.####.#...
##.##.####.#...
.#.###..#######
.#..####..#..#.
.##.....#.#...#
##.####.###.###
.##.##..##.
....######.
#####....##
....#.##.#.
.##.##.###.
#..#......#
#..##....##
.##.######.
.##.##..##.
....##..##.
#..###..###
.##.#....#.
....#....#.
....#.##.#.
######..###
#.#.###
...#...
...#..#
#.#.#.#
##..#.#
###.#.#
#.#.#.#
...#..#
...#...
#.#.###
######.
..#####
#.##.##
#.##.##
..#####
....#.#..
....#.#..
.##.#####
###......
#.#..####
#........
#...#..##
.###...##
.#.....##
#...#..##
#.###.#..
#..#.#...
..##.###.
##.###.##
.###.####
...##.###
#..####..
#.#.#..
#.#.#..
##..#..
####...
....###
..#..##
.#####.
.#####.
..#...#
#.#...###.####...
######.##..#..##.
.#.#.####.#..#..#
..#..####.##...##
..###.#....##...#
..###.#....##...#
..#..####.##...##
.#.#.####.#..#..#
######.##..#..##.
#.#...###.####...
..####...##.##.#.
##..#...#.#..#...
#.###....##...#..
.#.##.#..#.#.#...
##.#.#..##.##.##.
##.###.....##.#..
##.####....##.#..
###..######..##
........###..##
##.##.###.####.
##....##..#..#.
#..##..#.......
#..#...#..####.
.#.##.#.#..##..
..####..#.#..#.
.######........
#.####.##.#..#.
##########....#
.######.#......
.######.#..##..
#.#.###
..#..##
..#..##
#.#..##
..#####
....###
.######
.##..##
.###.##
##.#...
##..#..
###....#...
#.##..#.#..
..##..#.#..
###....#...
##..###.#..
...#..####.
...###.####
...###.####
...#..####.
##..###.#..
###....#...
..##..#.#..
#.##..#.#..
###....#...
.####.###..
#.##.##.##.#..#
...#....#...##.
#..........##..
.#..####..#....
...#.##.#...#..
##.##..##.###.#
..#.####.#..##.
..##.##.##..#..
..#..##..#...##
##.##..##.###..
##.##..##.###.#
##...#.#.#...
##.####.#.#..
#####..###.##
..#....##.#..
.#####..##.##
......##.##..
###.###.#.#..
###..######..
####.#####...
.##.###.##.......
.#..#.....#..###.
.#.#######.##.##.
......##.##..#..#
.##.#####..#.#..#
..##.#.....#.####
#...#..##...#.##.
#.##.#####.###..#
#.##.#####.###..#
#...#..##...#.##.
..##.#.....#.####
..#.####.#.......
...#.#..#...#....
..#.#..#.#..##..#
.##.#..#.##.#....
#.#.####.#.#.....
....####.........
..#.#..#.#..#....
.#.######.#..####
##.##..##.###....
############.....
..#..##..#...####
.###.##.###.#.##.
#.#.#..#.#.#.####
.#..####..#......
.####..####..#..#
.#.##.#......
..####..#..##
.##..##.#..#.
.#.##.#..##..
..#..#.......
..#..#...##..
..####..#..#.
###..###....#
.#.##.#.####.
...##....##..
#.####.#....#
..#########
.#..#.##.#.
..###....##
##.###..###
#.###...###
.#####..###
##.#......#
#.###.##.##
..#..#..#..
#.#.#.##.#.
....######.
..##......#
.##..####..
.#.#..##..#
.#.###..###
#.....##...
#.....##...
.##....
.###...
..#....
##..##.
##..##.
..#....
.###...
.##....
.##..##
.....##
...####
.##..##...####...
.###...#.#.#..#..
##.......###...#.
#...#..##....##.#
#.##########.##..
...######..#.##.#
#......#..#.##...
#......#..#.##...
...######..#.##.#
#.########.#.##..
#...#..##....##.#
##.......###...#.
.###...#.#.#..#..
.##..##...####...
.##..##...####...
#........####..
#.#....#.####.#
#.#.##.#.#..#.#
#..#..#..#..#..
##......######.
.###..###....##
#...##...####..
.##....##.##.##
#.#.####.#..#.#
###....
##.####
..#####
.#.....
.#.....
..#####
##..##.
.#.##.#.##.#.##.#
.#.##.#.##.#.##.#
..#.#.#....#.#.#.
##...########...#
###.#...##.#.#.##
.#..#...##...#..#
.#.#..........#.#
.####.######.####
...#.#.#..#.#.#..
.....###....#
......##.##.#
...#..##.##.#
.....###....#
##...#.######
.##.##...##..
#..###..#..#.
....#........
.#..###.#..#.
..#.##..###.###.#
..#.##..###.###.#
###..###....#.##.
....#.####.#.###.
##.##.#..#..#.#..
###.###.#..#.####
..#.#..#.##..#.##
###....#..#.#.#.#
.#.###.#.##.#.#.#
#....#.....#.
#.#.##..#..#.
###.##.###...
.#.##...#.###
..#..###.....
.###..#...##.
..##..#...##.
..#..###.....
.#.##...#.###
###.##.###...
#.#.##..#..#.
#....#.....#.
#....#.....#.
#.####..#
#####.##.
...##....
...##....
#####.##.
..####..#
..###....
#...#.##.
#.##.#..#
#..####
##..#..
..#..#.
#..####
#..###.
..#..#.
##..#..
#..####
.#..##.
.#..##.
#..####
.#.#...##...#
.#.##......##
##...##..##..
.####.#.##.##
###.##....##.
.###..####..#
#..#........#
..#.#.#..#.#.
..#.#.#..#.#.
###.#####
###.#.###
#.#.###..
#..##.###
.###.##..
##..#....
.......##
...######
.......##
##.##....
.#..#####
.##.#.###
#..#.....
#.#.#....
#.#..#.##
.####.#
#....##
.#..#.#
.#..#.#
#....##
.####..
#.##.#.
#....##
#.##.#.
######.
##..##.
.###...##
.....#.##
..#..##..
...####..
..#.##...
#.#######
#.####.##
###..#..#..##
#..#.#..#.#..
.....####....
####.#..#.###
...#.####.#..
#..#.#..#.#..
#.....##.....
#.##########.
######..#####
.###.#..#.###
.#####..#####
.....####....
######..#####
..#####..
..##.....
#.#...#..
.#.######
.#.#####.
..##.#.#.
..##.#.#.
.#.#####.
.#.######
#..####
#..#..#
#..#..#
.##....
....#.#
.##.#..
######.
....#.#
....#..
##..##.##.#..#..#
###.#.#.....#....
###.#.#.....#....
##..##.##.#..#..#
....####.....####
##.#..#.######..#
.#.#######...#..#
.##.#.#.#.#.....#
..##......#...###
.#.######.#######
.#.######.#######
..##......#...###
.##.#.#.#.#.....#
.#.#.#####...#..#
##.#..#.######..#
....####.....####
##..##.##.#..#..#
.....#.##.##.#.
.....#..#.##.#.
#####...#.#..##
.##.#..##.#...#
#..##..##..#..#
.....###.###.##
#####.#....#.#.
#####..####..##
.##..#...#..#.#
#####..#.#.####
......##.###.#.
####.##.....###
####.###.##...#
.############...#
.############...#
###........###.#.
####.#..#.####..#
.###..##..###.##.
.##.######.##..##
##..######..####.
.####.##.####...#
.#.#..##..#.#.##.
##..#######.##..#
#..###..###..#...
.#...#..######.
#..#####.####.#
....#.###.##.##
#.###.##.#..#.#
#.....###.##.##
#...#.###.##.##
#.###.##.#..#.#
#.#..#.###..#
...##.....##.
.######......
..#..#.......
#.#..#.#.####
.######.#####
###..###.#..#
.######......
#.#..####....
.#....#.#####
#..##..#.....
...##...##..#
.##..##..#..#
###...####...
....########.
####.#.##.#.#
######.##.###
##.#.######.#
###..........
##.##########
..##...##...#
##.#.######.#
###..#.##....
..#.#.####.#.
####..####..#
##...#....#..
###..#.##.#..
###..#....#..
..#.#..##..#.
..#....##....
..#.#..#.#..##..#
#.#......#.##..#.
..########..##...
..########..##...
.##.####.##.####.
.#..#..#..#.#.#..
...######....###.
...######....###.
.#..#..#..#.#.#..
.##.####.##..###.
..########..##...
#..#..##......##.
#..#..##......##.
####..##......##.
.##.##.########.#
..#....#.#..#.#..
.#.#..#.##..##.##
#.#.#.##......##.
####.##.##.##
.#####..#..##
.#....#.#.#..
..#..#.#.#.##
.#...####....
#.#.###..#.##
..####.....##
..####.....##
#.#.###..#.##
.#...####....
..#..#.#.#.##
.#....#.###..
.#####..#..##
####.##.##.##
##.#...#.....
#..#.#...##
.##.######.
####.##.#.#
.##.##..#.#
.##.##..#.#
####.##.#..
.##.######.
#..#.#...##
####....#.#
.....##.#
.......#.
....#.##.
.....#...
.....##.#
####..###
........#
####.....
.##.#.#..
....#####
#####.###
####...#.
....##.#.
....##.##
####.#...
.#..#.....##.
##..##.#..##.
#.##.###.#..#
##..##.######
#.##.#....##.
#.##.#.##....
######.######
.####..#.....
..##....#####
#######.....#
.......######
######.##....
......#.##..#
#....########
##..###......
#.#.##..#.#
.##.#....##
####.##..#.
.#..####.#.
.#..####.#.
####.##..#.
.##.#....##
#.#.###.#.#
.....####..
#.....#####
##..#.####.
#####.####.
########.#.
########.#.
#####.####.
.#.....#.
.#....##.
##....#.#
####.#.#.
##....#.#
####.#.##
..#.##...
#.#.##.##
..####..#
##.#.#.#.
.#...#.#.
#.##....#
#.##.###.
##...##..
##...##..
#.##.###.
#.##....#
..##.....#...#...
......##.######..
.........####.#..
........####.###.
.####...#..#..#.#
.......#..#.##...
##..#####...#.#.#
..##....#
..##....#
#.#......
..##.##.#
#...#..#.
..####.##
.###....#
.######.#..#.##.#
##.##.##..#.#..#.
#..##..##.#.#..#.
.#.##.#.#########
.#....#.#.#.####.
.##..##.##..#.##.
.........####..##
#########.##....#
#......#.#..####.
#.##.#....#.##.##
##..##....##..###
..##........##..#
.####......####..
.#..#.####.#..#.#
.##.#.####.#.##..
################.
......####.......
#....######....##
#######..#######.
.......##.......#
..##...##...##...
......####.......
#....#.##.#....#.
.####..##..####.#
.#.#.##..#.######
.##....#.#.......
#.#...##.#.###..#
#.#.##.##.###....
.#.#..#.##.#.....
#..##.####.......
..###..##...#....
...#..#...#.#.##.
......###...##..#
.#..#.#...#.##..#
##.####.##..##..#
##.#..#.#.#.#.##.
.#.#.....#..#....
.###..#.#...##..#
...#.##.######..#
...#.##..#####..#
.###..#.#...##..#
###...#..##.##.
.#..###.##.#..#
##.....#..##..#
....#.#........
#..####.#..####
.####..#..##..#
#####.#.#######
#...#..########
.##......#.#..#
.######.#...###
...##.#.#.#####
..#.....##.....
.....###...####
......#.##.....
......#.##.....
#........###.....
....##.......#.##
....##.......#.##
#........###..#..
.###..###..###...
.#.####.#.#.#..#.
##.####.##..#...#
####.#......#.#
....#.......##.
####..#....#..#
##..#..####..#.
..#.#........#.
##.##.#.##.#.##
.......####....
##.#.########.#
##.##..####..##
...#.###..###.#
.....########..
...#.#..##.###.
...#..#...#..#.
...#..###..###.
###......#.#..#
####....####.##
..#....####..#.
...##....##..#.
..#..##..#.#...
##..###..####.#
..#..#.#..#.#.#
##.....##..##..
##....##.#..##.
##.....##.##.##
..#.##.#.##..#.
###..##.##.###.
###.###.##.###.
..#.##.#.##..#.
#..#.##..
#..#.#.##
#####.###
.##..####
..#.#####
#..#.##..
....#....
#..##..##
#..#.####
.....####
####.####
.##..#.##
#####.###
.##..#...
.##.##.##
..##.###.#.##..
..#..##.#.##..#
##.......#..#..
##..##...####.#
##..##...####.#
##.......#..#..
..#..##.#.##..#
..##.###.#.##..
..#..##....#.#.
#....##.#......
##.#..###.....#
##.#..###.....#
#..#.##.#......
##.##.##..####..#
#......#........#
###..#####....###
.#....#.#.####.#.
###..###.#....#.#
.##..##...####...
..#..#..#..##..#.
.##..##...#..#...
#......##..##..##
##....###.####.##
#......#..#..#..#
###..####..##..##
#......####..####
##.##.###......##
###..####.####.##
.######..######..
.#######..#..#..#
####..#..#..#
.##.#..#...#.
#..#.#....#.#
....########.
#..#.#.##.#.#
....##.##.##.
.....#....#..
..##.#.#.
......###
..#.##.##
###..####
.#.######
#.....###
....#.#..
....#.#..
#.....###
.#.######
###..####
..#.##.####
#.#.##.#.#.
#.##..#....
.##.##...#.
.###.#.##.#
#.#.###...#
.#.#..#####
......#.###
......#..##
......#..##
......#.###
.#.##....
####.####
##.###..#
.....####
..##.####
#..#..##.
#######.#
#...##..#
..#.#....
#.##.....
###.#.##.
#....#..#
#...##..#
###......
#..######
#..######
###......
.#....#.####.##
.#....#.####.##
#...#......##.#
##.....#.#.#.##
.###.......##.#
...##.###.##.##
#####....#..#..
#....#..#.###..
#....#..#.####.
###...##..#.##.
...##.#..##..#.
##.#.#..#..#..#
##.#.#..#..#..#
...##.#..##..#.
###...##..#.##.
.#..##..#..#..#
.##..##
#..###.
.##...#
.....##
.....##
.##...#
#..#.#.
###......
.#.##.##.
.#.##.##.
###......
..####..#
#.##.###.
.##.#.##.
.#.#..#..
.#.#..#..
.##.#.##.
#.##..##.
###.#.##.
##..####.
##......#
##....#.#
###.#..#.
.#.#.#.#.
###.##.##
..#..#.#.
..#..#.#.
..#.#...#.#..##
..#.#...#.#..##
.#...#####.#..#
...###....#..#.
.#..####..#.#.#
.#..#..##.####.
#######.##.##..
..#####.####..#
#.####.##...##.
.##...####....#
##.###.#..#####
#..###........#
.#.#######..#.#
...#......#..##
..........#..##
.#.##.##.#####.
.#..##..##..##.
.#...#.#####.#.
#......#..##...
.#....##...#.##
#....######..#.
..#..#.#..##...
..#..#.#..##...
#....######..#.
.#....##...####
#......#..##...
.#...#.#####.#.
.#..##..##..##.
.#.##.##.#####.
.#.##.##.#####.
.#..##..##..##.
.#...#.#####.#.
.....###.####.###
.#...###.####.###
.#...####....####
#.##.....####....
#.#...###....###.
#....##.##..##.##
#..#..##.####.##.
.#.##.....##.....
#####.##......##.
##.#.............
#.###.#.######.#.
...##.##.##.#.#
###.#.#...#####
.#..##...##..#.
.#..##...##..#.
###.#.#....####
...##.##.##.#.#
.###.##......#.
.###.##......#.
...##.##.##.#.#
###.#.#....####
.#..##...##..#.
.#..##...##..#.
###.#.#...#####
...##.##.##.#.#
#.##.#..##..#..
##...#..#...#
..##.#..#.##.
...###..###..
..#..#..#..#.
..###.##.###.
..###...####.
#####....####
.#...#.####
.#..#..####
.###.#..##.
.###.#..##.
.#..#.#####
.#...#.####
.##.#......
#.#...#.##.
...#.###..#
.#..#.##..#
..##.###..#
#.#..#.....
####.###..#
..#....########
..#....########
.#.##.#...##...
.###.#.###.####
#...#...#.##.#.
##..####.####.#
##..##.##.##.##
#...#.####..###
##.#.###.#..#.#
#####.#..###.
...#...####..
...#...####..
#####.#..###.
...##..##...#
#..#.#.##.#..
###.####.###.
##.#...##..#.
###.###...#.#
..#..#.###.#.##
.....#...#.#.##
.....#...#.#.##
..#..#.###.#.##
##.#..##....##.
..#.###.#.#....
#####....#.##..
..#...#....#..#
##..##.######.#
...#..#..#####.
##..#..#.##....
...##.#####...#
.#.###....##..#
#..#..#..##..#.
...#..##.##.#..
###.#.########.
##.#...##..##..
#.####...##...#
.####.#.####.#.
##.##..######..
.####..#....#..
.##.##.##..##.#
..#.##...##...#
#.#.#.##.##.##.
#####.#.#..#.#.
...##...####...
#.#..##.#..#.##
.####.#.####.#.
.####.#.####.#.
#.#..##.#..#.##
"""
"##.####.######.##\n.#.#..#.#....#.#.\n...#..#...##...#.\n###....########..\n#..#..#..####..#.\n.#.#..#.#.##.#.#.\n...####...##...##\n..##..##......##.\n##.#..#.######.#.\n..#....#....#.#..\n..#....#......#..\n#...##...####...#\n#.######.####.###\n..##..##......##.\n#........####....\n\n.##......\n###.####.\n##.##...#\n..###..##\n...##..##\n#..#.##.#\n..#......\n.##..##..\n.##..##..\n\n.......####..##..\n.####.##.#.#....#\n.####...#.#.####.\n######.##.#######\n........#..#....#\n.####....########\n......###.###..##\n#....##.###......\n.####...#.###..##\n#....####.##....#\n........##..#####\n##..##.####.####.\n######..#....##..\n#....#..####....#\n.####.##.#.######\n\n..####...####\n..####...####\n#...###...###\n...##########\n#.#..#..##.##\n#.#.##.#..#..\n.#.#..##..#..\n##..###....##\n#.###...##.#.\n\n#....##..\n#.###..##\n##...##..\n#..######\n##.#....#\n#.#......\n#####..##\n##.######\n.#.######\n##...##..\n..#......\n.#.##..##\n.##......\n#.#......\n#####..##\n...######\n.####..##\n\n..##.##...###\n##.#.####.#..\n...#######.##\n###..##.####.\n#####.....###\n######...###.\n..##..##...##\n..#..###..##.\n####.##...#.#\n...#.#..#..##\n..##.#.#.####\n###..###....#\n###....#.####\n..##.##.##...\n..##.##..#...\n\n....#...####..#\n.###.....####.#\n###.#.##..#.#..\n#.#.######...#.\n#.#####.#..#.#.\n...#......#.##.\n####....#......\n#.#..#..#####.#\n##..#.##...#.##\n...#.#.###.###.\n..####.##...#.#\n..####.##...#.#\n...#.#..##.###.\n...#.#..##.###.\n..####.##...#.#\n..####.##...#.#\n...#.#.###.###.\n\n#...#...#...##.#.\n....#...#...##.#.\n..##.###.##..###.\n#.#.#.#.#.###..#.\n......##.#.#.##.#\n.#..#..#...#..#..\n##.##.....####..#\n####.##...#.###..\n####.##...#.###..\n##.##.....####..#\n.#..#..#...#..#..\n......##.#.#.##.#\n#.#.#.#.#.###..#.\n\n..##....#.#.##.#.\n..#......#..#.#..\n##.###.#..##..##.\n.#.###....##.##..\n#....##.#...##.##\n#.#..##.#.####.##\n#.#..##.#.####..#\n#....##.#...##.##\n.#.###....##.##..\n##.###.#..##..##.\n..#......#..#.#..\n..##....#.#.##.#.\n..##....#.#.##.#.\n\n.#..#.#...##.\n#....#.#.....\n.......##..##\n......###....\n.#..#.#...##.\n.#..#.#......\n..##..#.####.\n......#..#.##\n........#..#.\n#....###.####\n#....##..####\n\n#................\n#...####...#..#..\n.#.######.#.##.#.\n.#.######.#....#.\n..#.####.#..##..#\n#..######..####..\n.....##.....##...\n\n#...#.#####\n##.#..#.##.\n##.........\n#..#...#.##\n..#.##.#...\n##..#.###..\n##..#.###..\n\n...#.#...#..#.#\n#....##.....#.#\n..#..#..#####.#\n.##....#...#...\n##..........###\n......#...####.\n####.#.#.##.###\n..#.#..##..####\n..#.#..##.#####\n..#.#..##.#####\n..#.#..##..####\n\n###.#......\n.#.#.##..##\n.###..##...\n##...######\n##.#####.##\n#####.#.#..\n..###.##.##\n.#######.##\n.#.##..#...\n#....#.#...\n.#..####.##\n##.###..#..\n##.#.##...#\n#.##.##....\n..##.#.#...\n.#..#.##.##\n.#..#.##.##\n\n.......##....\n..#.#..##..#.\n..#....##....\n..#..##..##..\n...##......##\n..#..##..##..\n##.###....###\n......#..#...\n#######..###.\n\n####..##.\n.#..#...#\n###..####\n###..#.##\n.#..#...#\n####..##.\n#####.#..\n.#.#...#.\n.####.#.#\n#.#.#...#\n..##.###.\n##..##..#\n...#.###.\n...#.###.\n##..##..#\n\n#.###..####\n.#..##...##\n##.##.#.#..\n.#..#...###\n.##..#..###\n####.##.###\n####.#..###\n\n#######..##\n######....#\n.####......\n#....#.##.#\n######....#\n#....##..##\n#######..##\n.####......\n.........#.\n.####......\n.####.#..#.\n#.##.######\n######.##.#\n##..##.##.#\n..##..####.\n#....#.##.#\n.####......\n\n#.#..#..##.\n#####.###..\n##.##.##...\n##.##.##...\n#####.###..\n#.#..#..##.\n###...#.#.#\n.#.#....###\n.#.#....###\n###...#...#\n#.#..#..##.\n\n#####.#..#.\n#.###.####.\n#..###.##.#\n.##.###..##\n....#..##..\n#..##.#..#.\n......####.\n\n##.#.######\n.#.#.#.##.#\n..###.##.#.\n##..#######\n#.##.######\n.####......\n..#....##..\n#.###......\n.#..#.####.\n..#..#....#\n.#.###....#\n.#.###....#\n..#..#....#\n\n##.#.####.#.###\n.##...##...##..\n.############..\n...########...#\n#....#..#....##\n....#....#.....\n..#.#.##.#.#...\n\n.#.#...#..#...#.#\n.#.#...#..#...#.#\n###.###.##.###.##\n#....##....##....\n#.#..##.##.##..#.\n#.#.###....#####.\n###.##########.##\n#..#.#.#..#.#.#..\n#.#...#.##.#...#.\n..##.#.####.#.##.\n#####.######.####\n\n.#..####..#..#.\n.##.#...#.#...#\n##.####.###.###\n.#.#####..####.\n..##..##..#.###\n..##..##..#.###\n.#.#####..####.\n##.####.###.###\n.##.#...#.#...#\n.#..####..#..#.\n.#.###..#######\n##.##.####.#...\n##.##.####.#..." <> ...
Part 1
defmodule Part1 do
defp parse_one(input) do
rows = String.split(input, "\n", trim: true)
chars = rows |> Enum.map(&String.graphemes/1)
cols =
0..(length(List.first(chars)) - 1)
|> Enum.map(fn n ->
chars
|> Enum.map(&Enum.at(&1, n))
|> Enum.join("")
end)
{rows, cols}
end
def parse(input) do
String.split(input, "\n\n", trim: true)
|> Enum.map(&parse_one/1)
end
def is_mirror_at?(rows, n) when n > length(rows) / 2 do
is_mirror_at?(Enum.reverse(rows), length(rows) - n)
end
def is_mirror_at?(rows, n) do
Enum.slice(rows, 0..(n - 1)) == Enum.reverse(Enum.slice(rows, n..(2 * n - 1)))
end
defp find_reflection(items) do
1..(length(items) - 1)
|> Enum.filter(&is_mirror_at?(items, &1))
|> List.first(0)
end
def find_reflections(rows, cols) do
find_reflection(rows) * 100 + find_reflection(cols)
end
end
Part1.parse(input)
|> Enum.map(fn {rows, cols} ->
Part1.find_reflections(rows, cols)
end)
|> Enum.sum()
35210
Part 2
defmodule Part2 do
defp parse_one(input) do
rows = String.split(input, "\n", trim: true)
chars = rows |> Enum.map(&String.graphemes/1)
cols =
0..(length(List.first(chars)) - 1)
|> Enum.map(fn n ->
chars
|> Enum.map(&Enum.at(&1, n))
end)
{Enum.map(chars, &to_int/1), Enum.map(cols, &to_int/1)}
end
def to_int(string) do
string
|> Enum.with_index()
|> Enum.map(fn {c, i} ->
if c == "#" do
2 ** (length(string) - i - 1)
else
0
end
end)
|> Enum.sum()
end
def count_bits(n) do
for(<>, do: bit) |> Enum.sum()
end
def parse(input) do
String.split(input, "\n\n", trim: true)
|> Enum.map(&parse_one/1)
end
def is_mirror_at?(items, n) when n > length(items) / 2 do
is_mirror_at?(Enum.reverse(items), length(items) - n)
end
def is_mirror_at?(items, n) do
diffs =
Enum.zip(Enum.slice(items, 0..(n - 1)), Enum.reverse(Enum.slice(items, n..(2 * n - 1))))
|> Enum.map(fn {a, b} ->
count_bits(Bitwise.bxor(a, b))
end)
Enum.all?(diffs, &(&1 < 2)) and Enum.count(diffs, &(&1 == 1)) == 1
end
defp find_reflection(items) do
1..(length(items) - 1)
|> Enum.filter(&is_mirror_at?(items, &1))
|> List.first(0)
end
def find_reflections(rows, cols) do
find_reflection(rows) * 100 + find_reflection(cols)
end
end
Part2.parse(input)
|> Enum.map(fn {rows, cols} ->
Part2.find_reflections(rows, cols)
end)
|> Enum.sum()
31974