diff --git a/input/2020/day20.txt b/input/2020/day20.txt new file mode 100644 index 0000000..f04f926 --- /dev/null +++ b/input/2020/day20.txt @@ -0,0 +1,1728 @@ +Tile 2477: +....#...#. +#..##...#. +...#.....# +..#...#.#. +#.#......# +.#.####### +..#.#...#. +.#.....#.. +#..#...... +.###.####. + +Tile 2609: +.##...#### +...#.##.## +...#...... +...#....#. +.##....#.# +.......... +....##.... +#....#..## +..######.. +.##.##.#.# + +Tile 3461: +##.##..##. +.##....#.. +...#....#. +#.#.#...#. +........#. +.#.#..#..# +..#....... +#..##..... +...#.....# +.#..####.. + +Tile 1753: +#...#####. +#...#.#..# +#.#....#.. +#.......#. +.....###.# +.......#.. +.....#.... +..##...#.# +#......#.. +#.#..##.#. + +Tile 1259: +...##...## +#.##.#.### +#.#.....#. +###..#...# +...#...... +##.#..#... +#........# +..##.####. +..##....## +....##.#.. + +Tile 3181: +.#######.# +#...#....# +#.....#..# +#.#.#...#. +.#..#..... +....#..... +#.......#. +#......... +..#..###.. +.##..#...# + +Tile 1123: +#..####.#. +#...#..... +#......... +....#.#..# +.......... +..##...#.# +#..#...... +#...#.#..# +.##.##.... +#####.#### + +Tile 2699: +....###.#. +#.#......# +#..##....# +..#.....#. +#.#......# +....#...## +.##...#.## +.......... +#.#...#... +##.#...#.# + +Tile 2897: +#.#.##..## +#....#..## +....#...#. +.......... +#..#..#..# +#......... +##.......# +##.##....# +........## +#.##.#...# + +Tile 2531: +.##....#.# +#...#..### +...#....#. +#.......## +#.......## +......#... +#.#....... +#......#.# +#..#.#...# +...#.##..# + +Tile 3917: +.#.#.#..#. +##..#....# +....#....# +#.##..#..# +#...#....# +.....#.#.# +.....#.#.# +##..#.#.## +.....#...# +.##.###.## + +Tile 1193: +#.###...## +#..##.#### +#.#......# +...###.... +.#.#..#... +##...#...# +##.......# +.......... +...#...... +##..#.#.#. + +Tile 2011: +####.#..#. +..#...#..# +#.....#... +.......... +..#.#..... +#........# +.....#...# +#........# +.........# +.###..##.. + +Tile 3209: +######.##. +......#..# +....#...## +..##..#... +...#.....# +....##...# +#.......## +..#..#.... +....#..... +.#..#.#### + +Tile 3659: +.#...##..# +........#. +#...#..... +#........# +....##...# +#..#....#. +.#..#..#.. +#....#.#.# +.........# +###.#.#..# + +Tile 3623: +.##..##... +..#.....## +#......... +.#.#.....# +...#.....# +.......##. +#.......#. +...#.#...# +#......#.# +..#####... + +Tile 3049: +####.##### +..#.....#. +.#..#...#. +.#..##...# +#........# +#.#....... +#.##...... +.#....#..# +##........ +.####..#.# + +Tile 3361: +....#.#..# +...#...### +#....#...# +#....##..# +###.#.##.# +...#.#...# +##.#...... +#....##..# +.#.....### +.##.#..... + +Tile 2861: +.#.##.#..# +#..#...#.. +....#....# +..#.....## +...#.....# +#..##..... +##.......# +.....#...# +.#..#..#.. +..#.#.#.#. + +Tile 3797: +.......##. +#....#.... +#..#...#.. +#..#..###. +#.#...#..# +.#...#...# +...##..... +.#.....#.. +..#.....#. +#.##.##..# + +Tile 3593: +.#.....### +..##....#. +..##..#... +#...#...## +.#.....#.# +#.#...#..# +#....#...# +#.....#..# +###..#.### +.##..##.#. + +Tile 2161: +.#.##....# +#....#.... +....#....# +####...##. +#..#..##.# +#......... +..#.#...## +#.....#..# +.........# +#.###.#... + +Tile 3769: +#..###.... +##........ +#.#....#.. +....#..... +#..##.#... +#....#.#.. +#........# +......#.#. +##.....#.# +.#....#..# + +Tile 3467: +..#.#.#### +##.......# +.##..#.... +...###...# +.##.###..# +....###..# +.....#.... +##.......# +#....##... +#.#..#..#. + +Tile 2503: +#..###.### +.#.....#.# +#......#.# +...#.##... +###.#....# +....#....# +#.#...##.. +#.......#. +#.#.#....# +....###### + +Tile 3389: +#..###..## +.......... +.......##. +.......... +.......... +.......... +#.....###. +.........# +##.#.##..# +.##.##.#.. + +Tile 3919: +..#..#.#.. +##....##.# +##..#...#. +#.......## +#.#.#.#... +##..#.#..# +......##.# +...###...# +#...#..... +..#.#.#... + +Tile 2663: +#.#...#### +.......#.# +.#.....#.. +#.....#.## +.#..#..... +..##..#..# +#......##. +...#...#.. +#.##...#.# +...##..... + +Tile 3253: +.#####..#. +.......#.# +#..#...##. +....#..... +.........# +...#.#.... +##........ +........#. +#....#...# +.####.##.# + +Tile 3329: +......#### +.......#.# +..##...... +#....#...# +.....##... +.....#..## +.....#.... +.#.#.#.... +.#.......# +#.##...... + +Tile 2393: +.#...#...# +....#..... +....#...## +#.#..##.#. +...#.#...# +.....#..#. +.##..##..# +##..#..#.. +.#........ +.##.#.#.#. + +Tile 2339: +##....##.# +..#......# +##.....##. +.........# +...##....# +#....#.##. +#.#.....## +.#..#.##.. +##.###..#. +######..#. + +Tile 1097: +###.##.#.# +.#.#.....# +...#.#.... +##...##... +.#....##.. +#....##.## +....##.... +#.#......# +#.#..#...# +#.####.... + +Tile 2423: +#....#.#.. +#.....#... +#......... +#...#..... +..###.#..# +#...##.... +#......... +#..#.....# +...#..#... +#..##.#... + +Tile 3067: +.#####.#.# +###..#.#.. +.......... +#........# +..##.....# +#......#.. +.#..#.#... +##...#..## +....#..... +...#.##.## + +Tile 3541: +#.#.##.### +.......... +..#.#...## +#..##.#..# +.........# +#.....#... +#..#...... +#.##...... +.#...#.#.# +.#####..## + +Tile 3559: +##.#.#.#.. +#....#..#. +##...#.... +.....#..## +#......... +..#...#... +.#...#...# +#...#..#.. +....#....# +.....###.# + +Tile 2797: +.....#..## +#.#....#.. +##...#.... +#......... +...#...... +...#...#.. +#.......#. +.......... +....#....# +#......### + +Tile 2803: +##....#.## +..#....... +.###.#.... +#.#.#..... +.........# +#..#...##. +#.#.##..#. +.##...##.# +#.#......# +.###.#.#.. + +Tile 2297: +.#.#.##.#. +#.##.....# +#.##....#. +.......#.# +#..#...... +.##.#..#.. +.......... +..#.##..## +#.......## +.###.##.#. + +Tile 3511: +...#.#.... +#.....#..# +.......#.. +..##.#.##. +#.#....#.. +#.#.#.#... +.#........ +#.#.....## +.#....#..# +####..#.#. + +Tile 2083: +#####..... +##..#.#..# +....#....# +...#...... +##....##.# +#....#.#.. +##.....##. +.......#.# +##........ +###..##.## + +Tile 1567: +####.###.# +....#....# +.#..##.#.. +#........# +...#.#...# +#.#..##.## +##...#.... +##........ +#........# +#...#.#..# + +Tile 2767: +..###.##.. +#..#..#..# +.###.....# +#..#...... +......#### +....#..#.. +#.....##.# +#.#...#..# +.#....##.. +.#..####.. + +Tile 2081: +.#.##.#### +#...#.#... +#...#.##.. +..#.....## +...##....# +...#...... +...#.#.... +.......... +.......... +.####..### + +Tile 1697: +...#...### +#..#..#... +.....#..#. +#........# +#..#...... +#.......#. +#....#.... +#...#.##.. +#....#..## +#.##..#... + +Tile 3433: +.###...##. +#........# +.#...###.# +##.......# +.......#.# +.....##.#. +#..#..#... +.......#.. +.....###.. +.....#.#.# + +Tile 1543: +#.###.##.. +.#...#.... +##.....### +#..####.#. +#...#..... +.#......## +#......... +....#.#.## +##.......# +.#........ + +Tile 2389: +#....##### +.##......# +###.#....# +..#....... +...#.#...# +.......#.# +#....#.... +...#...#.. +#.#....... +.##..###.# + +Tile 2347: +#....##..# +#......### +........#. +.#...#.#.. +#........# +.....##... +#........# +#.....#... +##....#..# +##...#.### + +Tile 1877: +.#.#.##.#. +#..##...## +#...#...## +##.#...... +........## +....#.#..# +#..##..... +....#...## +#.#.#.#..# +.#..#..#.# + +Tile 2927: +.#.#...### +#...#..... +..#....... +##...#...# +#..#...#.# +.......... +#.#..##... +#.#....... +.....#...# +......###. + +Tile 1483: +..#.#...#. +###.##.... +#..##..... +.#...##..# +...#.##.## +#.#..#.#.# +..#..#.... +#..#...... +#........# +....##.##. + +Tile 1493: +#.#....##. +..#....#.. +.......... +.....#...# +.....##..# +...#..#..# +.........# +#.#.#....# +.#.....#.# +..###...#. + +Tile 2621: +#..##.#..# +..##.#...# +.......... +#......#.. +.###..#... +###.#....# +##..#....# +##..#....# +.........# +##.#...... + +Tile 3167: +..#.###..# +###.#....# +#........# +..##...... +###.#..#.. +##...#...# +.......... +##.#...#.# +.###.....# +####.##... + +Tile 3701: +.#.#...##. +......#... +#......... +......#..# +....#....# +....#.#..# +#..##....# +#.....#..# +#...###..# +..##.#.... + +Tile 1663: +##.#..##.. +#.....#... +....###... +#....##..# +....#...#. +#..####..# +...##..... +.##..#.... +#.#....#.. +#..##.#.## + +Tile 1879: +.#....#... +....###.#. +#....#...# +#..##..... +#......#.# +.....#.... +#......... +.........# +.#........ +##.#...#.# + +Tile 1021: +..#....... +.#......## +.##...#... +.##....... +##.#...#.# +#..#.....# +.#........ +...###...# +###....... +....#..### + +Tile 3767: +..#.#....# +.....#.#.. +..#..#.... +##..##.... +.#.......# +...#...... +......##.# +#.......## +#........# +.######.## + +Tile 1847: +....####.# +##.#...#.. +##.#.##..# +..####...# +#........# +#......... +#...#....# +##.#.#..## +..##.....# +##.##..#.. + +Tile 3691: +#.##..#... +...#....#. +#...#..... +.....#.... +......#.#. +.#........ +.#........ +.........# +.......... +#.....##.# + +Tile 2351: +###..###.# +#....##... +#......#.. +###......# +#...##.### +##...##..# +..#....... +.#....##.. +...#...... +.###.##.## + +Tile 2753: +#.####..#. +#.......#. +..#.#..... +.....#.... +#..#..#... +#......#.. +..#...#### +#.......## +....#...#. +....#.#..# + +Tile 2141: +....##...# +..#..#.... +.......... +.......... +###....#.. +...##.#... +##.#.....# +.#....#..# +#.#....#.. +.######### + +Tile 1901: +.....#.#.# +#......#.. +#...#...#. +...#....## +#..#.#.... +........#. +.......#.# +#.....##.. +#...#.#.## +.#....##.# + +Tile 3137: +.##...#... +.#.....### +#.#.#..#.# +#.###.#... +#..##...#. +.........# +#.#..###.# +#......#.# +#......#.. +.#..#.#... + +Tile 3407: +.#.###.### +...#...... +..#.##.... +.#.....#.. +....#.#..# +...#...#.. +....#..#.. +##...#.... +.#....###. +##.###.##. + +Tile 1013: +##.#.###.. +#...#.##.# +#........# +#..#.....# +.......... +.........# +...#...... +.#.....#.# +.......#.. +.#...####. + +Tile 1049: +...#....## +#......... +#.....#..# +#..#....## +.##...#... +......#..# +##..#.#... +#.##....## +....#....# +#####.#.#. + +Tile 2549: +#.#..###.# +#..#...... +...#....#. +.....#...# +#.##.....# +###..#.#.. +...##..... +##...#.... +#......#.. +..##.####. + +Tile 2843: +.##.###... +....#....# +#.......## +#........# +.......#.# +#.......## +#.#..#...# +#...#..... +#...#....# +.....###.. + +Tile 1889: +##.##..#.. +...#....## +#........# +#......#.. +##..#.#.## +......#... +..#....... +..#......# +#.#..#.... +..#......# + +Tile 2887: +.####.##.# +#..#...... +#......... +#....#.... +#....#...# +.....#...# +#.#.#.##.# +.#........ +##.#.#.... +...#.#.##. + +Tile 1579: +..######.# +.......... +#.##..#... +####..#..# +#........# +...##....# +..#....... +.......... +.......... +....#....# + +Tile 3079: +##.#....#. +###.....## +...##...## +#....#..#. +....###... +...####... +...#.#.... +.#.#.#..## +.....#..#. +##...#..#. + +Tile 1297: +.####.###. +##...#...# +.....#..#. +#...#..... +###......# +.#..#....# +#....#..## +.##...#... +#....#.... +###.####.# + +Tile 1783: +...#.#.#.. +#...#..... +..#..#...# +......##.. +###..#.##. +.#...###.. +#......... +#........# +..#......# +..#..##.#. + +Tile 1609: +.#.##..#.# +.#.#....#. +#.##...... +..#......# +.##.#.#.## +..#....... +###......# +...#...#.# +...###.... +..#.....#. + +Tile 3793: +##.#.##.#. +...#...... +..##....#. +#...#...## +.......#.# +.....#.#.. +....#....# +#.##.....# +#..#.##..# +###.##..#. + +Tile 1069: +..#.#...#. +..#.#....# +##..#.#..# +.....#.... +.....##.#. +.#.##.#... +#.......## +##........ +....#.#..# +.#..###.## + +Tile 1229: +..#.#####. +.......#.. +....#.#.## +.#........ +#...#..##. +##....#.#. +#........# +.......... +.......#.. +##.##....# + +Tile 1163: +....#.#.#. +#..#.#...# +.........# +#........# +#....#.... +..#.#....# +#...#....# +#....##... +#..#...... +#..##.#.## + +Tile 3847: +#...#.#### +.........# +......#... +#..#..#.## +.....##... +#........# +#...#....# +#.#....#.# +#...#....# +#....##### + +Tile 3823: +#..##..... +..#..#.#.. +#......... +#.#.##.... +#....#...# +#..#...... +#...#..... +.......... +.......... +...#..#..# + +Tile 3583: +#...#.###. +##......## +.#........ +..#....... +....##..#. +.........# +##........ +###.#...#. +.#........ +#.#..####. + +Tile 2399: +#..##..#.. +##......#. +#.#.#.#... +...##.#..# +......#..# +#.#.###... +.#.....#.# +###..#.... +.#.#..#..# +###..##... + +Tile 3347: +.#.#....#. +..#.#....# +.......... +#.##.#.#.# +....#..... +.#....#... +#........# +#....#...# +#..####..# +..#####.#. + +Tile 1307: +#...#...#. +....#....# +.#.......# +.......#.. +#.#.#...## +#..#.#.#.# +##.#.#.##. +....##.... +#.....#.## +.#..#...#. + +Tile 2099: +.##...#### +...#.##.## +.....##... +#...#.#... +.#......#. +#........# +...#..#### +....##..#. +.....#.... +..#.###... + +Tile 3109: +#..#.###.# +....#.#.## +....##..## +#.#...#... +#.......#. +#..#...... +.#.....#.# +#.##....#. +..#....... +....##..#. + +Tile 1787: +#...#...## +#......... +###....... +...#..##.. +#.#.##.... +##....#..# +##........ +#..##.##.# +..#....### +....#..#.# + +Tile 3019: +#.##...#.# +#...##...# +...#..#.#. +......##.# +.#..####.. +#.#.....#. +#......#.. +#......... +.......... +...###...# + +Tile 2857: +.#...##.#. +#.....#..# +#.....##.. +#......#.# +...#..#... +...#.....# +#...###..# +.....##..# +...#...#.. +##.#....## + +Tile 3083: +#..##..##. +.#....#.## +#..#....## +.......... +#...#..#.# +.........# +.#........ +##.......# +.......... +.##...##.. + +Tile 1583: +#.###..... +....##.#.. +.......... +#.....#.## +#........# +##........ +#......#.. +.........# +#.#.#..... +.#.####... + +Tile 2693: +...####.#. +.........# +#......... +....#.##.# +#.......#. +.........# +...#...... +.......#.# +..#.#....# +.#..#..#.. + +Tile 1019: +.#.#...... +#......#.# +.#...#.#.# +#.#....... +......#.#. +#........# +##..#..#.# +#.#####.#. +.....#...# +.......### + +Tile 1031: +#..#...... +.........# +#.....#..# +....#.#.#. +..#......# +#...#....# +...#..##.. +.#..#...#. +.......##. +.#.#..#... + +Tile 3119: +...#.#..## +#.##...... +....#.#.## +##..#.#..# +........#. +#...#.#... +...#.....# +..##....## +#..#...#.# +###...#.#. + +Tile 1811: +.####..### +#......#.# +#......... +.......#.. +..#.##...# +........## +#....#.... +#..#.#.#.# +#..#...#.. +..####.### + +Tile 2473: +.#....#### +##.....#.. +....#..### +#..#....#. +###...##.. +.......... +...#.#...# +........## +##......## +....#..... + +Tile 1373: +..#..#.... +#...####.# +....#....# +....###... +...#.##.#. +#..#.#...# +...#..#..# +#..#.#...# +##.###.... +.#.#####.. + +Tile 3803: +#...##.#.# +#.#..#..#. +.........# +..#......# +.#.#..#..# +.......... +##..#.###. +..#####.## +....##...# +.#.##.##.. + +Tile 1291: +#..#.....# +#..#..##.# +#.#......# +....#...#. +##.######. +#........# +#....#.... +#.....#... +#####..... +#######.#. + +Tile 1489: +#...#...## +#..#....#. +....##.... +....#..... +#........# +#.#......# +##......## +#.#.#..... +.....#.#.# +#.#.###.## + +Tile 2633: +.#..##.#.. +..#.#...## +#......... +#..#...... +#..#.....# +#......... +#....#..## +#.###..... +#.##.#..#. +...#..###. + +Tile 2441: +#.#..###.. +...#.....# +#...##...# +#.##...#.. +#.....#### +#..#....#. +...#...... +#......... +#.#....... +....###.#. + +Tile 2689: +##..#..... +.#........ +.......... +#.#....... +....#...## +.......... +#.....#... +#...#..... +#.....#... +####...#.. + +Tile 1559: +#..###..#. +#.......## +......#... +.##..###.. +#..#..##.# +..#...##.# +#......... +#..#.#...# +##.....### +.#.....#.. + +Tile 1973: +.###...... +#......#.# +.#........ +...#.....# +..#....#.. +....##.... +.......... +......#..# +.....#.... +#..#.#...# + +Tile 2113: +#.##.#.#.# +..#..##... +#...#.#... +.#.#...... +.#..###..# +........#. +#........# +#.#.#..#.. +.......... +##.##...#. + +Tile 2903: +..#...##.# +#...#..... +#..###.### +...#.#...# +#...#...## +#..#..#..# +#........# +##.###...# +#.#..#...# +.#....#... + +Tile 2003: +.##.#..#.. +...##...## +.#.....#.# +##..##...# +...#.#.#.# +.........# +#...#.##.. +.....##..# +#.#..#.... +###...##.# + +Tile 2273: +...##.#... +.##....##. +#......##. +#.......## +....##...# +......#... +..#.#..... +.#.#..##.# +#........# +..#.#..#.. + +Tile 2111: +#.#..#..## +#...##...# +.......... +###.....## +##......#. +.......... +#....##### +#...#.#.#. +....#..#.# +#...#.###. + +Tile 2203: +.#####.##. +#...##...# +#..#...#.. +#.###...## +#....##.## +#....#..## +....#..... +...#....## +#.#...#... +#.#.#..### + +Tile 2153: +#.###..#.. +.......... +...#.....# +..###..##. +...#.....# +....#....# +#...#....# +#......... +#..##...#. +###.##..#. + +Tile 2963: +.#.#.####. +#....#.... +.........# +#........# +#..#.....# +#.#......# +......#.## +.....#.... +#...###... +.####..##. + +Tile 3491: +...##.#### +#.#.....## +.#..#..##. +#........# +.#...#...# +....#...#. +#.#......# +.........# +....#...#. +##.##..#.# + +Tile 2087: +#.#......# +#..##..#.. +#..#...... +#...##...# +#......#.# +#.#...#... +......#..# +#...#....# +#....#.... +##.#..#..# + +Tile 2063: +..##...##. +....#....# +#..#...#.# +#........# +##......## +..#..##..# +......#.#. +#.#....... +..##.#.... +.#######.. + +Tile 3851: +.#........ +#.#.....#. +.........# +......#... +.#....#..# +...##..... +#........# +#.......#. +#.#......# +##.####..# + +Tile 1117: +##.......# +..#......# +##.......# +##........ +...####.#. +..##.##..# +...#....#. +##.#...... +.........# +.#.##....# + +Tile 3967: +...#.##... +#..#..##.# +#.....##.# +#......#.# +#.......#. +##........ +#..#.#.#.. +....#.#.## +.#.#..#... +###.##.##. + +Tile 2879: +###..#..## +.....#.#.. +...##..... +#.###.#..# +.........# +.#.#.....# +#.#.##.... +#..##....# +##.......# +#.##.##### + +Tile 2851: +###..#.##. +.###...##. +...##.#.#. +#........# +#........# +.#.#...... +##.#...... +..###..... +.#...#..#. +#.####..#. + +Tile 3529: +.#.#.##### +.......... +...#..#..# +...#.....# +#.#......# +#....####. +.....#...# +#.##...... +.#...#...# +#.#..###.# + +Tile 3307: +#.#..###.. +....#..### +#.##....## +#..#.##.#. +#.#...##.# +.#....#... +...#.#...# +...#...#.# +##......#. +...#...... + +Tile 3739: +#.###.#... +.#.#..##.# +..#..#..## +#...##...# +#...#..#.. +.........# +.....#...# +##....#... +.#......## +...#..#..# + +Tile 2617: +##.###.#.. +..#......# +..#....#.. +.#....#... +.#..#..... +...#..##.. +...#.....# +#.......#. +#.#..#...# +..###..#.. + +Tile 2053: +.#....#.## +#...#..... +.........# +#........# +...#..##.. +###..#.### +........#. +.....##### +##....#... +.###.##..# + +Tile 2447: +.#.....##. +......##.# +#......#.. +.#......#. +.#.##.#..# +#.#....### +#.#......# +##........ +.#.......# +#.#.#....# + +Tile 1999: +.#...###.. +#...#..#.. +#.#....... +...#....## +#.#....... +##...###.. +#......#.. +...###.#.. +####...##. +.....#..#. + +Tile 1009: +...#####.# +....##...# +...#.#.... +#..#.#.#.# +#...##.... +........## +#.....#..# +.#..##.#.# +#..#...#.. +...#.#..## + +Tile 2267: +.#.#..##.. +.#.......# +#........# +.#.......# +#..#...#.# +#..#..#..# +.####..... +..#......# +##.....#.. +##...####. + +Tile 2131: +###.#..##. +.#....#... +...##.#### +..#.#..#.. +#.#....#.# +...###.#.. +#.....#..# +..#...#### +##.#..#..# +#..###..## + +Tile 2251: +###....... +....#.#..# +.....#.... +...#..#... +.........# +##..#..... +##.......# +.#.....#.# +#.#.....#. +#...#..... + +Tile 1109: +..##....#. +.#...#..## +#......... +#..##....# +...#...#.. +#.##...... +.#...#.#.. +...#..##.. +.#...##... +.##.###.#. + +Tile 3343: +..###.#.## +#....#.### +....#....# +.........# +..##....#. +#.....##.. +#..#...... +.........# +.###...#.. +.#..###### + +Tile 2383: +.#.####.## +#.....#..# +#......#.# +##.....##. +#......### +....#...#. +....#...#. +##....#..# +##..###..# +.####.#... + +Tile 2281: +..#...##.. +#..#...#.# +.#........ +.#.#....## +..##.#.#.. +..#...#... +###.#..#.# +#...##.#.# +...##.#..# +#..#.....# + +Tile 3191: +.###.###.# +..#....... +.##....### +...#..#... +..#......# +#...#..... +#........# +#....#..## +#.#.#...#. +#.......#. + diff --git a/src/day16.rs b/src/day16.rs index 82497cf..1cad2ff 100644 --- a/src/day16.rs +++ b/src/day16.rs @@ -1,6 +1,6 @@ +use crate::split_once; use aoc_runner_derive::aoc; use std::ops::RangeInclusive; -use crate::split_once; struct Rule<'a> { name: &'a str, diff --git a/src/day20.rs b/src/day20.rs new file mode 100644 index 0000000..cbbd3fc --- /dev/null +++ b/src/day20.rs @@ -0,0 +1,220 @@ +use crate::split_once; +use aoc_runner_derive::aoc; +use std::collections::HashMap; + +#[derive(Debug)] +struct Tile { + id: usize, + data: [bool; 100], +} +impl Tile { + fn parse(input: &str) -> Option { + let (id_line, input_data) = split_once(input, ":\n")?; + let (_, id) = split_once(id_line, " ")?; + let mut data = [false; 100]; + for idx in input_data + .as_bytes() + .iter() + .cloned() + .filter(|&b| b != b'\n') + .enumerate() + .filter_map(|(idx, b)| if b == b'#' { Some(idx) } else { None }) + { + data[idx] = true; + } + Some(Tile { + id: id.parse().ok()?, + data, + }) + } + + fn sides(&self) -> Vec { + let top = self.data[0..10] + .iter() + .cloned() + .enumerate() + .filter(|&(_, b)| b) + .fold(0u16, |accum, (idx, _)| accum | (1 << idx)); + let bottom = self.data[90..100] + .iter() + .cloned() + .enumerate() + .filter(|&(_, b)| b) + .fold(0u16, |accum, (idx, _)| accum | (1 << idx)); + + let left = self + .data + .iter() + .step_by(10) + .cloned() + .enumerate() + .filter(|&(_, b)| b) + .fold(0u16, |accum, (idx, _)| accum | (1 << idx)); + + let right = self + .data + .iter() + .skip(9) + .step_by(10) + .cloned() + .enumerate() + .filter(|&(_, b)| b) + .fold(0u16, |accum, (idx, _)| accum | (1 << idx)); + + // Put the id's in a consistent order. + fn consistent_id(id: u16) -> u16 { + let reversed = id.reverse_bits() >> 6; + if id < reversed { + reversed + } else { + id + } + } + vec![ + consistent_id(top), + consistent_id(right), + consistent_id(bottom), + consistent_id(left), + ] + } +} + +const EXAMPLE: &str = "Tile 2311: +..##.#..#. +##..#..... +#...##..#. +####.#...# +##.##.###. +##...#.### +.#.#.#..## +..#....#.. +###...#.#. +..###..### + +Tile 1951: +#.##...##. +#.####...# +.....#..## +#...###### +.##.#....# +.###.##### +###.##.##. +.###....#. +..#.#..#.# +#...##.#.. + +Tile 1171: +####...##. +#..##.#..# +##.#..#.#. +.###.####. +..###.#### +.##....##. +.#...####. +#.##.####. +####..#... +.....##... + +Tile 1427: +###.##.#.. +.#..#.##.. +.#.##.#..# +#.#.#.##.# +....#...## +...##..##. +...#.##### +.#.####.#. +..#..###.# +..##.#..#. + +Tile 1489: +##.#.#.... +..##...#.. +.##..##... +..#...#... +#####...#. +#..#.#.#.# +...#.#.#.. +##.#...##. +..##.##.## +###.##.#.. + +Tile 2473: +#....####. +#..#.##... +#.##..#... +######.#.# +.#...#.#.# +.######### +.###.#..#. +########.# +##...##.#. +..###.#.#. + +Tile 2971: +..#.#....# +#...###... +#.#.###... +##.##..#.. +.#####..## +.#..####.# +#..#.#..#. +..####.### +..#.#.###. +...#.#.#.# + +Tile 2729: +...#.#.#.# +####.#.... +..#.#..... +....#..#.# +.##..##.#. +.#.####... +####.#.#.. +##.####... +##..#.##.. +#.##...##. + +Tile 3079: +#.#.#####. +.#..###### +..#....... +######.... +####.#..#. +.#...#.##. +#.#####.## +..#.###... +..#....... +..#.###... +"; + +#[aoc(day20, part1)] +fn solve_d20_p1(input: &str) -> usize { + let tiles: Vec<_> = input + .split("\n\n") + .map(|i| Tile::parse(i).unwrap()) + .collect(); + let mut side_to_tile: HashMap<_, Vec<_>> = HashMap::new(); + for tile in &tiles { + for side in tile.sides() { + side_to_tile.entry(side).or_default().push(tile.id); + } + } + tiles + .iter() + .filter_map(|tile| { + let num_unique_sides = tile.sides().iter().fold(0, |accum, side| { + if side_to_tile.get(&side).unwrap().len() == 1 { + accum + 1 + } else { + accum + } + }); + if num_unique_sides == 2 { + Some(tile.id) + } else { + None + } + }) + .product() +} diff --git a/src/lib.rs b/src/lib.rs index a475345..335dab8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,6 +10,7 @@ pub mod day17; pub mod day18; pub mod day19; pub mod day2; +pub mod day20; pub mod day3; pub mod day4; pub mod day5; @@ -23,4 +24,4 @@ aoc_runner_derive::aoc_lib! { year = 2020 } fn split_once<'a>(input: &'a str, delimeter: &str) -> Option<(&'a str, &'a str)> { let idx = input.find(delimeter)?; Some((&input[..idx], &input[idx + delimeter.len()..])) -} \ No newline at end of file +}