Ver código fonte

Complete day 20

Frans Bergman 4 anos atrás
pai
commit
766efa8f50
3 arquivos alterados com 2035 adições e 0 exclusões
  1. 1728 0
      20.input
  2. 199 0
      20.py
  3. 108 0
      20.small.input

+ 1728 - 0
20.input

@@ -0,0 +1,1728 @@
+Tile 2381:
+#.#.#####.
+#.......#.
+.#.......#
+#.......#.
+......#..#
+...#......
+........##
+...#..#..#
+..........
+..#....#.#
+
+Tile 1303:
+####...##.
+#....#.#..
+.##.##....
+.......#.#
+.#..#...##
+#.......#.
+...#....##
+#......#.#
+.........#
+..#.#.#.##
+
+Tile 3821:
+.###....##
+..#..#..##
+.#..#.##.#
+##.#.#.##.
+......#...
+....#.....
+...#.##..#
+....##..#.
+#.....#..#
+.##.##.###
+
+Tile 1229:
+..###.....
+.#........
+#.........
+##..#.....
+#...#.....
+#..#.....#
+..#.#..#.#
+#.#.......
+.#...#####
+###.#.#..#
+
+Tile 1787:
+...#####.#
+#.........
+#...#..#..
+.....#.#.#
+##.#.....#
+#.........
+#..#......
+##........
+#...#....#
+.#..##.##.
+
+Tile 3943:
+#.#.#.##.#
+.#...#..##
+......#...
+#.....#...
+....#....#
+.......#..
+#.......##
+..........
+#...#.....
+#......#.#
+
+Tile 3203:
+.##..#.#.#
+..#.....##
+..........
+##......##
+#....#.#..
+#......##.
+..........
+.........#
+.#....#...
+#...#.###.
+
+Tile 2213:
+##...###..
+.##......#
+###..#....
+#.#.....#.
+....##...#
+....#....#
+#..#.##...
+...#..#...
+..#.......
+....##.##.
+
+Tile 1033:
+..#.###.#.
+#.#...####
+#.##......
+##.......#
+..#.......
+..#.#.#..#
+#..#.....#
+.#........
+#.........
+....##..#.
+
+Tile 2383:
+#####...#.
+#.....#..#
+..........
+#..##.....
+#.....#...
+##.#.#....
+.....##..#
+#.....#.##
+#.........
+.#.#.#.#..
+
+Tile 1117:
+#.##.###.#
+.#....#..#
+##......##
+.##....##.
+.#.#.#.#..
+........#.
+#...#.....
+###.#.....
+#......##.
+..###..#..
+
+Tile 3209:
+...#.#..#.
+###.#..#..
+#.#......#
+#..#...#..
+#.....####
+.....##.##
+##...#.###
+.#....####
+#..#####..
+..#...###.
+
+Tile 2503:
+...####.##
+#........#
+#.#.#....#
+.........#
+.#....#..#
+.........#
+...#......
+...#....#.
+##.......#
+#.#...####
+
+Tile 1579:
+#.#.#..###
+.#.#.##...
+....#....#
+#....#...#
+.###..#.##
+#........#
+##...#...#
+.......#..
+#..###.#..
+..#......#
+
+Tile 2741:
+######....
+......#..#
+..###.....
+.....##...
+.#.#.....#
+.##...#..#
+#........#
+...#.#..##
+.#....#...
+.....#.#.#
+
+Tile 3593:
+##.##.#.#.
+..#.....##
+#..###....
+#...#....#
+#.#.####.#
+.........#
+#........#
+#......###
+.#.#.##.#.
+#.###....#
+
+Tile 2467:
+.#.#.###..
+##....#..#
+..##..#..#
+..####...#
+#...##.#..
+##..#..###
+.........#
+#..#.....#
+#......##.
+.####...##
+
+Tile 1721:
+##.##....#
+.#.......#
+#..##.#..#
+......#...
+..#.......
+###......#
+...#.....#
+.........#
+##..#.....
+..#.#.#...
+
+Tile 2221:
+...#.#.#.#
+..#.......
+#.........
+#..#.....#
+......#.#.
+#.#....#.#
+......#..#
+.#.......#
+###.##.##.
+####..#..#
+
+Tile 2083:
+..#.#.#.##
+..#.....##
+#..##.#.##
+##........
+..##.....#
+..........
+..#.....#.
+....#..#..
+.#......##
+#.#...#...
+
+Tile 3907:
+#..######.
+#......#.#
+...#...#..
+##.......#
+###..#..#.
+##........
+#........#
+.....##...
+..........
+###.#.#...
+
+Tile 3067:
+##.#...###
+...#......
+..#.#..#.#
+###.#...#.
+..##...#..
+#...#.##..
+..#....#..
+#.##.....#
+..#.....##
+##.###..#.
+
+Tile 2347:
+####....#.
+..##..#...
+#........#
+#.#....#.#
+.#..#..###
+..#..#...#
+.#....##.#
+#........#
+.#...##..#
+####...#..
+
+Tile 2251:
+#.#.##....
+#...#.#..#
+..#.##...#
+##...##.##
+##.....#.#
+#.......##
+.#.......#
+#...#....#
+#....#...#
+....######
+
+Tile 1019:
+...#.#....
+##.....#..
+#.....#..#
+#..#.....#
+##....#...
+...#......
+..........
+###...#..#
+#...#.#..#
+.#..#.##.#
+
+Tile 2309:
+#.#.##.#..
+.....#....
+#.........
+#........#
+.#........
+....###...
+#.....#..#
+..#.#.#...
+#..#.#..##
+.....###..
+
+Tile 1129:
+.##.#.##.#
+......#.#.
+##.......#
+.....##...
+.#...#.#..
+#......#..
+#....#....
+#...#....#
+.##..##..#
+###..##..#
+
+Tile 3793:
+...#.#..#.
+#..#...#.#
+......#...
+#....##...
+#....##...
+....##....
+##.#...##.
+.........#
+.........#
+##...##.##
+
+Tile 2851:
+###.##....
+#........#
+#.#.#.#...
+##..#....#
+#...#...##
+..#.#....#
+##........
+.....#.#..
+#....#...#
+.#.##.####
+
+Tile 3061:
+###..#.##.
+...#.....#
+...#......
+#....#..##
+#........#
+##.##.....
+#..#.....#
+#....#..##
+#..#..##.#
+..####.#.#
+
+Tile 1999:
+...#...###
+..........
+#...####..
+...#......
+.#.......#
+.........#
+.###.....#
+.##....###
+#..##.#.#.
+##....#...
+
+Tile 1237:
+#...#..#..
+.#...#...#
+#.........
+.........#
+...#.....#
+#..#......
+...#......
+..##.#....
+...#.....#
+..#..#.#.#
+
+Tile 3889:
+.#..###.#.
+.#..#....#
+..#......#
+#.......#.
+..#.....##
+#........#
+#.#.#.....
+#......#..
+..###...#.
+#....#....
+
+Tile 3833:
+###.#.#...
+..#.......
+##.......#
+.#..#.###.
+......##.#
+#..##.#..#
+.#.#.#.#.#
+#..#....#.
+##.....#..
+#####..#.#
+
+Tile 2957:
+.##..##.#.
+###.......
+#.......##
+#......#..
+.......#.#
+#...#...#.
+##....#..#
+##.....#.#
+...#....##
+..#.....##
+
+Tile 1087:
+#...##.#..
+#...#.#..#
+..........
+#.....#.#.
+#.#.#.....
+#....##.##
+##.......#
+.#...#....
+....#....#
+###..#...#
+
+Tile 2549:
+...##..#.#
+#.#####...
+#..#.#...#
+.##.#..#.#
+..#.#....#
+...#.#....
+..##...#..
+#.#..#...#
+#...#..###
+##.#######
+
+Tile 1283:
+....####.#
+....##...#
+#....#...#
+#..#..#...
+.#...#...#
+#.#....#..
+......#...
+#..#.#....
+##...#....
+#####...#.
+
+Tile 1601:
+###...#..#
+#..#......
+##.......#
+.#..###...
+.........#
+.#.......#
+..#......#
+..........
+.#...#...#
+..###....#
+
+Tile 2713:
+.....#...#
+#.#......#
+###....#.#
+...#.....#
+#....#....
+.#...#....
+#.#....#..
+.#..#...#.
+##........
+....##.###
+
+Tile 1163:
+#####.#.#.
+##......##
+.#.....#.#
+#..##.#..#
+#.##.#..##
+#.##....##
+.....#..##
+.##.......
+..#..#.#..
+#.#..#....
+
+Tile 3191:
+#.######..
+#..#.....#
+#...#.#..#
+#.##.#..#.
+#.#.......
+.#.......#
+.........#
+.......##.
+#.#.......
+####.#####
+
+Tile 3299:
+#.#.......
+#........#
+#.....####
+.##....#.#
+.#..#.....
+..........
+.....#.###
+........##
+.....####.
+#....#.###
+
+Tile 1571:
+..#...#...
+.....#..#.
+..#.##.#.#
+#.#.###..#
+.........#
+#.......#.
+#.#...##.#
+.#.......#
+..#......#
+#..##....#
+
+Tile 2903:
+##.##..##.
+.........#
+..#......#
+..#......#
+.....#.#..
+#..#.#...#
+....##...#
+.#.....#..
+.....#.#..
+##..#.#.#.
+
+Tile 2843:
+....#.##.#
+#.........
+#..##.....
+....#....#
+.#....#..#
+...##...#.
+.....#.###
+.....#...#
+.#.....#..
+..###...#.
+
+Tile 1873:
+..#.####..
+#.....##..
+#........#
+#.........
+##....#...
+.....#...#
+#........#
+#.....##..
+..#..#....
+#..###....
+
+Tile 2207:
+##.#..##..
+....#.....
+.#..#.....
+##.......#
+##.##..#..
+....###..#
+#....#....
+#.#.#.....
+..#.##....
+#.##.#.##.
+
+Tile 1973:
+#...##.#.#
+...##...##
+......#...
+..#.#.....
+..#.......
+###...#.#.
+.#.#......
+#......#.#
+.....#.###
+..######.#
+
+Tile 1511:
+.#..#.....
+.....#...#
+........##
+..#.#....#
+#...#.....
+#...##...#
+#..#......
+#....#...#
+#...#....#
+..#.#...#.
+
+Tile 3449:
+##........
+...#.....#
+#.........
+..##....##
+.#.##..#..
+#..##....#
+#.........
+#......#.#
+##....#..#
+###..##..#
+
+Tile 1607:
+#.###.####
+.##.##....
+......#..#
+...#......
+.#.....#.#
+......#.##
+.....#..#.
+##.#.#...#
+#..#..#..#
+#.##..#...
+
+Tile 1777:
+###..#...#
+.##......#
+#..#.#...#
+....#..#..
+.#........
+#..#..#...
+......#.##
+##.##.#..#
+###.#.#...
+#.###..#..
+
+Tile 1097:
+#.####.#..
+#....##...
+...##.##..
+#......##.
+#..#...#.#
+..###.#...
+#....#...#
+#.##..#.##
+#...#.#...
+.#.##....#
+
+Tile 3877:
+..#######.
+#.........
+#......#.#
+#........#
+#...#.....
+#......#..
+.##.....#.
+..........
+##....#..#
+.....##..#
+
+Tile 1451:
+....#...##
+#.....#..#
+.#..#..#.#
+...#......
+...#.#...#
+##..#.#..#
+##.....#..
+..#.....##
+##..#.#..#
+#.##.#..#.
+
+Tile 2411:
+.....#####
+..#......#
+#.#......#
+..#.##...#
+###....#.#
+...#.....#
+#.#......#
+....##....
+......#...
+####...#.#
+
+Tile 2243:
+##.###..##
+.......#..
+#.....#...
+.......#.#
+......#.#.
+...#.#..#.
+.........#
+#.....##..
+#....#...#
+#..#.....#
+
+Tile 3637:
+..##.#..##
+..........
+..#...#.#.
+#...#....#
+#.....##..
+#....#..##
+####.#...#
+#.#....#..
+..#.#.....
+.##.#####.
+
+Tile 1213:
+####..###.
+#........#
+#.......#.
+#......#..
+...#.....#
+#....#....
+..........
+.......#..
+#.#.....#.
+......##..
+
+Tile 1901:
+#....#..##
+#.......#.
+....#....#
+.........#
+..#.......
+#.###....#
+.....###.#
+....#.##.#
+.........#
+#######.##
+
+Tile 3469:
+.##.#.#..#
+#..##...##
+#.#..##...
+.#..#....#
+.....#...#
+#....#....
+#....#....
+##......##
+#......#..
+#.#..#...#
+
+Tile 3371:
+..#.......
+......#..#
+..........
+#..#...#.#
+#........#
+#.....##.#
+.#.....#.#
+..........
+..........
+.#.###.###
+
+Tile 1013:
+..##..##.#
+.........#
+..........
+..........
+...#......
+#..#.#....
+##...#...#
+##..#...##
+#..#.....#
+###.#..#..
+
+Tile 3011:
+######..##
+..#......#
+.##......#
+#.#...###.
+#.#..#....
+#......#.#
+#..#..#..#
+#...#.....
+.........#
+##.#.###.#
+
+Tile 1009:
+##...#####
+........##
+.........#
+##.#.###.#
+##..#.##.#
+.####...##
+##........
+#.........
+......##..
+##.###..##
+
+Tile 2659:
+.#....#...
+#..#...#..
+#.#..#..#.
+.#....#...
+.........#
+#.......#.
+##.###.#..
+#...#....#
+#......#..
+..#..#.##.
+
+Tile 1301:
+.##...##..
+....#..#.#
+#..#......
+...#.....#
+###.#.#...
+##.....#..
+#...#....#
+.#..#.#..#
+#..#......
+#.#...##.#
+
+Tile 1847:
+..####..##
+#.........
+#.#..##...
+##...##...
+##..#...##
+........#.
+#.##......
+...#..#...
+##..##.#..
+##.##..##.
+
+Tile 2203:
+#.##.##.##
+.#.#..##.#
+###.##..#.
+#...#....#
+#.#....#..
+....#..###
+####.#.###
+##.##..###
+#...#...##
+.#...###..
+
+Tile 2089:
+..####.###
+#.#.##..#.
+#....#..##
+#.........
+..#......#
+#...#.....
+.....#..#.
+#........#
+#.#......#
+..#.......
+
+Tile 1613:
+###.#..###
+#....#...#
+..#...#..#
+#........#
+#.......##
+#........#
+.........#
+#........#
+..#......#
+#...####..
+
+Tile 1297:
+#.##....##
+....##.#.#
+......#..#
+#...#....#
+#........#
+...#..#..#
+.#..#..#..
+...#...#.#
+......#..#
+#.##....#.
+
+Tile 2939:
+##...####.
+.##......#
+..#.#....#
+.........#
+##....##..
+.......#..
+##..#.....
+.##..#..#.
+#.......#.
+..##.#####
+
+Tile 1187:
+####.#..#.
+#..##.#..#
+.#.#.....#
+#.........
+#.#.....##
+#.....#..#
+#........#
+#..#......
+..........
+##.#..##.#
+
+Tile 2671:
+#..##.###.
+.........#
+....#....#
+...###....
+......#...
+##.#.#....
+.........#
+...#.#...#
+#.........
+##.##.....
+
+Tile 1181:
+..##.###..
+..##......
+....#..#.#
+#...#....#
+.....##...
+#.##.#....
+#........#
+.....#....
+#..#......
+..###....#
+
+Tile 2591:
+##........
+#.#..##...
+........#.
+.........#
+#....##...
+#.#..#..##
+..##......
+.........#
+....#..##.
+.#####..#.
+
+Tile 2029:
+.#.#.##...
+#...#..##.
+..........
+.......#.#
+#..#.#.#.#
+#..#.....#
+#......#..
+.##.......
+##.......#
+##...##.#.
+
+Tile 2377:
+..#..#.#.#
+....#...#.
+..#...#..#
+##........
+#...#....#
+#..##.....
+#.##.....#
+.#..#...#.
+##......#.
+....#...##
+
+Tile 1399:
+########.#
+#......#..
+.........#
+.......#.#
+#...#....#
+#.....#...
+.........#
+.#.....#..
+.#........
+#..###.###
+
+Tile 3343:
+#.##..####
+.#.###....
+....#..#..
+#........#
+#..#......
+.........#
+#........#
+###.......
+.#...#....
+..###.#.#.
+
+Tile 3923:
+..#.#.####
+.......#.#
+#.#.#....#
+..........
+..........
+.#........
+#.####..##
+##.##..#..
+#......#.#
+.##..#.#..
+
+Tile 2837:
+...##..#.#
+#..#.....#
+...#......
+#.#..#...#
+.....#....
+##......##
+..#...#..#
+...##...#.
+#..##.....
+#.##.#.#..
+
+Tile 1811:
+.#.###.#..
+#.#......#
+##.......#
+..........
+........#.
+..#..##.#.
+....#....#
+#........#
+.........#
+#.##..##..
+
+Tile 3221:
+..####..##
+....##....
+.#.##.#...
+...#.....#
+......##.#
+...#...#..
+..........
+#.......##
+#.#.......
+.#.#.....#
+
+Tile 3079:
+...##.####
+.......###
+##....#...
+#........#
+........#.
+#...#...#.
+..#.....#.
+#....#....
+.#.....#.#
+..###.####
+
+Tile 2749:
+.#####....
+##...#...#
+#..#..#..#
+..........
+.#......##
+.#.......#
+......#..#
+...#.....#
+......#...
+######.##.
+
+Tile 2039:
+......##..
+.#........
+#.......##
+....#.#..#
+#..#.....#
+.#....#..#
+..........
+#....#...#
+......##.#
+#..###.#.#
+
+Tile 2287:
+.######...
+#..##...#.
+#..#..#...
+..#.#..#.#
+####.....#
+........##
+....#..#.#
+#..#..#...
+##.#.....#
+#...##.#..
+
+Tile 3533:
+#..##.#.##
+.#.#....#.
+....#.....
+.........#
+.#........
+.#...#...#
+...#.##..#
+#.....####
+#......#..
+.##...#.#.
+
+Tile 1609:
+###.....#.
+..#..#...#
+..#.#....#
+.#.......#
+#..#.....#
+......##..
+.........#
+#....##..#
+..........
+###.##.#.#
+
+Tile 3001:
+##...###..
+.#.##.....
+##...#....
+..#.....##
+...#.....#
+...#...#.#
+.......#..
+.#.##...#.
+....#.#..#
+...#......
+
+Tile 1951:
+#.###..#.#
+##........
+...#.....#
+.....##..#
+....#.#...
+..#......#
+..........
+##..#.#..#
+#....#.#..
+######...#
+
+Tile 2371:
+.#...#....
+...##.#.##
+##.......#
+.#....##.#
+....#....#
+#..#..#...
+#...#...#.
+....##..#.
+#...#...#.
+#....#.#..
+
+Tile 1171:
+....#...#.
+..##......
+##....#...
+#..#.....#
+#.......#.
+..##......
+......#...
+###....#.#
+...#..##.#
+.#.##.#...
+
+Tile 2621:
+##...#..##
+#....##..#
+..........
+#.....#.##
+..........
+#........#
+##..#..#..
+#.####..##
+....#.####
+#....##...
+
+Tile 1619:
+#...#.###.
+#.......##
+#.........
+#.#......#
+#........#
+#.#.....#.
+#........#
+#......#.#
+..######.#
+#.#.#.###.
+
+Tile 1493:
+##..##..#.
+....###...
+#.......#.
+#...#....#
+##...#...#
+#.##....#.
+...#......
+.....#.###
+..........
+..#.#..##.
+
+Tile 2879:
+..##..#...
+.......#..
+....#...#.
+#..#.....#
+....#.#.#.
+.#..#...##
+#.......##
+#.........
+#.......#.
+.#.#..#..#
+
+Tile 3217:
+##.###...#
+.#.......#
+...##..##.
+...#....#.
+..##.#....
+...##.....
+#..#......
+#...#.....
+#.....#...
+#..##..#.#
+
+Tile 2161:
+..#.#.#.#.
+..#..#...#
+#..#......
+....#.....
+#......#.#
+#........#
+.........#
+.......#.#
+..........
+.######.##
+
+Tile 2293:
+#..##...#.
+.......#.#
+........##
+#......#.#
+#......#..
+#.........
+.....#....
+.#..#.#...
+....#..#..
+#.#.##..##
+
+Tile 1871:
+#.#..#..#.
+..........
+.......#..
+#...#.....
+###.#.....
+.........#
+....#....#
+..#.......
+#.........
+#####.#..#
+
+Tile 2393:
+.#....##.#
+#........#
+#..#......
+#..#......
+..#.......
+#.#..#..#.
+#.##....##
+#.#.......
+#.#......#
+.#...#.###
+
+Tile 3461:
+#.#...#...
+.........#
+#.....#..#
+..#......#
+#.......##
+.....#..#.
+##...#...#
+#.........
+#.........
+#.#####.##
+
+Tile 1543:
+#...#.#.#.
+.#........
+#........#
+#....#....
+.##.......
+#.....##..
+#.#.###...
+.....#.#.#
+#....#....
+#....#...#
+
+Tile 1201:
+##.....##.
+..##.....#
+#......#.#
+..##...#.#
+###.......
+##..#....#
+#..#.#...#
+...#.....#
+#...#.#...
+.#.#...#..
+
+Tile 3607:
+...###...#
+##......##
+..........
+#.#...#...
+##......##
+#.....##.#
+#.........
+.....#..#.
+.#.....##.
+##....####
+
+Tile 3727:
+#...#.#...
+.##...####
+......###.
+.........#
+.........#
+#.##.#....
+.......#.#
+###.##.#.#
+#....##..#
+##.##.###.
+
+Tile 3391:
+#.###.#...
+..#.....##
+####....##
+#...#.##..
+.#......##
+.#....#...
+#...#....#
+..#..#..#.
+#.......##
+#.##..#..#
+
+Tile 3719:
+#.#..#.#.#
+.#.......#
+#.#....#.#
+........#.
+..#......#
+#..##.....
+#.....#...
+#.###.#.##
+..........
+..#..#....
+
+Tile 1889:
+....#.##..
+#.......#.
+.......#..
+##.....#..
+...#.....#
+........##
+.......#.#
+#.#...##..
+#.......#.
+..#.#...#.
+
+Tile 2789:
+..#.###..#
+..##.....#
+#.........
+..........
+#...#..#.#
+#..#....##
+.##.......
+#...#.....
+..#....##.
+####....#.
+
+Tile 3761:
+#.#..##.#.
+#.........
+#..##.....
+##.#.....#
+#..#.....#
+....#..##.
+#.......#.
+#...#...##
+..#..#...#
+......#.##
+
+Tile 2477:
+..#......#
+##.......#
+#.........
+#.#......#
+#.#.##...#
+..##.....#
+#.#......#
+.#........
+#.........
+.#.##..##.
+
+Tile 3919:
+.####.#..#
+#.#.#....#
+#......#.#
+#.##.....#
+##........
+..........
+#..#.....#
+#....#...#
+#.#.....##
+..####.##.
+
+Tile 2269:
+#.....##.#
+.........#
+.........#
+....###...
+...#.#....
+.#....#..#
+#.....#..#
+..#..#...#
+......#...
+###.#.#.#.
+
+Tile 1091:
+#..#.#.##.
+#..##...##
+.#.......#
+#......#..
+#......#..
+......#.##
+#..#....#.
+#.......#.
+......#...
+..#.#...##
+
+Tile 2917:
+..##.#.###
+#.........
+.#.......#
+#.....#...
+....#..###
+.....#.#.#
+..........
+#.....#...
+#.......#.
+##....#...
+
+Tile 3947:
+.#.......#
+#.........
+#....#..#.
+#.####....
+.....#....
+......#..#
+#........#
+...#.#....
+#.##....#.
+.#.###..#.
+
+Tile 2719:
+####.###.#
+..#.#.....
+...#...#..
+#....#..#.
+#.....##.#
+#..##.....
+...##...##
+#...##....
+....#...#.
+##.#...#..
+
+Tile 1321:
+.#.##..#.#
+#.....#..#
+..........
+.#.#......
+.........#
+#.#.#..#.#
+#...#.....
+.#.##....#
+.##.......
+..#####.##
+
+Tile 3167:
+..#.####.#
+#.#.......
+...#.....#
+#.##...#.#
+.......##.
+....#...#.
+...#...#.#
+..#..#...#
+...#...###
+#.##......
+
+Tile 3041:
+#..#...###
+#.......##
+#.........
+.#......##
+...#...#.#
+.#........
+##..#....#
+.#.#......
+.#.....#.#
+..#...#.#.
+
+Tile 1279:
+..###..#.#
+###...###.
+###.....#.
+.#........
+##.....#..
+###.#..#.#
+##.#.....#
+#.....#.##
+.##..#..#.
+###.####.#
+
+Tile 1249:
+..#..#..##
+#...#.....
+#.#......#
+..........
+#.......##
+#.......#.
+.........#
+.........#
+#...##.#.#
+#..#..##.#
+
+Tile 2791:
+#.#.##.##.
+..#.....#.
+##...###..
+......##..
+........##
+#...#..#..
+.......#..
+#.........
+.#....##..
+.##.###..#
+
+Tile 3257:
+.##.####.#
+#..#.#...#
+#........#
+...#...#.#
+#..#...###
+..#..#..#.
+.........#
+#..#..##.#
+...#.....#
+..##..#.##
+
+Tile 3677:
+.####..###
+#........#
+.....#....
+#.#......#
+..#.....#.
+.........#
+#........#
+.....#.#..
+..#.#..##.
+#.##....##
+
+Tile 3329:
+.####.....
+##......##
+#...#...##
+###....#..
+.##..#..#.
+.#......##
+..#....#.#
+##..#...#.
+...#...##.
+#.####.###
+
+Tile 1103:
+.###.##...
+##..#...##
+#..#.#...#
+...#.#..#.
+#....#..#.
+..........
+#.........
+...#.....#
+#..##....#
+.#....#..#
+
+Tile 3917:
+#.#.#..###
+#......#.#
+.#........
+##...#....
+.##.#..#..
+#.......##
+..........
+..##......
+.........#
+.##.##..##
+
+Tile 3571:
+...#......
+......#.#.
+...#...#.#
+.......#..
+..........
+.....#...#
+#.........
+#.........
+..#.......
+#.......##
+
+Tile 3389:
+###.#..###
+......#...
+.##.......
+#.........
+...##.....
+.....#..#.
+#..#.#...#
+#.........
+....#.....
+.##.###...
+
+Tile 2267:
+#..#.#.###
+........##
+#.....##..
+#..####...
+.........#
+#.#....#.#
+#........#
+#.....##..
+#........#
+#..#....#.
+
+Tile 2099:
+.#.###...#
+#.........
+.......#.#
+...##.....
+##...#....
+##.......#
+##..##..#.
+##.....##.
+#........#
+##...##..#
+
+Tile 3169:
+..#.#.#..#
+#..#.....#
+##.......#
+##........
+..........
+.........#
+...#.##..#
+#.........
+#...#....#
+.#.......#
+
+Tile 1049:
+#.#.###.#.
+.#.......#
+..#.#.#...
+#.#...#..#
+#......#.#
+#...#....#
+#........#
+#..#.....#
+##........
+#.#.#..#.#
+
+Tile 3023:
+##..#..#..
+..#......#
+....#..#.#
+.....#...#
+..........
+.........#
+#..#.#....
+#.....#...
+..#......#
+..##.##.##
+
+Tile 2153:
+#.#......#
+......#.#.
+#.....#...
+#.......#.
+#..##.....
+.#......#.
+........##
+.....##..#
+#...#.##..
+..#####..#
+
+Tile 2909:
+##..#.###.
+#......#..
+.#...#....
+#.......#.
+#.....#.##
+.#........
+....#..#.#
+##..#.#...
+..##.....#
+##.##...##
+
+Tile 3457:
+####..##.#
+##.#.#....
+###....##.
+#..#.##.#.
+.......#..
+...#..#..#
+#........#
+.......#..
+.#...##..#
+#.#.#.###.
+
+Tile 3019:
+.##..###.#
+......#...
+#..#.....#
+#..#......
+#.#.......
+###......#
+#.#....#..
+..........
+.........#
+#....##.##
+

