Advent of Code 2023 - Day 14
Sample
sample = """
O....#....
O.OO#....#
.....##...
OO.#O....O
.O.....O#.
O.#..O.#.#
..O..#O..O
.......O..
#....###..
#OO..#....
"""
"O....#....\nO.OO#....#\n.....##...\nOO.#O....O\n.O.....O#.\nO.#..O.#.#\n..O..#O..O\n.......O..\n#....###..\n#OO..#....\n"
Input
input = """
####....#..O#O..#.....OO.O#..O.......O.#OO.#...O.O..O..O..OO.##.O#...........#....##O#..O#.O.O......
....#..#.........O.O#..OO#OO....O.....#O.#.O##..#...OO#OOO.O...#...O..#.O.#....##.....#O............
...#O..#........#....O...O.......O#.##.O.......O..O#O#.#OO....O..O.......#O.........#O.#.O...#...#..
#O...O...O.O..O..OO.#...O.O#....##O.##..#.OOO#...OO.#...OOO.#.O.#....#....O..##.....OO....#..O...#O.
.#.......##.#...#...O............O...#......#..#.OO...O#....O.#..........O..O.OOO#.#O#....OO..#.#O.#
..#..........#..O.O#.....O.OOO.#.##...##...OO..#..#.O#..OO.O#..#O..#O.O#.O.O#..#.#OOO..#OO.O.##..#..
#..#....O.#O.O.#...O......O...###O.#...OOO#..#.O..#O.O..O.#OO...O...#..#OOO.....O...O...OO..##....O.
...##....#..#.O#..#O...#.#......##.OO.O.......O....#O#..OOOO#....O.#OO.#O....#...O#O#..O.#.....O....
...#O....#.#O........O.O#O....O...#.O....#....#...#O.....O.O.O.#.#.......#.........#O#........O.....
...O...#.O#....#O#O.....O..O#...#O........O.#.##.....O.#...O..#...##O.#.#O#..O..##......#O.#...O#..#
#..OO#.#.........O#......#O.##.O#...O..#.#.#.OO........#......#....#..#.......O.#O.##.###.####....O.
O..O...#O..O..##.O..............#O......OOO#...#.#.#.........OO....OO....O#.#.O#.O.........#.......O
..O#.#....O..#....#OO..##...#..#...O..##O...##.O..O.OO.#.###...O..#.OO..O#...#......#.....O.#..O..#.
O..####.O..O.OO##.O...O..O#.#O..O...O..........#O.#..#..O..O#..O##O.O.#O.#..O.OO.O..#...O.#O..O.O.#.
.......O..........#...OO.O#.#.#OOOO...OO#O..O.#.#......#O.#.#...#.O#......O.O.OO...#.##..#.O.#..O..#
.#.....#O........#.O...#........O............#O......##.O..O..#.#......O#O..O...O..O.#.O...O.#..OOOO
.......O#...O...OO#.....#..O.#O..##..#O.#....OO.##.#O#......O#..O....OO..#...#O...O...##O..O###..OOO
...O...#..O..O..#O.O......#.O...#..O#..#..O.OO...O....O.#O#..###O....O..##OOO.#O.....#...#.....#...O
O...OO.#...#...O.O..#O.OO..O.#.#.#O#.O.#.O..O#O.....##O..O#.O..O........O...#.......O#.#...#.#..OO..
..OO..#.#.O#.OOO.....##.O..OOO##O#.O..O.##OOO...O..##.O......#O.##..#O..O....#.##.O###...##..O......
.......O..OO....##......O..O#O.O.O#....#O.....#....O..O.OO...#.O.#..#....#.O..#O....O......##O.....#
......O..#...O..O#O.#.O.......#.O#.....O.O#..#.#...O..##......O.O..O#.#.#..#.O.#O.O#.O.#......#.O...
....O.....O..O.......#.O.OO.....O##....##.#OO..#O..#.#...##..O#O.O...O..OO..##....O#O..O....#...O.#O
.......O.##O.#O#.........O#.OO....###.OO..O.#..#.....OO.O.O...O......O..O..O....O...#.#....#....#O..
O..#O......#.O..#O.O.#......O#..#.O##..#.#.O.....#.O...O..OO..####.#...##......#.....#O#......OO.O.#
...OOO.#O....O#O...O.##OO..#....OO...O.#.....OO.#OOO.#.........#....O....#.#..O.#O#.#...O.O...O.#...
..O.#.OOO..O.#...#OO.#.O.##OO..O..####.#....#.OO##O..#.O..O#..O#....#..O#..#.O.O..O...O...O.....O.O.
.#.#O.O..#.O.O##.....O#..#..#..OO##...OOO.#O...#.O#...#O....#OO.OO..#.OO#.OO#O#............O......#.
O#..#....O...#.#.O....#.OOO.#.OO.....OO###.O..#..#.O..#...#.#....O#.O#....#.#.O.#.....#....O.....O#.
O..O.#.....#.....OOO..O..OOO.#..#.##.O..O.......#..O.##O#...#.#.......#.#....#.O.O..OO..#.O..#..O#O.
...O...O#....#O.......#........#.O.O..O.#O#...O...#..O.#..OO#O...#........O...#.....OO.#...#.O...#.#
O.#.O#...O#....#OO.O.##......O...##..#..O#.#.#O.....OOO..#O....#...O..O#O....#.#....OO.#..#.....OO.#
...O#..O.#.#..O........O.....#.........#.....O.......O......#..#.#O....#O.O#O.#..##O#....#O...O.O...
#..O.O...O#..O.O.#O..#...O#....#..#...O..#O...O.....O..OO#OOO#OOO...#.O...#.OO#O.....#O.#.........O.
O.O...#....O#OO...O.OO..#..OO...#..O..O.O....#...#..O..OOO#.....#..OO.#O....O.#.O.OOO.#OO....##OO..O
.#O#.#.##...###O..O#...#.O.#.O...O#.O.....O....O..OOO....#...O...OO.....#.#O#O..#O......#.O.....#.#O
O.#O.OO......##......O..OOO##.OOO.#..O...O.O#..#O.#O.O......#................##..#....#O......#.....
........#.....##...OO.O......#..#.......#O.....O....O....#O.##..OO...O...O..........#..O.....OO...#.
#..O.#.......O......O#.O..........#O#.O#.#..#..O..O#.O.O..O.O........O......O..O.O..O.O..#O....O#.#.
...#...OO#..#..##.O.....O...........O.#O#O...##...O..#..#..O....#..O#O.##..O##......OOO....##..###.#
.#..#....OOO......O#O...##O..O.OO...O..#.....#.O..##.....#.#....O...#...OO#O#..O...OO#......#.#...O#
##..#....O...OOOO....OO...O......O.#.####O.O.....O..O..O...##O.#.O...#O..O....#O.O..O..O....O..#.O..
.......OO.O#.#O.O.O.O...O.OO...O.#..#...##..O..O.O...O..#..O#..##..O#.#.#.#.O#...O.....O#OO.........
...#.O#.O#..#....O.....OO..........#O.........O...O.#.....O........#..O...O...OO.##........#OO...O.O
#..O#.#..............#.#.#...O..O...#...OO.........#O..O#OOO..#....O....###.....O.O........##O...O.O
O.O#......O....#.#O..O..##O....#.....O###...#..#.#.........##........#O#..O#...O..#.#..O##OO.#.OOO..
#.#...##OO........O.....#...#..OO...OO..OO...O.#...O##....O..O#.O.O.O....#..O.##.......O#......O....
..#.O..#.......OO.....#...OO.O.O..O#.........#O.....#...#O......O.....O.........O..#..OO...O...O..OO
......O....O.O.....#.OOO.#..O.O.O.O.OO.#.O##OO...O....OO....O....O....#.O...........O......#...O...#
#O..##....#...OOOO......O.#.O#O...OO...O#..##O....O.....O..###.O#....O.........O...O#.....O..O.O...O
OO..#.#O....##.#..OOO...O#.......O.#...#.#....O.O#.#..#O#..#....#.O.##.OO.....#....#.....O#..#.....#
#.O.....#..#.O.....O#..#O#O.#.##O.....O.OO..O#.OO............O..O...O...##O..OO..O...#...O.....O#O.O
O........##.#O.OO...#...#O.#...O............##...O..#...OO.O.......#.O.O.....#.O........OOO#.##.....
....#...##.....O.....O.....#....#OO..O..#O.......O#.O..OO.#..OO......O..O..O...O..#O.......O..O..O#.
##.O.O....O.O#.........O.OOO..O.....O.OO..O....#.O...#.....#.#...O...OO#.OO..O.#..#.O.O.O...#..O.OO.
O..#..OO..O..#O...O...#..O#...........#.#......#..O#.O.#.....#O...O.......O.O.......O#O.#.#O..OO#.O#
..........O..O#......#.......#..O..O....O#.....O....O#...OO..O.O...#...O.O...O.O.O..##........#.#..#
.........O..#.O..#..#..#....O....O#..#.#..O....O....O....O...#O.......##.##.......O##.#..#..O...#O.#
##O...#..........O#.....O....#..O....#.O#O......OO.O.O........O...O.#..O#.......O....#......O.....#.
#.#.O.O...#.#....#.....O...O.#..OO#..#....#.O#.#O.#...O..O..OO...........#.....#..OO..#OOO#O...O...#
.#O...#....OO#....O.#....O##.#....#.O....O.#...O..O#.#.O..#..OO#.O....O.#.OO..#....OO.O...........O.
.O.#..#.O....O.....O.O#.#....O..##....O#.OO.....#..O...#O...OO..#....#...#..OO.O#..O...OO....#O...O.
.O..#O.....##...#....#.OOO...#.....O#.#O.O#OO.......#...O..#...#O.#...O....#.O..O#........#....O.#..
......#...O.O.....O..........#..##....O#O.#....#O..OO#..O........O...###.#.#..O.#O#OO#.##.OO...#O.O.
.#....OO.O...O.O##.##...OO.###..O#OO#.O..#O##.OO......#.OO#.#..OOO...O..O#OO...OO#O..O#....O.OO..OOO
...#O.....#OO.....O.O.#O.O..O......#O#O..O....O.O.OO.......#OO#..#..#..O...#.#O...O.O..O.......O..##
.#.O...O....O...#O.#O..O...#..O...#OOO#...O#...O.#O..##.#...##..#O.......O.#..#.O##....O.#..........
...O.#.....#..OO...O...O...O.O.#O...O.#.O..#.##.O.O......#...##.#O.#..##O.......#.O..#.OO.OO...#.OOO
......O..#.#O..OO.#..O#..O#...OO#......#.#.....##.#.#..#O##.O#O..#.#...#....O..#.O.#..O...OOOO.O#.O.
...OO..#.#..O.O..OO.O.O..O........#.O#O.#.O.O..O..O....O...#..O#.##..OO.......O.O.OO..O.O..O...#...O
.O......#....#.........#.....#.....#.....O.O.OO.O.#..O...OO#O....O##..O#O...#O.#........#OO..#..#OOO
....#..#..#.#O......OO.O.OO#....##.#..#...O..O......O.##.#.O#OO.#.............OO..#...#....OO..O#.#.
#....O#O#..OO..O.O#..........#O..O.#OO..#.O.#...O...#...O.#.#..#.#..O...#..#...###O..#....O#.#.#....
...O#.O.#...#...O..O.O.O.O........#O.O..O.#O....OO............O.....#.......O..O...O........O#O#.#O.
O.O..O.O....#..OO......#..O.......OO.....#.O.O..O...OOO..OOO#..O...#O.#O..OO....#.#O#O.O..#O....#...
.#..##.....##...O..O..#.....##...O.#O.O...#.....O.....O.#.#O..O..#......O...O.##...O###..O#.#...#.#.
.O.#....O...O..O#......#OOOO.O#....#O.......O...#..OO...O...O.#.............OOO..##..OO......O......
...#O.....O#..#....#...#O.O......#..O..#..O#O..#O..OO#..#.#...##....#O#...OO....O.OOO.#.O##O.O.#O.#.
..O...O.#O........##.#.O.OO....#...#...O.O.....O........O.....O#...O..#.O#.O.O.....#..O...#OO.#O.O.#
O........O...#......#.......O...#O#O#O....O..OO.#...#.......O......O#O....O.##..O#O.O#O.O.....##...#
..O#...O.#..O..O.##O.#...O.#..##.##....##....O.OOO.O......#..#...#..O###.#.#.O...##.O#OO#.O.#..O#.O#
#O........#.OO...O.##.....O.O...#O.#.#.#.O.O.#...OO...#.#.O.O..##..O#...O#.........#.....#..#.#..#.O
#....#.....#.#...O.#.O.OO..#........O.#..OO...O.O......O..#..#....OO....#..OO.#.#....#.......O.#O..O
...#..####...OO#....O.O..O.....#O.OO....O#O..###.OO..O...#O#.O##...O..........O.##.#.OO.O....O.....#
O.#..O.O.#.#.....O....O#.....##....#.......O.#.#O....O...#....O..O..O....O.O#..O.O....OO..OOO...OOO#
O..O.#.....O#.O##O...O....O#......#....O...O#....##O.#...#...O........OO#O........O...O...O....#...#
.O#.#...OO#...O...O.#O#.O..OO....#.O....OO.#.#.O##.O....O.............#..#..OOO.O.#O.O...O#....#..#O
#O#..#.#.OO......#..O....##.....O.#.O...OO.O...#.#.O..#.#O.O..O.......#.O...O......O..#.OOOOO..O.#..
#OOO...#.O..#....OOO#.O...........O...#OO#.......O..#.O...O.O.#.#...#..OO.##O....#...O....#.OO.O...#
.OO.#.O..##..#.O..O....#..##......O.O..O........#.....#O..O...OO..#..OO.....O.....#...#.....OO.....O
.#.O.O...O..O.....O.#.........O..O.......O...#....O..#..#.OO.O...O.#.#..O.O....OO.#.......O......O.O
.O.....O....#..O#....O#.OO#....#...#........O......OO.O.O...O..OO.O..#.O##.......O..#..O#.##..O#.OO.
OO.......#O....OO....#....#.O..#..#..OO.#.O..O#.O.O..##O#....O.O#.....OO.#OO....O...O....O#......O#.
..#O...O.O.#O...#......O..#...#...O...OO.O.#...#O.............O#OO.#...#.#O.#.#O#O.#O....OO..##.#.O.
#....O#OO...O##.O.O.OO......O....O....#O...O.......#..##......O.#.O....#OOO......O#O#.O.#..#..#.....
.....O.O......O..#.#O.#O#..O.OO.#O.O...#..##.......#O..#O..O.....O...O.......O.O#.#.O..#...O.O.#..O.
........O...O.....#.O....#O..##O##..#..O...#...O.O.O##.....O.....#...............#O...O..#O...O.#O.#
..O.O#...#.#O..#..#O...#......#OOOO.....OO.....##...OO..#.O##.OO....OO..#..#.#.#..O.#.O#.........#..
..O.##.##......#O.##...#......O.#...###.......#O.#.O.....#....#.......O...........OO.#O#...#.##.O#O.
#..#O.#O.....O......O.#.O#....#.###..O..#......O.O#..O#O.#O..O#O...O.#....O..O.OO.#OO.........O#.#..
"""
"####....#..O#O..#.....OO.O#..O.......O.#OO.#...O.O..O..O..OO.##.O#...........#....##O#..O#.O.O......\n....#..#.........O.O#..OO#OO....O.....#O.#.O##..#...OO#OOO.O...#...O..#.O.#....##.....#O............\n...#O..#........#....O...O.......O#.##.O.......O..O#O#.#OO....O..O.......#O.........#O.#.O...#...#..\n#O...O...O.O..O..OO.#...O.O#....##O.##..#.OOO#...OO.#...OOO.#.O.#....#....O..##.....OO....#..O...#O.\n.#.......##.#...#...O............O...#......#..#.OO...O#....O.#..........O..O.OOO#.#O#....OO..#.#O.#\n..#..........#..O.O#.....O.OOO.#.##...##...OO..#..#.O#..OO.O#..#O..#O.O#.O.O#..#.#OOO..#OO.O.##..#..\n#..#....O.#O.O.#...O......O...###O.#...OOO#..#.O..#O.O..O.#OO...O...#..#OOO.....O...O...OO..##....O.\n...##....#..#.O#..#O...#.#......##.OO.O.......O....#O#..OOOO#....O.#OO.#O....#...O#O#..O.#.....O....\n...#O....#.#O........O.O#O....O...#.O....#....#...#O.....O.O.O.#.#.......#.........#O#........O.....\n...O...#.O#....#O#O.....O..O#...#O........O.#.##.....O.#...O..#...##O.#.#O#..O..##......#O.#...O#..#\n#..OO#.#.........O#......#O.##.O#...O..#.#.#.OO........#......#....#..#.......O.#O.##.###.####....O.\nO..O...#O..O..##.O..............#O......OOO#...#.#.#.........OO....OO....O#.#.O#.O.........#.......O\n..O#.#....O..#....#OO..##...#..#...O..##O...##.O..O.OO.#.###...O..#.OO..O#...#......#.....O.#..O..#.\nO..####.O..O.OO##.O...O..O#.#O..O...O..........#O.#..#..O..O#..O##O.O.#O.#..O.OO.O..#...O.#O..O.O.#.\n.......O..........#...OO.O#.#.#OOOO...OO#O..O.#.#......#O.#.#...#.O#......O.O.OO...#.##..#.O.#..O..#\n.#.....#O........#.O...#........O............#O......##.O..O..#.#......O#O..O...O..O.#.O...O.#..OOOO\n.......O#...O...OO#.....#..O.#O..##..#O.#....OO.##.#O#......O#..O....OO..#...#O...O...##O..O###..OOO\n...O...#..O..O..#O.O......#.O...#..O#..#..O.OO...O....O.#O#..###O....O..##OOO.#O.....#...#.....#...O\nO...OO.#...#...O.O..#O.OO..O.#.#.#O#.O.#.O..O#O.....##O..O#.O..O........O...#.......O#.#...#.#..OO..\n..OO..#.#.O#.OOO.....##.O..OOO##O#.O..O.##OOO...O..##.O......#O.##..#O..O....#.##.O###...##..O......\n.......O..OO....##......O..O#O.O.O#....#O.....#....O..O.OO...#.O.#..#....#.O..#O....O......##O.....#\n......O..#...O..O#O.#.O.......#.O#.....O.O#..#.#...O..##......O.O..O#.#.#..#.O.#O.O#.O.#......#.O...\n....O.....O..O.......#.O.OO.....O##....##.#OO..#O..#.#...##..O#O.O...O..OO..##....O#O..O....#...O.#O\n.......O.##O.#O#.........O#.OO....###.OO..O.#..#.....OO.O.O...O......O..O..O....O...#.#....#....#O..\nO..#O......#.O..#O.O.#......O#..#.O##..#.#.O.....#.O...O..OO..####.#...##......#.....#O#......OO.O.#\n...OOO.#O....O#O...O.##OO..#....OO...O.#.....OO.#OOO.#.........#....O....#.#..O.#O#.#...O.O...O.#...\n..O.#.OOO..O.#...#OO.#.O.##OO..O..####.#....#.OO##O..#.O..O#..O#....#..O#..#.O.O..O...O...O.....O.O.\n.#.#O.O..#.O.O##.....O#..#..#..OO##...OOO.#O...#.O#...#O....#OO.OO..#.OO#.OO#O#............O......#.\nO#..#....O...#.#.O....#.OOO.#.OO.....OO###.O..#..#.O..#...#.#....O#.O#....#.#.O.#.....#....O.....O#.\nO..O.#.....#.....OOO..O..OOO.#..#.##.O..O.......#..O.##O#...#.#.......#.#....#.O.O..OO..#.O..#..O#O.\n...O...O#....#O.......#........#.O.O..O.#O#...O...#..O.#..OO#O...#........O...#.....OO.#...#.O...#.#\nO.#.O#...O#....#OO.O.##......O...##..#..O#.#.#O.....OOO..#O....#...O..O#O....#.#....OO.#..#.....OO.#\n...O#..O.#.#..O........O.....#.........#.....O.......O......#..#.#O....#O.O#O.#..##O#....#O...O.O...\n#..O.O...O#..O.O.#O..#...O#....#..#...O..#O...O.....O..OO#OOO#OOO...#.O...#.OO#O.....#O.#.........O.\nO.O...#....O#OO...O.OO..#..OO...#..O..O.O....#...#..O..OOO#.....#..OO.#O....O.#.O.OOO.#OO....##OO..O\n.#O#.#.##...###O..O#...#.O.#.O...O#.O.....O....O..OOO....#...O...OO.....#.#O#O..#O......#.O.....#.#O\nO.#O.OO......##......O..OOO##.OOO.#..O...O.O#..#O.#O.O......#................##..#....#O......#.....\n........#.....##...OO.O......#..#.......#O.....O....O....#O.##..OO...O...O..........#..O.....OO...#.\n#..O.#.......O......O#.O..........#O#.O#.#..#..O..O#.O.O..O.O........O......O..O.O..O.O..#O....O#.#.\n...#...OO#..#..##.O.....O...........O.#O#O...##...O..#..#..O....#..O#O.##..O##......OOO....##..###.#\n.#..#....OOO......O#O...##O..O.OO...O..#.....#.O..##...." <> ...
Part 1
defmodule Part1 do
def count(input) do
rows =
input
|> String.split("\n", trim: true)
|> Enum.map(&String.graphemes/1)
len = length(rows)
cols =
for _ <- 1..length(List.first(rows)) do
len + 1
end
measure(rows, cols, len)
end
defp measure(_rows, _cols, 0), do: 0
defp measure(rows, cols, len) do
[row | tail] = rows
results =
Enum.zip(row, cols)
|> Enum.map(fn {char, col} ->
case char do
"." -> {col, 0}
"#" -> {len, 0}
"O" -> {col - 1, col - 1}
end
end)
cols = results |> Enum.map(fn {col, _} -> col end)
(results |> Enum.map(fn {_, score} -> score end) |> Enum.sum()) + measure(tail, cols, len - 1)
end
end
Part1.count(input)
105249
Part 2
defmodule Part2 do
def parse(input) do
input
|> String.split("\n", trim: true)
|> Enum.with_index()
|> Enum.reduce(
{MapSet.new(), MapSet.new(), 0, 0},
fn {row, y}, acc ->
row
|> String.graphemes()
|> Enum.with_index()
|> Enum.reduce(
acc,
fn {c, x}, {fixed, rollers, max_x, max_y} ->
case c do
"." ->
{fixed, rollers, max(x, max_x), max(y, max_y)}
"#" ->
{
MapSet.put(fixed, {x, y}),
rollers,
max(x, max_x),
max(y, max_y)
}
"O" ->
{
fixed,
MapSet.put(rollers, {x, y}),
max(x, max_x),
max(y, max_y)
}
end
end
)
end
)
end
def sort(rollers, dir) do
case dir do
:north -> Enum.sort(rollers, fn {_ax, ay}, {_bx, by} -> ay <= by end)
:south -> Enum.sort(rollers, fn {_ax, ay}, {_bx, by} -> ay >= by end)
:east -> Enum.sort(rollers, fn {ax, _ay}, {bx, _by} -> ax >= bx end)
:west -> Enum.sort(rollers, fn {ax, _ay}, {bx, _by} -> ax <= bx end)
end
end
def roll(rollers, fixed, dir, max_x, max_y, rolled \\ MapSet.new())
def roll([], _fixed, _dir, _max_x, _max_y, rolled), do: rolled
def roll(rollers, fixed, dir, max_x, max_y, rolled) do
{dx, dy} =
case dir do
:north -> {0, -1}
:south -> {0, 1}
:west -> {-1, 0}
:east -> {1, 0}
end
[{x, y} | tail] = rollers
{rx, ry} =
Enum.reduce_while(
0..max(max_x, max_y),
{x, y},
fn _, {x, y} ->
{nx, ny} = {x + dx, y + dy}
if nx > max_x || ny > max_y || nx < 0 || ny < 0 || MapSet.member?(fixed, {nx, ny}) ||
MapSet.member?(rolled, {nx, ny}) do
{:halt, {x, y}}
else
{:cont, {nx, ny}}
end
end
)
roll(tail, fixed, dir, max_x, max_y, MapSet.put(rolled, {rx, ry}))
end
def print(fixed, rollers, max_x, max_y) do
0..max_y
|> Enum.reduce("", fn y, acc ->
acc <>
"\n" <>
(0..max_x
|> Enum.reduce("", fn x, acc ->
acc <>
cond do
MapSet.member?(fixed, {x, y}) -> "#"
MapSet.member?(rollers, {x, y}) -> "O"
true -> "."
end
end))
end)
end
def cycle(fixed, rollers, max_x, max_y) do
[:north, :west, :south, :east]
|> Enum.reduce(
rollers,
fn dir, rollers ->
rolled = rollers |> sort(dir) |> roll(fixed, dir, max_x, max_y)
# IO.puts(print(fixed, rolled, max_x, max_y))
rolled
end
)
end
def load(rollers, max_y) do
rollers
|> Enum.map(fn {_, y} ->
max_y + 1 - y
end)
|> Enum.sum()
end
def stringify(rollers) do
rollers
|> Enum.sort()
|> Enum.reduce(
[],
fn {x, y}, acc -> ["(#{x},#{y})" | acc] end
)
|> Enum.join("")
end
def hash(rollers) do
:crypto.hash(:sha256, stringify(rollers))
end
def solve(fixed, rollers, max_x, max_y, n_cycles) do
1..n_cycles
|> Enum.reduce_while(
{rollers, %{}, %{}},
fn n, {rollers, map, reverse_map} ->
rolled = cycle(fixed, rollers, max_x, max_y)
hash = hash(rolled)
case reverse_map[hash] do
nil -> {:cont, {rolled, Map.put(map, n, rolled), Map.put(reverse_map, hash, n)}}
p -> {:halt, map[p + rem(n_cycles - n, n - p)]}
end
end
)
|> load(max_y)
end
end
{fixed, rollers, max_x, max_y} = Part2.parse(input)
Part2.solve(fixed, rollers, max_x, max_y, 1_000_000_000)
88680