From ec25382f66ee149738c76309dad4e4b61f5a019a Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Thu, 19 May 2022 15:19:28 +0000 Subject: [PATCH] feat: solve day 20 part 1 --- 20/input.txt | 1727 ++++++++++++++++++++++++++++++++++++++++++++++++++ 20/main.py | 149 +++++ 20/test.txt | 107 ++++ 3 files changed, 1983 insertions(+) create mode 100644 20/input.txt create mode 100644 20/main.py create mode 100644 20/test.txt diff --git a/20/input.txt b/20/input.txt new file mode 100644 index 0000000..a90ebfe --- /dev/null +++ b/20/input.txt @@ -0,0 +1,1727 @@ +Tile 3571: +##..##.... +..##..#..# +#...##.... +.....#...# +.......... +...###.... +#......##. +#...#...#. +#...##...# +#.####.##. + +Tile 2687: +#..##..### +.......... +.....##..# +.#.#..##.# +#.#..#..## +#.....#... +#...#..... +##....##.. +#...#...## +..#.#.#.## + +Tile 3049: +##.#.#.### +....##.### +....##.... +#......... +#.#...#..# +#..##....# +#.#......# +#..#..##.. +#......### +#.#..#...# + +Tile 1597: +###..##... +##.....### +.#..#..#.# +#.......#. +#.#....... +.#..#..... +#.....#... +#........# +##.#...##. +.....#.### + +Tile 1301: +#.##.#.### +#........# +....#..... +#.....#### +.#....#.## +.....#.... +#..##..#.# +.....#..## +.#.##..#.# +#...###### + +Tile 3259: +..#####.#. +.....#...# +#...#..... +...##...#. +.#..#..##. +.#.......# +........## +#.......#. +.#.#...#.. +#...#.#..# + +Tile 3989: +#..#..#### +.......... +#........# +.#....#... +.......... +#......... +.#........ +#........# +...##.#### +.######.## + +Tile 3803: +#.####...# +.###.#..#. +....##..#. +#........# +..##..#... +####.#.... +..#...#... +#..#.....# +..##....#. +#....#...# + +Tile 2897: +.#..##.#.# +..#.#...## +#........# +###.#..#.# +...#..#.## +...#....## +....##...# +.....##..# +.#....#... +..##....## + +Tile 2843: +##.###..## +#.#....... +#....#.... +#..##.##.. +.##..#.##. +#....#.... +#.#...#.## +.......... +.#...#...# +###..#..## + +Tile 3023: +.#..###.#. +.........# +.......... +.#........ +#.#....#.# +....#...#. +#.......#. +##.#.....# +..#...#..# +.....####. + +Tile 2887: +#....##... +#...#..... +##...##... +#.....##.# +.......#.. +#......#.# +..##..#..# +....#....# +#.###..... +#.####..#. + +Tile 1013: +#..####.#. +#.##...#.# +#..#..#... +#..#..#..# +...#...... +#.####...# +.#..##..## +...#.#..## +....##..## +#.##.#.#.# + +Tile 3733: +###.##.#.# +..#....#.. +#...#.#..# +....###..# +.#........ +.....#.... +........## +##........ +#........# +#.#...#..# + +Tile 3691: +.##...#### +##..##.... +#.#.##..## +#........# +#.....##.# +.....#.... +##.#.....# +#..#.....# +..#....... +####....#. + +Tile 3061: +##.....#.. +.....#...# +....##...# +###.#..... +#..#..###. +#.#.###..# +..#......# +#..#.#...# +..#....... +..#.#..#.. + +Tile 1489: +###....... +.....##... +..#...##.. +#.....#... +#.#......# +##.#..#### +...##.#... +...#...#.# +.......... +.##.##.#.# + +Tile 1637: +#########. +.#.....#.. +#........# +#........# +.##.....## +.........# +#....#..## +#.....#### +...###...# +.#..##..## + +Tile 1069: +#.#...#### +##...#...# +.....#...# +.......##. +......#..# +#........# +#...#..... +......#... +#.#..#.... +####.##.#. + +Tile 1039: +#..####### +###....... +.....#.... +#......... +....#....# +...####... +.#...##... +#.#....#.# +........## +#.#..#..#. + +Tile 2767: +.#.#..#.## +.#..#....# +#..#.#.... +#.#..##..# +.####.#.## +#....##... +....##..## +###.....#. +.......... +....#.###. + +Tile 2957: +####.##### +.......##. +...#.....# +...##..##. +...##.##.. +#..#..#..# +.....#.... +#..#....#. +.##....... +.##..#.##. + +Tile 2789: +.##..#.#.# +#.#.....## +#....#...# +#....##... +..#..#.... +#......... +#.#..#..## +#........# +.#.......# +#####...## + +Tile 2837: +.....#...# +.....#.#.# +#.......#. +#...#...#. +..#.....#. +..#.#..#.. +##.......# +....#....# +#...#..... +##.###.... + +Tile 3251: +.######... +...#...... +.#.#..###. +#..#.##..# +###.#....# +#.#......# +..#..###.. +##.#..#..# +...#...### +##.#..##.. + +Tile 3137: +#####.#..# +#.#..#.##. +#.#..#.... +#......... +.........# +.........# +...#...... +#...#...#. +....#..#.# +.#.###.#.# + +Tile 3433: +.##..####. +...#...... +#..##....# +....#....# +#..###.... +..#......# +.#..###... +.##.#..... +.........# +.....#.... + +Tile 2551: +#.######## +#.#....... +##..#...## +#.#..###.# +#........# +.#.#....#. +#........# +.##....#.. +#........# +##..##.#.. + +Tile 2647: +..####..## +##....#..# +#......... +###.#..... +#......#.. +....#...## +.#..##.#.# +.#.#..#... +.....##.## +.#.#...#.. + +Tile 1087: +#..###..## +#...#.#.#. +.......#.. +..#.#.#..# +#.......#. +#....#.... +....#....# +##...##..# +#..#...... +.#..#.###. + +Tile 1423: +..#....#.# +#........# +.#.##.##.. +#.###.#.#. +#.#......# +...##...## +#....#.... +....#....# +.........# +#####....# + +Tile 1759: +..#.#..#.. +##...#...# +....#..#.. +#....#.... +.##..##..# +...#.#...# +#..#.....# +##.......# +......#..# +#.##...... + +Tile 1583: +.###.####. +......###. +......#..# +.#...##... +#...#....# +..#.##.... +#...##..#. +......#... +#.....###. +####.#.... + +Tile 1171: +###......# +#...##...# +#####..##. +#.......#. +#.#...#..# +#....#.... +....#....# +##.....#.# +#.#..#..## +#.#.#..##. + +Tile 2801: +.###.####. +......#... +##..##.#.# +.....#.... +#......#.. +###..##..# +##.#..##.# +#..#..#... +#..#.#...# +#..###.### + +Tile 1559: +.##..#...# +#.##..#... +...##..#.. +..#.#..... +...#...#.. +.........# +...#.....# +#..##.#..# +##..##.... +...###...# + +Tile 2609: +##.#..#### +.......... +#........# +##.###...# +#.#..#.... +..#..##..# +#....#.#.# +#.#....... +#....#...# +#.####.#.# + +Tile 2287: +#......#.# +.....#.#.# +..#..#...# +##.#..#... +..#..#.### +.......### +#......##. +#.##.##... +......#..# +#####.##.# + +Tile 3659: +.###.##### +#.#....... +.......... +..#.....## +#..#...... +#.#.#...## +#......... +.#...#.... +##.....#.. +#####.##.# + +Tile 3539: +.......#.# +..##...#.. +.....#.#.# +##.#...... +####...... +...#..#... +#.......## +#...#..... +#..#.....# +.##.#....# + +Tile 3121: +..##.#...# +.###..#... +##.#.#.... +#.....#..# +#.#....... +#......... +....#...## +......###. +#........# +#..###..## + +Tile 2237: +...##..... +.......... +...#...... +#....#...# +#......... +.......#.. +#...###..# +.....#...# +.........# +#.####.##. + +Tile 1277: +.###...##. +.......### +#.....##.. +#.##..###. +#.#..#.... +.....#.... +#...#....# +#.#......# +#...###..# +...##...## + +Tile 2161: +..#####..# +#....##..# +#.....#..# +....#....# +.....#.##. +.......... +#......#.# +#..#...... +#....#..## +.##.....#. + +Tile 3709: +.#..#...## +#..#.....# +...#....#. +.......... +.#...#.... +.......... +....##.... +#......... +.........# +..####.... + +Tile 1117: +##.##.#..# +.....##... +.#.#..#.## +.#...#..#. +#.##.#.... +####.....# +##..#..... +#......... +#...##...# +####..#.#. + +Tile 2081: +##.##.###. +#...#..... +#.....#... +#.#..#.#.. +#.....#..# +...#.....# +#....#.... +......#..# +.#.##..#.. +###..#.#.# + +Tile 1709: +##...#.##. +###..#.... +#.......#. +#.....##.. +.........# +#....#..## +..#...##.. +#...#..... +#...#.#..# +.###.#.... + +Tile 2927: +...###..## +##.#...... +.......... +##........ +#....#...# +.......##. +#.....#..# +##.#.#.... +#......#.. +...#.####. + +Tile 1499: +#....##.#. +......#... +#........# +......#... +.#.......# +#.#...#.## +..#....#.# +#...#..... +.........# +#.....##.# + +Tile 1453: +#.##.####. +..#...##.. +.........# +.........# +#..#..#... +.........# +#....#.#.. +#.....#..# +.#........ +#....#.... + +Tile 1283: +.#.##..### +..#...#.#. +...##..#.. +#.......#. +#......#.. +#..##..... +#.......## +....##...# +..#.....## +##.#.#...# + +Tile 2063: +......#.## +.........# +....##..#. +.#....##.. +##........ +.###.###.# +#.#....#.. +....#...#. +#......### +#....####. + +Tile 3529: +...###.##. +#....#...# +...#.....# +...#.#..#. +.#.#.....# +#...#..... +##..#..#.. +#.....#..# +.#........ +.#..#####. + +Tile 2657: +..#.##..#. +##..#...## +#.....#... +#....##... +.....#..## +#.#..##.## +#......... +#.#...##.# +##....#... +##..####.# + +Tile 2089: +.######### +##.#.##..# +#........# +#..###..## +...#...... +##..#....# +#...#..#.. +#..#....#. +..#.#....# +...###...# + +Tile 3779: +#.#...##.# +.##...##.. +.....##... +.#....##.# +###..##..# +#.#..#.#.. +....##...# +##...#.... +.#...#.... +#######... + +Tile 3217: +...##..... +....##.... +.....##..# +##...#.#.# +###....... +...#...#.. +...#.....# +#..#.#.### +##.#...#.# +.#.#..##.. + +Tile 3907: +..#..##.## +#.#.....## +#.......#. +.#...###.. +..###.#### +##.#..##.. +#......... +##...#..#. +#....#.... +.#.....#.# + +Tile 3547: +#..#.##... +#..###...# +##.......# +.....#.... +#...#...#. +#..#..#... +........#. +......##.# +.......#.. +.##.#..##. + +Tile 3187: +##.#.##... +#...#.##.# +#...#..... +#....#..## +....#.#..# +.....#.... +.....#..## +....##...# +.......... +#######.## + +Tile 1217: +##.#####.. +#.......#. +...#....## +#........# +#.#......# +.....#...# +#......... +....#...## +#...#..... +.#...###.# + +Tile 3821: +#.###.###. +#.#......# +#..#.#...# +.##...#.## +...#....## +#...#..##. +#......#.# +###..#...# +.........# +#....##.## + +Tile 1607: +##..#..##. +#.##....## +###.##.##. +.#....##.# +#.#..#...# +.....#.#.. +#.#..#..#. +#.#..#.... +.......... +......##.# + +Tile 1459: +.###.##..# +#.......#. +##........ +..#...#### +###....... +#....#.... +.#.....#.# +###..#..## +.....#.... +..#..#..## + +Tile 2129: +....#.#..# +#.....##.# +#........# +.......... +..#......# +#.....#..# +.#..##...# +#.#.#..#.# +#......... +#.##....## + +Tile 1601: +.#.#.#.#.# +..#..##... +#.#.#...#. +....##.... +....##.#.. +..#....... +#.....#..# +#..##.#... +.........# +...####.#. + +Tile 1801: +#.#...#.#. +..#....#.. +#..#...#.. +......#... +.....#.... +#.#..##.## +#......... +...#.#...# +.#....#..# +#.....##.. + +Tile 2447: +..#.....## +.#..#...## +.....#.#.. +.#....#..# +#...####.# +##.##..### +.#.......# +#.##.....# +#.......## +.###.#...# + +Tile 2203: +#.....##.. +#.#....... +........## +###...#... +.......... +#..#.....# +....#.##.# +..##.....# +.#...#...# +#.###..#.. + +Tile 1381: +.#...#...# +....#..... +##.......# +#.....#... +.........# +.#.......# +.......##. +#.#.....## +.#..#.##.. +##.#.##.#. + +Tile 3163: +#...####.# +#......##. +...###.#.# +#....##... +#......### +.....#..## +.#..###... +#..##..#.. +#.....#... +#.#####.## + +Tile 3673: +.#....##.# +..#..####. +#.....#... +...#....#. +#....#...# +#....##.#. +##...#.#.. +.#..#.#... +#..#.....# +####.##... + +Tile 3919: +....##.##. +##..##.... +...##...## +#...#..... +.......... +....#..### +.#.....#.. +....#..#.# +.##..#.... +.#...###.# + +Tile 2437: +..##...#.# +#....#...# +#..#.....# +..#.#...## +.......#.. +........## +........## +.......#.# +#....#.#.# +##..#.###. + +Tile 2969: +##.#.##.#. +#.##....#. +.##......# +#.#.#....# +#.#....... +.........# +....#.#.## +.#.......# +...#..#.## +##.#.##..# + +Tile 2621: +.##.##.#.. +.##...#... +.......... +#......... +#.#.#.#..# +..#..#...# +.......#.# +#.#.....## +...#..#... +#.......## + +Tile 3613: +##..#....# +#..##..... +..#....... +..#...#... +...#...#.. +...#.....# +..#.....#. +..#.###..# +.......... +..#.####.. + +Tile 2777: +##.#####.# +#.##.#...# +..#....... +.##...##.# +.........# +.#.###.##. +#......##. +#......##. +#...##..## +#..#....## + +Tile 2711: +#..#..##.. +.......... +#.#......# +#.....#### +.......... +##.......# +........#. +#.......#. +#.#..#...# +#.#.####.# + +Tile 2281: +.#.###...# +###....#.. +.......... +#.#..#..## +.........# +###..#.##. +####..#..# +##..#..... +##..#..#.. +#.....#..# + +Tile 1579: +....#..#.. +#........# +#...#..#.. +..##.#.#.. +.###.#...# +....##..#. +...##.#... +.#.##....# +.#.......# +##...#...# + +Tile 2411: +#.#....##. +..#...#..# +.#..##.... +.#..##...# +.....#.#.# +......##.. +#.#....### +.#.##....# +..#..#.... +..#.###..# + +Tile 2963: +.......##. +.....#.... +.........# +#.....#..# +.....#.#.. +.....#.##. +.#.#...### +#.#....... +.#.......# +###..#..#. + +Tile 1693: +#.##..##.. +.......... +.........# +.##..#...# +.........# +#........# +###......# +..#...#... +.#.##....# +...#.#...# + +Tile 2399: +###.#.##.. +#...#..... +...#...#.# +###....... +.##.##.... +##.....#.# +####...... +##.......# +#..#...#.# +#...#..... + +Tile 1913: +##.....### +........## +#.....###. +.......... +....#...#. +#.#.....#. +#....#...# +..#...#... +....#..#.. +#..####... + +Tile 3343: +.....#.##. +..#...#... +####.....# +....#..... +......#..# +......#... +#........# +#.......#. +..#...#.#. +.....###.# + +Tile 2557: +#.......## +....#...## +#......#.# +#.#.#.#.## +#..##..... +..###.#.#. +#..#...... +#...#..... +....#....# +#.##...#.# + +Tile 1097: +.#.#.#..## +..#.#..... +##........ +.##...##.. +..#..#...# +#........# +........## +#.#.#..... +.#.#.....# +#.##..#... + +Tile 2591: +##..#..### +......#... +...###.#.. +#.......#. +#.#.....#. +#.##..#... +....##.#.. +#.#..#...# +#.###..#.# +##........ + +Tile 3413: +...##...## +..#....#.. +##.#....#. +#..#....#. +#........# +#..#...... +#.....#.## +##.....#.# +#....#.... +####.#...# + +Tile 2087: +###..###.# +##......#. +#..#...#.# +#.#....... +##.#.....# +#.#.#..... +...#.....# +.......... +#......... +#.##..###. + +Tile 3037: +......##.. +..#..#.... +#.#....... +#.#....#.. +.#.#.##..# +#.....#.## +#.....#.#. +.#..##...# +#....##... +...#..###. + +Tile 2239: +.####..#.. +#......... +.#.......# +#..##..... +##..##..## +#.#....#.. +.........# +#.......#. +....#..... +#.###..#.# + +Tile 3313: +##.##.#..# +.#.#..#... +.##...##.# +.#.##..#.. +##........ +.......... +#..#.#.... +#......... +.......... +.##..#..#. + +Tile 3361: +.###.#...# +##..#.#..# +...##....# +#..##..... +.......... +#......#.# +.........# +..#..##.#. +#..#...### +#...#.#.#. + +Tile 3167: +..##..#### +#.....#.#. +.....#.#.. +...#...... +....#.#.## +...#.#.#.. +.......#.. +##........ +#..#...#.# +####.##..# + +Tile 1979: +#.#.###... +..#.....## +...#...##. +#.......## +........## +..##..#... +..#......# +#.#....#.# +#..#.....# +.##....... + +Tile 1831: +##.##.##.# +#......... +.........# +##.......# +###.....## +..##..##.. +##.....#.# +#....#...# +###.##..#. +#..#####.. + +Tile 1487: +#..#....## +.#..#....# +#....#.... +#......... +#.#...#.## +#..##...## +...##..#.. +.#...##... +.#........ +.#...#..#. + +Tile 1987: +###..#.... +##..##...# +......#..# +.#.#...#.# +.....#.#.. +....#..#.. +....###..# +#...##.... +###.....#. +...##.#### + +Tile 3083: +....##..#. +##..#.###. +#..#...##. +#.###..... +.........# +....#..... +.#........ +.#........ +#......... +#.#.#.##.# + +Tile 1543: +...##..### +.........# +.......#.# +#..#..#.## +##....#.#. +....#..#.. +#..#...... +...#...#.# +##.##..#.. +#.###..#.. + +Tile 1151: +#.#..##### +#.#..#...# +#..#...... +....#...#. +.......... +#...#.#..# +#..#.#...# +##....#..# +#......... +##.....### + +Tile 1009: +##..#...## +#....#...# +.#...#.... +#........# +.#..#..#.. +.###.##.#. +#......#.# +##.#..##.. +#....#.### +####...##. + +Tile 3929: +......#.#. +#..#.##.## +....#.#.## +#.##..#... +###..#..#. +.##..###.# +.##......# +....#....# +........#. +.#...###.. + +Tile 1321: +#.##..#... +.##.....## +#.#..#.... +...#.....# +###......# +#.#.#.##.# +##.......# +##......#. +.#...#.... +.#..##..## + +Tile 2017: +###.#..### +.#..###..# +#..#...... +.........# +..#...##.. +....#.##.# +...##.#..# +....#...## +#..#..##.. +##.#.#.#.. + +Tile 1747: +....##.#.. +#........# +.....#..#. +..#####... +######..#. +##..#.#... +.###..#..# +#.....#... +.##..#..## +..#####... + +Tile 3089: +#....#.##. +#.....#..# +.......... +#..#.#.... +.......#.. +#.....#... +........#. +##..#..##. +#.....#..# +#.#.#....# + +Tile 3019: +.#..###.## +.#...#...# +#.#....... +###....... +#....#...# +#.##...#.. +##........ +.#.......# +.#.#...... +.#..#...#. + +Tile 3079: +...#.###.. +#......#.. +#.......## +#...#..### +#.......#. +......#.#. +#........# +.#.#...### +..#.#....# +...#...#.# + +Tile 1663: +##.##..### +#.....##.# +......#.## +#........# +..#.#..... +....#..#.# +#.#.#..#.# +#.......#. +..#......# +#.#..#.... + +Tile 1823: +.###...### +#.#.#..##. +.......... +.........# +###....#.. +.......... +##....#.## +#.......## +..#..#...# +......#### + +Tile 3823: +....#..#.. +..#.#..#.# +###.#.##.# +..##....#. +#......... +#....#...# +#.......## +#.#...##.. +..#....#.. +..#....##. + +Tile 1901: +#.#.#....# +..#....#.# +...#..#.#. +.#..#..### +....####.. +......#... +#....#.... +..#....#.. +#......#.. +######.#.. + +Tile 3347: +#.#.....#. +#..#..#... +#.#....... +#..#.#.... +...#...... +#......... +##.#.....# +#........# +#....#...# +#.#.##.### + +Tile 1873: +..###.#.## +.#.#....#. +#........# +..#..#...# +##.....#.. +#........# +#......... +.#........ +#.#..#.#.# +.##.#...## + +Tile 2053: +#.#.#.#..# +#...###..# +##.##.##.# +....##.#.# +#.###....# +#.....#..# +#..##.#### +....#..#.. +#......... +#..#.#..#. + +Tile 2659: +.#....##.# +#.#......# +#..#...... +.#.###.#.# +.......... +#........# +.......#.# +....#....# +#........# +##..##.#.. + +Tile 2503: +.#..####.# +#.##...... +..#....### +..#..#.### +...##...## +..#.....#. +.......... +##.#...... +#.#....... +#...#..#.# + +Tile 3881: +##.###.### +#......#.. +#...#....# +..#.#....# +#..#..#..# +#..#.....# +...#..##.# +#.#....... +#..##....# +...#.##... + +Tile 1973: +..#.###.#. +#.##....## +#.......## +##......## +#......... +#.#..#.... +.#....###. +..#.#..#.. +......#..# +#..#.....# + +Tile 3329: +.#.#.###.# +..#.#..... +.#.......# +#..#.##.## +#.##..#### +..#.##..## +....#..... +#...#.#.#. +...#.#...# +.#...##..# + +Tile 3331: +#......### +#......#.# +#.#.#.#..# +........#. +.##.####.. +#..#..#..# +.#.......# +......#.## +......#.#. +.##...#.#. + +Tile 1307: +##.#.#..#. +.........# +.#....##.# +#......... +#......... +#....#.#.. +........## +......##.. +..#.##...# +..##...##. + +Tile 2543: +.#.#.##.## +#........# +..##...... +#......... +##...#...# +.###..##.# +.##......# +.#........ +.....#.#.. +...######. + +Tile 2003: +#.#..#.#.# +.....#.... +#.#.#..... +####.#..## +..###....# +....#.#... +#.####...# +.##...#.## +#.#.#..#.. +...#.....# + +Tile 3301: +##....##.# +.....#...# +#........# +.......... +###.##.#.. +.....#...# +#.#......# +....##...# +#........# +.#.#...#.# + +Tile 2297: +#..#.##..# +...#.#.##. +..###..#.. +##..#..... +####..#..# +..#.#..#.. +.....#...# +#...#..... +#.....#..# +##....#... + +Tile 2311: +##.....#.# +##........ +#........# +#...##.... +#......#.. +.........# +.........# +#..#.#.... +.....#...# +###.#..##. + +Tile 1361: +.#.##.#..# +#.#..#...# +#....###.. +..###.#... +#..#.....# +#..#...##. +#.#.....#. +.......#.# +##.##..... +#.###.#..# + +Tile 1481: +.####.#.## +.......... +.........# +###.#.#... +##....##.# +..#...#.## +..##.#.#.. +#.#.....## +.......#.. +....###... + +Tile 1153: +.##.##..## +###......# +#....##... +......#.#. +#....#.... +.....##..# +.....#...# +#......... +#...#....# +##..#.#... + +Tile 2153: +#.###.#..# +..#.##.... +..##....#. +##...#...# +#...#..... +........#. +#..##...#. +..#....... +#...##.#.. +#.#.#.#... + +Tile 2377: +.##..##.#. +...##..#.# +#.#.#..... +#.##...... +#.....#..# +#...#....# +...##....# +...###.... +.#.##...## +.###.##... + +Tile 3863: +.##.###.## +.......#.# +#........# +##.#.#...# +##...#...# +#...##.... +#..#..#.## +.....##### +##.#..###. +....###... + +Tile 1163: +##..###### +#........# +.#.#...### +..#..#...# +##..#...## +#.#....... +#.#..#.... +#..#.#.... +###..#...# +.#####.### + +Tile 2207: +.#..#.#.## +##.....#.# +#..#.....# +#..#....## +.........# +...#.....# +#...#..#.. +..#.....## +.....#.... +#.##.....# + +Tile 1201: +#.##.##..# +#.#....... +#..#.....# +.###...#.. +#.#......# +........## +.........# +.##....#.# +..##.#...# +.......### + +Tile 1619: +#.....#.#. +...#.##..# +#.....#... +#...#..... +#..#...#.# +#..##.#... +.#...#.#.. +#......##. +#......... +#.##...### + +Tile 3389: +...#..##.. +#........# +#...#..... +#.#....#.# +###....#.# +#.#....### +#..##..#.# +.##.#.#..# +#...###... +#...#....# + +Tile 3359: +.###..##.. +#........# +###...#.#. +........## +....#..#.# +.#.#...... +#........# +.......#.# +.#.....#.. +##.###.... diff --git a/20/main.py b/20/main.py new file mode 100644 index 0000000..3823df9 --- /dev/null +++ b/20/main.py @@ -0,0 +1,149 @@ +from dataclasses import dataclass +from typing import Iterator, Optional +from math import floor + +@dataclass +class Tile: + top: str + left: str + right: str + bottom: str + + def __repr__(self) -> str: + return "Tile" + +TilesData = dict[int, Tile] +TileGrid = list[list[Optional[tuple[int, Tile]]]] + +def parse_tile(tile_data: str) -> tuple[int, Tile]: + lines = tile_data.splitlines() + id = int(lines[0][4:-1]) + top_edge = lines[1] + right_edge = "".join(line[-1] for line in lines[1:]) + left_edge = "".join(line[0] for line in lines[1:]) + bottom_edge = lines[-1] + return id, Tile(top_edge, left_edge, right_edge, bottom_edge) + +def parse_input(filename: str) -> TilesData: + tiles = {} + with open(filename, "r") as f: + content = f.read() + for block in content.split("\n\n"): + id, tile = parse_tile(block) + tiles[id] = tile + return tiles + +def rotate_tile(tile) -> Tile: + return Tile( + top = tile.left[::-1], + right = tile.top, + bottom = tile.right[::-1], + left = tile.bottom + ) + +def flip_tile(tile) -> Tile: + return Tile( + top = tile.bottom, + right = tile.right[::-1], + bottom = tile.top, + left = tile.left[::-1] + ) + +def get_grid_size(tiles: TilesData) -> int: + return floor(len(tiles)**0.5) + +def get_rotated_tiles(tile: Tile) -> Iterator[Tile]: + yield tile + tile = rotate_tile(tile) + yield tile + tile = rotate_tile(tile) + yield tile + tile = rotate_tile(tile) + yield tile + +def get_tile_variants(tile: Tile) -> Iterator[Tile]: + for t in get_rotated_tiles(tile): + yield t + + tile = flip_tile(tile) + for t in get_rotated_tiles(tile): + yield t + +def is_tile_possible(grid: TileGrid, x: int, y: int, tile: Tile) -> bool: + if x > 0: + other_tile = grid[y][x-1] + if other_tile and other_tile[1].right != tile.left: + return False + + if x < len(grid[0])-1: + other_tile = grid[y][x+1] + if other_tile and other_tile[1].left != tile.right: + return False + + if y > 0: + other_tile = grid[y-1][x] + if other_tile and other_tile[1].bottom != tile.top: + return False + + if y < len(grid)-1: + other_tile = grid[y+1][x] + if other_tile and other_tile[1].top != tile.bottom: + return False + + return True + +def get_possible_tiles( + tiles_data: TilesData, + used_tiles: list[int], + grid: TileGrid, + x: int, + y: int + ) -> Iterator[tuple[int, Tile]]: + for id in tiles_data.keys(): + if id not in used_tiles: + for variant in get_tile_variants(tiles_data[id]): + if is_tile_possible(grid, x, y, variant): + yield id, variant + +def solve(tiles_data: TilesData, grid: TileGrid, used_tiles: list[int]=[]) -> bool: + for y in range(len(grid)): + for x in range(len(grid[0])): + if grid[y][x] == None: + for id, tile in get_possible_tiles(tiles_data, used_tiles, grid, x, y): + grid[y][x] = (id, tile) + used_tiles.append(id) + if solve(tiles_data, grid): + return True + used_tiles.pop() + grid[y][x] = None + return False + + return True + +def multiply_corners(grid: TileGrid) -> int: + w = len(grid[0]) + h = len(grid) + top_left = grid[0][0] + top_right = grid[0][w-1] + bottom_left = grid[h-1][0] + bottom_right = grid[h-1][w-1] + assert top_left + assert top_right + assert bottom_left + assert bottom_right + return top_left[0] * top_right[0] * bottom_right[0] * bottom_left[0] + +def part1(tiles: TilesData) -> int: + width = get_grid_size(tiles) + + grid: TileGrid = [] + for _ in range(width): + grid.append([None]*width) + + solve(tiles, grid) + + return multiply_corners(grid) + +if __name__ == "__main__": + tiles = parse_input("input.txt") + print("part1: ", part1(tiles)) diff --git a/20/test.txt b/20/test.txt new file mode 100644 index 0000000..b07aa4b --- /dev/null +++ b/20/test.txt @@ -0,0 +1,107 @@ +Tile 2311: +..##.#..#. +##..#..... +#...##..#. +####.#...# +##.##.###. +##...#.### +.#.#.#..## +..#....#.. +###...#.#. +..###..### + +Tile 1951: +#.##...##. +#.####...# +.....#..## +#...###### +.##.#....# +.###.##### +###.##.##. +.###....#. +..#.#..#.# +#...##.#.. + +Tile 1171: +####...##. +#..##.#..# +##.#..#.#. +.###.####. +..###.#### +.##....##. +.#...####. +#.##.####. +####..#... +.....##... + +Tile 1427: +###.##.#.. +.#..#.##.. +.#.##.#..# +#.#.#.##.# +....#...## +...##..##. +...#.##### +.#.####.#. +..#..###.# +..##.#..#. + +Tile 1489: +##.#.#.... +..##...#.. +.##..##... +..#...#... +#####...#. +#..#.#.#.# +...#.#.#.. +##.#...##. +..##.##.## +###.##.#.. + +Tile 2473: +#....####. +#..#.##... +#.##..#... +######.#.# +.#...#.#.# +.######### +.###.#..#. +########.# +##...##.#. +..###.#.#. + +Tile 2971: +..#.#....# +#...###... +#.#.###... +##.##..#.. +.#####..## +.#..####.# +#..#.#..#. +..####.### +..#.#.###. +...#.#.#.# + +Tile 2729: +...#.#.#.# +####.#.... +..#.#..... +....#..#.# +.##..##.#. +.#.####... +####.#.#.. +##.####... +##..#.##.. +#.##...##. + +Tile 3079: +#.#.#####. +.#..###### +..#....... +######.... +####.#..#. +.#...#.##. +#.#####.## +..#.###... +..#....... +..#.###...