+ 199 - 0
20.py

@@ -0,0 +1,199 @@
+from math import sqrt
+lines = []
+
+with open("20.input") as f:
+    for line in f.readlines():
+        lines.append(line.strip())
+
+def parse(lines):
+    tiles = []
+    fragments = []
+    id = None
+    for line in lines:
+        if line.startswith("Tile"):
+            id = int(line[5:-1])
+        elif line == "":
+            if fragments == []:
+                continue
+            tiles.append((id, fragments))
+            fragments = []
+        else:
+            fragments.append(list(line))
+    return tiles
+
+
+def column(fragments, i):
+    return [row[i] for row in fragments]
+
+
+def rotate_90(fragments):
+    return [reverse_of(column(fragments, i)) for i in range(0, len(fragments))]
+
+
+def all_rotations(grid):
+    rotations = []
+    for i in range(0, 4):
+        grid = rotate_90(grid)
+        rotations.append(grid)
+    return rotations
+
+
+def all_orientations(grid):
+    return all_rotations(grid) + all_rotations(reverse_of(grid))
+
+
+def all_sides(fragments):
+    sides = [fragments[0], fragments[-1], column(fragments, 0), column(fragments, -1)]
+    sides += [reverse_of(side) for side in sides]
+    return sides
+
+
+def reverse_of(l):
+    l2 = list(l)
+    l2.reverse()
+    return l2
+
+
+def valid_orientations(tile, left, right, top, bottom):
+    result = []
+    for orientation in all_orientations(tile[1]):
+        if left != None and column(orientation, 0) not in left:
+            continue
+        elif right != None and column(orientation, -1) not in right:
+            continue
+        elif top != None and orientation[0] not in top:
+            continue
+        elif bottom != None and orientation[-1] not in bottom:
+            continue
+        else:
+            result.append(orientation)
+    return result
+
+
+def possible_orders(prefix, width, tiles, uniq_sides):
+    index = len(prefix)
+    if index == width * width:
+        return [prefix]
+    left = None
+    right = None
+    top = None
+    bottom = None
+    result = []
+    if index >= width:
+        # Must match above tile
+        top = [prefix[index - width][-1]]
+    if index % width != 0:
+        # Must match left tile
+        left = [column(prefix[-1], -1)]
+    if index in [0, width - 1, width * (width - 1), width * width - 1]:
+        key = "corner"
+    elif index < width or index > width * (width - 1) or index % width in [0, width - 1]:
+        key = "edge"
+    else:
+        key = "center"
+    for tile in tiles[key]:
+        if index % width == 0:
+            left = uniq_sides[tile[0]]
+        if int(index / width) == 0:
+            top = uniq_sides[tile[0]]
+        if index % width == width - 1:
+            right = uniq_sides[tile[0]]
+        for valid in valid_orientations(tile, left, right, top, bottom):
+            tiles_next = dict(tiles)
+            tiles_next[key] = [t for t in tiles[key] if t != tile]
+            result += possible_orders(prefix + [valid], width, tiles_next, uniq_sides)
+    return result
+
+
+tiles = parse(lines)
+
+sides = [(side, tile[0]) for tile in tiles for side in all_sides(tile[1])]
+uniq_sides = {}
+counts = {}
+for (side, tile_id) in sides:
+    same_side = len([1 for (s, id) in sides if s == side])
+    if same_side == 1:
+        count = counts.get(tile_id, 0)
+        count += 1
+        counts[tile_id] = count
+        uniq = uniq_sides.get(tile_id, [])
+        uniq.append(side)
+        uniq_sides[tile_id] = uniq
+
+corners = []
+edges = []
+prod = 1
+
+for (k, v) in counts.items():
+    if v == 4:
+        prod *= k
+        corners += [tile for tile in tiles if tile[0] == k]
+    elif v == 2:
+        edges += [tile for tile in tiles if tile[0] == k]
+
+print("Answer 1:", prod)
+
+center = [tile for tile in tiles if tile not in corners and tile not in edges]
+width = int(sqrt(len(tiles)))
+first_corner = corners.pop()
+valid_corner = valid_orientations(first_corner, uniq_sides[first_corner[0]], None, uniq_sides[first_corner[0]], None)[0]
+orders = possible_orders([valid_corner], width, {'center': center, 'edge': edges, 'corner': corners}, uniq_sides)
+assert len(orders) == 1
+
+def strip_borders(frags):
+    return [row[1:-1] for row in frags[1:-1]]
+
+assert strip_borders([[1, 2, 3], [4,5,6], [7,8,9]]) == [[5]]
+
+map = []
+order = orders[0]
+while len(order) > 0:
+    row = [strip_borders(frags) for frags in order[0:width]]
+    for i in range(0, len(row[0])):
+        map.append(list(''.join([''.join(frags[i]) for frags in row])))
+    del order[0:width]
+
+sea_monster = ["                  # ",
+               "#    ##    ##    ###",
+               " #  #  #  #  #  #   "]
+
+sea_monster = [list(row) for row in sea_monster]
+
+def check_monster(map, x, y, monster):
+    for local_x in range(0, len(monster[0])):
+        for local_y in range(0, len(monster)):
+            if monster[local_y][local_x] == '#' and map[y + local_y][x + local_x] != '#':
+                return False
+    return True
+
+def paint_monster(map, x, y, monster):
+    for local_x in range(0, len(monster[0])):
+        for local_y in range(0, len(monster)):
+            if monster[local_y][local_x] == '#':
+                map[y + local_y][x + local_x] = 'O'
+    return map
+
+def search_map(map):
+    map_width = len(map[0])
+    map_height = len(map)
+    monster = sea_monster
+
+    found = False
+    for x in range(0, map_width - len(monster[0])):
+        for y in range(0, map_height - len(monster)):
+            if check_monster(map, x, y, monster):
+                found = True
+                map = paint_monster(map, x, y, monster)
+    if found:
+        return map
+    else:
+        return None
+
+def print_map(map):
+    for row in map:
+        print(''.join(row))
+
+for map in all_orientations(map):
+    map = search_map(map)
+    if map != None:
+        print("Answer 2:", len([1 for row in map for c in row if c == '#']))

