diff --git a/2020/inputs/20.txt b/2020/inputs/20.txt new file mode 100644 index 0000000..e93c317 --- /dev/null +++ b/2020/inputs/20.txt @@ -0,0 +1,1728 @@ +Tile 2129: +.#.#..##.. +..#..#.... +.......... +...###..#. +..#....... +#...#...## +#...#..... +#...#.#... +##.......# +.#..###..# + +Tile 2861: +##..##.### +#..#...... +.#...#.... +#.#....#.. +....#.#... +.#......## +#.#..#.#.# +........#. +#......... +..#..###.# + +Tile 1789: +#...##..## +...#.##... +#.....#... +....#..... +.#...#.... +.....#..## +....#..#.# +.....##..# +.........# +##.#...##. + +Tile 2371: +..##.##..# +..#.##.... +.......... +#..##..#.. +....##.#.. +....#...#. +...#.##... +...##....# +#..#.#.... +##.#.##..# + +Tile 3613: +#######..# +#........# +.#......## +#...#..... +...##....# +#.#..#..#. +##.......# +#.#.#..#.# +.##..#..#. +##..###### + +Tile 1697: +.##..##### +........#. +..##...... +....#.#..# +#...#.#..# +#..##..#.# +#......#.# +..#......# +#..#.....# +.#.#.#.#.. + +Tile 1607: +#.#...#..# +#.#.##...# +.#..#..... +##........ +#......... +.....#.### +...#...#.# +#......#.# +........#. +##.#.####. + +Tile 1657: +#.#.#....# +..####...# +##........ +.#.....#.. +#..#...... +##.##...#. +.##..#..## +#.#.##...# +#....##... +...#...#.. + +Tile 1249: +.#.#...... +.#.......# +#..#....## +#..###.#.# +##.....#.. +.##......# +.......... +.##...##.. +..#....#.# +.#..####.# + +Tile 1223: +#....#..#. +..#....#.# +..#.#..#.# +#.#.....#. +#........# +#....#..#. +#.....#... +#......... +####...... +#...###.## + +Tile 1373: +.....##.## +#..#....## +#......... +##...#.... +.#.......# +...##..... +..#......# +#.......#. +.......... +##.##.#.#. + +Tile 1109: +.#.###.... +#........# +#.#..#...# +.........# +#........# +.#..#....# +#.##...... +....#.##.# +...###..#. +...#.##.## + +Tile 3607: +##.#...### +#.......#. +.#.##.#... +....##..#. +..#...#..# +.....#..## +.....###.. +##..#.#... +.##....... +.#...###.. + +Tile 2309: +.##.#...## +..#..#...# +##...#.#.. +#........# +#........# +.#..#..... +.....#.#.. +#...#....# +........## +##...##.## + +Tile 3041: +.#..#.#### +#.#.....## +..#....#.# +#.......## +#......#.# +.#.......# +##...#.... +##..#...## +##...#...# +..#.##.... + +Tile 1427: +.##..###.. +.....###.# +#......... +.........# +#.#..##..# +###..##.#. +##....##.. +#........# +....#....# +####..##.# + +Tile 3461: +.#.####... +.......... +.......#.# +........#. +#......... +..#......# +#....#...# +.#.......# +......#... +..###..... + +Tile 1327: +#..#####.. +#....#.... +#..#...... +....##..## +.......#.# +##....#... +###....... +........#. +..##.....# +..#..#.#.. + +Tile 1289: +.#.##..##. +#..#...... +.......#.# +...#.#.... +#.##...#.# +##..#...## +##.......# +...#....#. +####..#... +#...#.###. + +Tile 2857: +##.#####.# +.........# +.#.##..#.. +###..#.... +##....#... +...#.#.#.# +#.......#. +##.##....# +#...##.##. +###.##..## + +Tile 3823: +#......... +..#....... +...#...... +#......... +#...##.#.# +..##.#.... +..##.....# +.#..#.#... +#...#....# +.###...#.. + +Tile 3557: +.##.#.##.# +#..#.#..## +....###.## +##...#..#. +#...#.#..# +#...###..# +#...#..#.. +.##.#..#.. +###..#.... +##..##..#. + +Tile 2713: +...##.###. +#......... +.........# +..##...#.. +.....#...# +.......##. +...#...... +#.#....#.. +#.#....... +.#....###. + +Tile 1213: +.##..#.##. +#.#....... +........#. +.....##... +....#....# +#....#.### +...##....# +#.#...#..# +#...##...# +.###..##.. + +Tile 2341: +.#######.. +..#....##. +####...#.. +.###.....# +#....#..#. +...#...##. +....##...# +#........# +#..#.....# +.#.#..##.. + +Tile 3467: +....#..##. +....##.#.# +....##...# +##..###... +...#...... +#......#.. +#.....#..# +....###..# +#....#.... +..#.#.#.#. + +Tile 1583: +.#.#.#.#.# +.#.#...... +#...#..... +...###.#.# +##........ +#..#...#.# +#...#....# +....#..... +#....##... +##..###### + +Tile 1087: +###.#.#..# +#.#....... +#.#......# +##........ +.#.#...#.# +#........# +#.#......# +#......##. +.....#.... +.##.#.#.## + +Tile 3691: +###.#..... +#.#..#...# +.....##..# +#..#.##... +#........# +#.##.....# +.##.#....# +#........# +##......#. +#.##.###.. + +Tile 3881: +#.#..##... +#..#.....# +..#.#....# +###......# +#..##....# +....#..#.# +##....#.#. +.#.#....## +###....... +#...##.##. + +Tile 1033: +...#.##..# +#.##...#.. +......#.#. +..####.... +....#..#.. +#........# +..#..#...# +...#...... +##...#.#.# +##.##.#### + +Tile 3361: +..##.#.... +.........# +..##...... +....##...# +##....#..# +...#....#. +.##......# +###......# +..#..#...# +.....##..# + +Tile 1459: +#.#.##..#. +........#. +...#...#.. +.#........ +..#.#....# +#...###..# +#.#..##..# +#..#.#...# +...##..... +##.#...##. + +Tile 3833: +.#..####.# +..#.#....# +###.####.# +..#..#..## +#......... +#.......#. +.......... +......#.#. +#....#.... +##......#. + +Tile 3779: +..###...## +......#... +.....###.. +####.....# +.......#.# +....#.#... +....##.#.. +#...#....# +#...#....# +.#..#..... + +Tile 2333: +...###.### +#..#...... +.........# +#.#......# +#..#..#.#. +###....### +#.#....... +#.....#..# +.......#.# +.#..#...## + +Tile 2099: +#..##.#..# +#......... +#........# +..#......# +#......... +#..##.##.# +#..##...#. +...###.... +....#.#..# +.....#.##. + +Tile 1801: +####.###.# +#..#.....# +#......#.# +.......... +.....#..#. +..#...#... +.........# +#...#..... +.#.....#.# +#....##.#. + +Tile 2237: +##..##.#.. +..#.#..#.. +...#..#..# +.....#...# +..#....#.# +...##.##.. +#......#.. +......#### +......###. +.#.##.###. + +Tile 2357: +...#.###.# +#..#.#...# +#..#..#... +##......#. +.......... +#..##....# +..#..##... +#....#...# +#....#.... +.#..#..##. + +Tile 1597: +..#.###..# +...#...... +#...#..... +...#.#.#.. +#....#.... +#....#.... +.....#.#.. +#..#..#.#. +#....#...# +.#...##.## + +Tile 3229: +#.......## +#......... +#...###..# +..#.#..... +.......... +.#.#.....# +#.#..#.### +.......#.. +#...#....# +..#.##.### + +Tile 2609: +...#.#.##. +..##...... +#.#......# +#....#.#.# +#...#.#... +..##...##. +#..#...#.. +.#.#.#..## +#.##.....# +...###.... + +Tile 2719: +#..#.#.### +##.#....#. +......##.# +.##.#..... +.##...##.# +###...#... +.........# +.......... +....##.... +######.##. + +Tile 3407: +..#.###### +.........# +#......#.# +#........# +#......... +#.#......# +#.....#..# +.........# +.#.#...... +..###.###. + +Tile 1063: +.####.###. +#..#.....# +#..#...#.# +.........# +#......#.. +#......... +..#..#...# +.#..#.#..# +...#.##... +#.##.....# + +Tile 2111: +.#.####### +..##...#.. +.#.#...... +...##..... +##.......# +.##...#..# +#........# +#.#.#.#... +#......... +#.#..####. + +Tile 1499: +..#..###.# +.#.....#.# +.........# +##....#.#. +..#.##..## +##.#..#..# +....##.... +........#. +#......... +.###.##.## + +Tile 1283: +#...##..#. +......#.## +.....##... +..#....#.. +......#..# +#........# +....#....# +##........ +.#......## +.#..##.#.. + +Tile 3499: +...#.#.#.# +..#......# +#...##...# +#...#....# +...###.#.# +.#.#..#..# +#.....##.. +..#.#..#.# +.#.##..#.. +##....#... + +Tile 2251: +##.##..... +###..#...# +#.....#... +....#..#.. +#..#..#... +........#. +......#... +#.#.#....# +#....#.... +#.##.#...# + +Tile 2819: +..#...#..# +.#.#.##... +.#..##.... +##...#.#.. +##.......# +........#. +#..#..#... +.#...#.#.# +......#... +...###...# + +Tile 2711: +.......#.# +#..#.##..# +....#.#... +.......... +.......... +#....#.... +#..##....# +#....#.... +#......... +.######### + +Tile 2423: +#....####. +....#.#..# +....#.#### +..#.....## +##.......# +##..#.#..# +...#.....# +#.....#... +.##...#..# +#.##.#.... + +Tile 3907: +..#..#.#.. +##.......# +....##.... +#....##..# +.......#.. +#....#.#.. +##.......# +###....##. +#....#..#. +#..##.#... + +Tile 3929: +##.##.###. +...#..#.## +....#..... +#.#..#...# +.#......## +.....#.... +....#..##. +.#........ +..##.....# +.#..#..... + +Tile 1879: +..#.###..# +##...#.#.. +#........# +##.......# +#........# +....#...#. +#.......## +#..##....# +........## +##.###.### + +Tile 1951: +#...###.#. +#..###...# +#......#.. +#.#.....#. +#.##.....# +...###.... +.#.#....#. +.........# +.#.#...... +.##.#.#..# + +Tile 2503: +#.#..##... +#.....##.# +#......... +..###...#. +#.#.#....# +###...#... +.##..#...# +...#...... +###..#...# +.....#.#.. + +Tile 3539: +.####.#.## +....##.#.# +#.......#. +.#.#.#..## +.#.#.....# +#...##..#. +...#.#.... +...#...##. +##..#.##.# +.#####..#. + +Tile 2039: +.##.#...## +....#....# +...#.....# +.......#.# +..##..#... +.........# +##........ +#......#.. +.#...#.... +.##.#..##. + +Tile 2243: +..####.... +#....#...# +#........# +#...##...# +#.#...#... +#......... +##..#....# +...#...... +#........# +.##....#.# + +Tile 1103: +##..###.#. +...#..#..# +#...#..... +...#.#...# +.##..#..## +....#.#..# +#..##....# +#.......#. +#...#....# +.#..#..### + +Tile 2693: +.#..##...# +#....#...# +..#....... +.........# +#.####.#.. +#.....#... +....#..##. +......#..# +....#..#.. +....##...# + +Tile 2971: +#..#..##.. +#......... +#...#..... +...#...... +...#..#..# +.#.......# +#...#..#.. +#.##.....# +......#... +.#.####... + +Tile 1483: +.##.###..# +#......##. +..#.#..... +#...#..#.# +#..#....## +..##.##.## +.#.#..#### +#.....##.. +..#....... +..###..##. + +Tile 3583: +###.#....# +.....#.... +#...###... +#.....#... +......#.## +.......... +.........# +##........ +....#.#... +.##.##.#.. + +Tile 2179: +##.....### +....#..... +#......... +##.....#.# +##.......# +.####..... +#...#.#.#. +...#...... +.....#.... +....#...## + +Tile 1567: +#.######.. +###....... +.......... +.....#.#.. +#..#...... +.......#.# +........#. +......#.#. +.......... +#..#.####. + +Tile 3851: +..###..#.# +.##..#..## +#..###.#.. +..##..##.# +###....... +.......#.. +#.###.#... +#..#....#. +##.##..#.# +##..####.# + +Tile 3343: +##.##...## +....#..... +.......#.# +.....#..#. +#...##.#.# +.......##. +#..#.....# +...#...... +.........# +.####.##.# + +Tile 3319: +#.#....... +..#....#.. +....#...#. +.##......# +.....#.... +..#.#..... +#...#...#. +#.#...#..# +###....... +#..##..... + +Tile 3947: +.#..#..##. +.##....... +##....#... +.#.#...... +..#.#.#..# +.....#...# +......#... +..#.#.#### +#...#....# +.#.##..#.. + +Tile 1559: +.....#...# +##....#... +##......## +#.###..### +##..#..... +##.......# +...###.#.# +#.......#. +..##....#. +##..####.# + +Tile 2063: +#.#..#.#.. +...#.....# +#........# +.#.#....## +#.#.#....# +......#..# +#..##....# +.##...#... +##...#.... +.#.##..##. + +Tile 3163: +..##.#.##. +....#.#... +#......... +#..###...# +#..#..#..# +#..#....## +#......#.# +.....#.... +#..#....#. +##..#.##.# + +Tile 3659: +.#....#..# +##.......# +#.....#... +#..#.....# +#.#......# +###.#..### +##...##### +.#....##.# +#.#....#.. +####.##.#. + +Tile 1229: +....###... +...#.#...# +....#....# +.......### +......#.## +#....###.. +#......#.# +......#..# +#..#...#.. +.......#.. + +Tile 1433: +.###.....# +....#.#... +##....#..# +.....#.#.# +.......... +.##...#..# +#.#..#.... +#....##... +.....###.# +....####.# + +Tile 1487: +.##.###.## +####..#.## +###..#.... +....#..... +.......... +##.#...#.# +..#...#..# +#.#....... +.##..#...# +...##.#... + +Tile 2939: +.#....###. +##........ +##........ +##......#. +.#........ +.#.##..#.. +.#.#.##..# +.......... +...#...... +#..###.##. + +Tile 2753: +###.#...## +##....#... +##.#.#...# +#.....#..# +.........# +##.......# +#........# +#.#.#..#.. +#....#..## +.###..##.# + +Tile 1429: +..##....#. +......#..# +#.#..##... +#.......## +#......... +#.....#... +....#.#.## +#...#..... +#......#.. +...#.#.#.. + +Tile 3371: +.#........ +.........# +#........# +#.###.#..# +....###..# +.##.##.#.. +###.##.... +##....#.#. +...##....# +#.#.##.##. + +Tile 1973: +..##.#.... +...#...#.. +.###..#.## +.#.#.....# +#...#..... +..#..#.#.# +##...#.#.. +....#..#.# +#.##...#.# +#.####.#.. + +Tile 3967: +..#..#.##. +#..#..#... +##..#....# +.##.....#. +...#.....# +..#.#....# +........## +#..##..#.. +.......... +#..##.###. + +Tile 2207: +.##...###. +#...#.##.. +....#..#.# +.......... +##..#..... +.......... +#..#.....# +#.....#..# +.........# +#.#..#.#.. + +Tile 1669: +....#..#.# +...#...#.# +#..#...#.. +#.....#..# +#.##.#.... +...#....## +#......... +#......... +.........# +###....#.# + +Tile 1361: +#....#..## +.......#.# +#...#.#... +.........# +##..#.#.## +.........# +..#..##... +#....#.... +....##.... +..#..#.### + +Tile 2851: +##..#...## +##.#....#. +##.....### +.#.##..... +...##....# +#...##...# +##..#...## +.......#.# +#.#...#.#. +.##.##.... + +Tile 1217: +...#.#.#.. +#.#..#.#.# +#......#.. +.#..##..#. +#..#...... +##..#....# +#..##...#. +#..#...#.. +.#.....#.# +#..##.##.# + +Tile 3631: +......#### +#...#.#.## +......##.. +...#..#.#. +#......#.# +.#.#...#.# +#...##...# +#......#.. +#......#.. +...##..#.. + +Tile 3571: +#....#.#.. +#.....#... +......#.#. +.......... +#...#..... +.#....#... +..##.###.. +#.##....## +#......... +.......##. + +Tile 3067: +##........ +.........# +#...#..... +...#....## +#........# +##.......# +#.....#..# +#......... +...#..#... +##.....#.# + +Tile 2069: +.#.##..... +#......### +..#.##...# +.##..#.... +#.....###. +#.#...##.# +........#. +#......... +.......... +..#.#.##.. + +Tile 2551: +##.#.##... +....##..#. +......#... +#......... +..#..#...# +......#... +...#.##.## +...#...#.. +#......#.. +#..#.###.. + +Tile 1747: +##.#...... +#....#.#.# +....#....# +....#..#.. +#..#...#.# +#....#.... +#......... +#.#...##.. +.......#.. +..######.# + +Tile 2017: +.#####.... +##.##.##.# +.........# +#.##.....# +#.....#.#. +......#.## +#.##...... +#.....#..# +....#.#... +.#.#.###.. + +Tile 2789: +..#.....## +##.....#.# +#.....##.. +#.#...#... +.......#.# +.#.#...#.# +.#.......# +##.....#.# +#.#..##... +#######... + +Tile 2477: +####.##.## +.##....... +#.#....#.. +#.#....#.. +#..##..#.# +##...##... +#....#.... +......#... +.......... +#####..##. + +Tile 3299: +#.##..#### +.......#.# +#.###..#.# +#.#..##.#. +##.#..##.. +.......#.. +#......... +....#.#... +#..##.#... +.##...#..# + +Tile 3169: +#...##.### +#.....##.# +#.#.#..#.# +#.......#. +#...#..... +.#...#.... +#.#....... +#...#..... +..#...#..# +...##.#..# + +Tile 2887: +#.#..#...# +.#...##.#. +#......#.# +#.....##.# +#.....##.# +#........# +.......... +....#...## +.....#.#.. +#...#.##.# + +Tile 3917: +#....#.#.# +.##..##.#. +##....##.. +#.##.....# +....#..... +#...#.#... +........## +##...#.... +.......... +##..#.#... + +Tile 3761: +...#.##.## +.....##..# +#.....##.# +...#..#..# +####...##. +.........# +#.#..#.... +#######.## +#......#.. +..##...... + +Tile 1511: +##.#.##.## +....#....# +..##....## +##.##..#.. +....###.#. +#..###...# +.#........ +#..#.#.... +....#..... +.###.#.##. + +Tile 3023: +.#.###.#.. +.....#...# +.......#.. +.#..#....# +....###..# +###.#..### +.......... +#......... +#.....#..# +..###.#.## + +Tile 3221: +.......##. +##..#.#..# +...#...... +#......... +#...#.#... +#..#.#...# +.###....#. +.#..#..#.# +.###.#..#. +###.##.... + +Tile 1009: +.#.#....## +.#...#.... +..#.##...# +..##...##. +#..#...... +...####..# +.......... +.#.###.#.. +...##....# +...####### + +Tile 1931: +..##.##### +.....#.... +#..##..... +#.#.....## +#####..#.. +.....#.... +.#........ +#.......#. +#.....#... +##..##.... + +Tile 1783: +#..##.#### +....#..#.# +...#...#.. +......#... +...##..... +...##....# +#...##..#. +##..##.... +...#...#.. +#..#.#.#.. + +Tile 1129: +..#.#..### +##........ +.#..#.#.## +....##...# +.......#.# +#.#.###... +.....#..## +..#..#.... +#.#.....## +..#..#.### + +Tile 1051: +.######.## +.#..#...## +.#....#### +.......#.# +.....#..#. +......#... +#...#.##.. +.##....... +#......... +..###.#..# + +Tile 1693: +.##.##.### +.......... +.....#.... +#....#.#.. +#.....#... +#...#.##.# +#.#..#...# +#.#.#.#..# +.##....... +..##.##..# + +Tile 3719: +...##..#.. +#...#..... +...#.#..## +.#..##...# +.....#..#. +#......... +...#.#.##. +...#..#..# +......##.. +.#.....##. + +Tile 1493: +##..#...## +....#..#.# +#..#....#. +#.##.#.### +###.#.#... +.###.#...# +#..#.#..#. +.....##... +#.#...#..# +...#..###. + +Tile 1013: +.##.###.## +.......... +....#..#.# +........## +....#..#.. +#.##.##.#. +#......... +#.##..##.# +#......#.. +.#####..#. + +Tile 2087: +...######. +#...###.## +#.#....... +.......... +#.....#.#. +..#..#...# +.....#...# +#....#.... +.#...#.##. +....#.##.# + +Tile 1201: +##...#..#. +.....#..## +.........# +..#...#... +.....#.### +#..#..#... +.....#.#.# +.#........ +#...##..#. +..#.#.##.# + +Tile 1877: +...###..#. +#..###...# +...#...#.# +#......### +.#........ +#.......#. +#......... +.#..#....# +#.#..##..# +##.#.###.. + +Tile 3697: +..#..#.... +.........# +#..#.#.... +#.##..#..# +.##..#.#.# +...#..#..# +.......#.. +..##.....# +#........# +#.##..#... + +Tile 1187: +#...####.# +#........# +...#..#.## +.........# +#........# +#..#..#..# +.........# +##.....##. +#.#....#.# +.##.#...#. + +Tile 1303: +##..##.##. +.......... +#.....#... +...##....# +....#..... +.###.#.... +....##.... +.#..#...## +#....#...# +.#..#..### + +Tile 3109: +..##....#. +..#.#....# +....#..#.. +...##.#... +#...#..#.. +..#..#...# +.......#.# +#..#.###.. +..#.....#. +####...##. + +Tile 1553: +.#.#####.. +#...##.... +..#....#.. +#....#.#.. +#..#....#. +#.#.#.##.# +...##...## +#.....#..# +.........# +.##.#.##.# + +Tile 2797: +.#.##...## +#.......## +##...#...# +####.#.... +##.##...## +.....#.... +.....#.... +##..#...#. +...#....#. +##.##..### + +Tile 3301: +###...##.. +#.......#. +....#...#. +###.##.#.# +..##...### +#.....#... +##.......# +.#........ +...#.....# +#.###..#.# + +Tile 2707: +#.#.##...# +..###..... +.......... +..#.#.#..# +..#....##. +.......#.. +......#..# +.#..#..... +.#.....#.# +.#........ + +Tile 1409: +#..#..#.#. +#..#..#..# +.........# +......#..# +####..#.## +##..#..#.# +..#.#....# +.#......## +..#.#.#..# +#.###..#.# + +Tile 1297: +..##..##.# +...#.##... +...#####.. +....##...# +#.......#. +.#..#..... +#.#.#....# +..#....... +###....... +.#..###... + +Tile 2729: +..##.##.#. +#...#.#.## +#..#.#.##. +###...##.. +#.#....#.# +........## +#........# +#...#..### +.#....#... +.#...#.#.. + +Tile 3359: +##...#.#.. +...#...... +...#..#..# +##.......# +.......### +#...##.#.# +##.#..##.. +.#....#..# +.....#.... +.#.##.#..# + +Tile 1321: +..####..#. +#..##...#. +.........# +.........# +##..#.##.. +###..##.#. +...#.....# +.#....#..# +#..#.##..# +###...#... + +Tile 1307: +......#.## +...#.#..## +###.#.#... +..#...##.# +#..#...#.. +........#. +#...#..##. +#.....#### +...#.....# +###..###.# + +Tile 1949: +.#.####..# +#..##...#. +#......#.. +.......... +#...##.... +#.####..#. +#.....#... +......##.# +#...#...## +....#.#.## + +Tile 3637: +..#######. +#....#.#.. +#.....#..# +..#....... +........#. +.#......#. +#.....#..# +..##..#... +.#...#.... +#.#.....## + +Tile 1601: +##..##.... +.##......# +........## +#......... +#.#....... +##.#...... +..#.#....# +.......... +##...#.#.. +.#..#..#.. + +Tile 3389: +.###.#..## +#.......## +.#......#. +..###..... +....#....# +........## +#...#....# +.......#.. +...#...... +#.####.... + +Tile 3253: +##.###.#.. +#.#.....## +#......... +.......... +...#.....# +#........# +..#....#.# +#..#...... +....#....# +.#...#.### + +Tile 1933: +.#..#.#.## +........#. +..#..#.... +.....#...# +.......#.. +#.#..##..# +.........# +..#..#..#. +#.#......# +###..###.. + +Tile 3463: +......#... +###......# +...#.#.... +..#..##.#. +##....#... +#..#...#.. +.#....#.#. +###...#### +#..#.#.#.. +###..#.... + +Tile 1279: +.##..#..## +##.....#.# +....#..... +..#......# +#.#.#..... +.....#.... +..##...... +#.....##.# +...#...#.. +###..###.# + +Tile 3793: +...#..##.# +....#.##.. +..##....## +........## +.....#.... +........## +......#... +.........# +#......... +###..#.### + +Tile 2671: +##.#.#.#.# +#.##..#..# +#.##..###. +.........# +#..#.#.... +....##..#. +....##.#.. +.#.#...... +....#..#.# +.##.####.# + diff --git a/2020/samples/20.txt b/2020/samples/20.txt new file mode 100644 index 0000000..b07aa4b --- /dev/null +++ b/2020/samples/20.txt @@ -0,0 +1,107 @@ +Tile 2311: +..##.#..#. +##..#..... +#...##..#. +####.#...# +##.##.###. +##...#.### +.#.#.#..## +..#....#.. +###...#.#. +..###..### + +Tile 1951: +#.##...##. +#.####...# +.....#..## +#...###### +.##.#....# +.###.##### +###.##.##. +.###....#. +..#.#..#.# +#...##.#.. + +Tile 1171: +####...##. +#..##.#..# +##.#..#.#. +.###.####. +..###.#### +.##....##. +.#...####. +#.##.####. +####..#... +.....##... + +Tile 1427: +###.##.#.. +.#..#.##.. +.#.##.#..# +#.#.#.##.# +....#...## +...##..##. +...#.##### +.#.####.#. +..#..###.# +..##.#..#. + +Tile 1489: +##.#.#.... +..##...#.. +.##..##... +..#...#... +#####...#. +#..#.#.#.# +...#.#.#.. +##.#...##. +..##.##.## +###.##.#.. + +Tile 2473: +#....####. +#..#.##... +#.##..#... +######.#.# +.#...#.#.# +.######### +.###.#..#. +########.# +##...##.#. +..###.#.#. + +Tile 2971: +..#.#....# +#...###... +#.#.###... +##.##..#.. +.#####..## +.#..####.# +#..#.#..#. +..####.### +..#.#.###. +...#.#.#.# + +Tile 2729: +...#.#.#.# +####.#.... +..#.#..... +....#..#.# +.##..##.#. +.#.####... +####.#.#.. +##.####... +##..#.##.. +#.##...##. + +Tile 3079: +#.#.#####. +.#..###### +..#....... +######.... +####.#..#. +.#...#.##. +#.#####.## +..#.###... +..#....... +..#.###... diff --git a/2020/src/day20.rs b/2020/src/day20.rs index 666ee81..feb872c 100644 --- a/2020/src/day20.rs +++ b/2020/src/day20.rs @@ -1,12 +1,128 @@ +use std::collections::HashMap; +use std::collections::HashSet; use std::io::Read; +use crate::common::Lines; use crate::Solution; +struct Tile { + grid: Vec>, + id: u64, + sides: [Vec; 4], +} + +fn read_input(input: &mut dyn Read) -> HashMap { + let mut tiles = HashMap::new(); + let mut lines = Lines::new(input); + + while let Some(line) = lines.next() { + let id = line[5..(line.len() - 1)].parse().unwrap(); + drop(line); + + let mut grid: Vec> = Vec::new(); + + while let Some(line) = lines.next() { + if line.is_empty() { + break; + } + + grid.push(line.chars().map(|c| c == '#').collect()); + } + + let sides = [ + grid[0].clone(), + grid.iter().map(|v| *v.last().unwrap()).collect(), + grid.last().cloned().unwrap(), + grid.iter().map(|v| v[0]).collect(), + ]; + + let tile = Tile { grid, sides, id }; + + tiles.insert(id, tile); + } + + tiles +} + +fn compute_matching<'a>(tiles: impl IntoIterator) -> HashMap, Vec> { + let mut matching: HashMap, Vec> = HashMap::new(); + + for tile in tiles { + for side in &tile.sides { + let neighbours = matching.entry(side.clone()).or_default(); + + if !neighbours.contains(&tile.id) { + neighbours.push(tile.id); + } + + let mut rev = side.clone(); + rev.reverse(); + + let neighbours = matching.entry(rev).or_default(); + + if !neighbours.contains(&tile.id) { + neighbours.push(tile.id); + } + } + } + + // Check if my tile assumption is violated + debug_assert!(matching.values().map(Vec::len).max().unwrap_or(0) <= 2); + + matching +} + +fn compute_neighbours<'a>( + cliques: impl IntoIterator>, +) -> HashMap> { + let mut neighbours: HashMap> = HashMap::new(); + + for clique in cliques { + for &a in clique { + let related = neighbours.entry(a).or_default(); + + for &b in clique { + if a != b && !related.contains(&b) { + related.push(b); + } + } + } + } + + neighbours +} + +fn rev_eq(a: &[bool], b: &[bool]) -> bool { + a.iter().zip(b.iter().rev()).all(|(&a, &b)| a == b) +} + #[derive(Default)] pub struct Day20; impl Solution for Day20 { - fn part1(&mut self, _input: &mut dyn Read) -> String { - todo!() + fn part1(&mut self, input: &mut dyn Read) -> String { + let tiles = read_input(input); + let matching = compute_matching(tiles.values()); + let neighbours = compute_neighbours(matching.values()); + + neighbours + .into_iter() + .filter_map(|(i, n)| if n.len() == 2 { Some(i) } else { None }) + .fold(1, |a, b| a * b) + .to_string() + } +} + +#[cfg(test)] +mod tests { + use crate::test_implementation; + + use super::*; + + const SAMPLE: &[u8] = include_bytes!("../samples/20.txt"); + + #[test] + fn sample_part1() { + test_implementation!(Day20, 1, SAMPLE, 20899048083289u64); } }