+ 108 - 0
20.small.input

@@ -0,0 +1,108 @@
+Tile 2311:
+..##.#..#.
+##..#.....
+#...##..#.
+####.#...#
+##.##.###.
+##...#.###
+.#.#.#..##
+..#....#..
+###...#.#.
+..###..###
+
+Tile 1951:
+#.##...##.
+#.####...#
+.....#..##
+#...######
+.##.#....#
+.###.#####
+###.##.##.
+.###....#.
+..#.#..#.#
+#...##.#..
+
+Tile 1171:
+####...##.
+#..##.#..#
+##.#..#.#.
+.###.####.
+..###.####
+.##....##.
+.#...####.
+#.##.####.
+####..#...
+.....##...
+
+Tile 1427:
+###.##.#..
+.#..#.##..
+.#.##.#..#
+#.#.#.##.#
+....#...##
+...##..##.
+...#.#####
+.#.####.#.
+..#..###.#
+..##.#..#.
+
+Tile 1489:
+##.#.#....
+..##...#..
+.##..##...
+..#...#...
+#####...#.
+#..#.#.#.#
+...#.#.#..
+##.#...##.
+..##.##.##
+###.##.#..
+
+Tile 2473:
+#....####.
+#..#.##...
+#.##..#...
+######.#.#
+.#...#.#.#
+.#########
+.###.#..#.
+########.#
+##...##.#.
+..###.#.#.
+
+Tile 2971:
+..#.#....#
+#...###...
+#.#.###...
+##.##..#..
+.#####..##
+.#..####.#
+#..#.#..#.
+..####.###
+..#.#.###.
+...#.#.#.#
+
+Tile 2729:
+...#.#.#.#
+####.#....
+..#.#.....
+....#..#.#
+.##..##.#.
+.#.####...
+####.#.#..
+##.####...
+##..#.##..
+#.##...##.
+
+Tile 3079:
+#.#.#####.
+.#..######
+..#.......
+######....
+####.#..#.
+.#...#.##.
+#.#####.##
+..#.###...
+..#.......
+..#.###...
+