From a2283c33a4f0ad603ddeeb56cb595ee819108b8d Mon Sep 17 00:00:00 2001 From: Patrick Michl Date: Sun, 20 Dec 2020 19:10:53 +0100 Subject: [PATCH] Solution for Day 20 --- day_20/both.rb | 227 +++++++ day_20/input | 1727 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1954 insertions(+) create mode 100644 day_20/both.rb create mode 100644 day_20/input diff --git a/day_20/both.rb b/day_20/both.rb new file mode 100644 index 0000000..8dd63a1 --- /dev/null +++ b/day_20/both.rb @@ -0,0 +1,227 @@ +# frozen_string_literal: true + +require 'pry' + +# @type [Hash] +input = File.read('./input').split("\n\n").map do |tile| + tile = tile.split("\n") + id = tile.shift.scan(/\d+/).first.to_i + Hash[id, tile] +end.inject :merge + +# @type [Array] +$corners = [] + +def build_combinations(tile) + top = tile.first + rev_top = top.reverse + btm = tile.last + rev_btm = btm.reverse + left = tile.map { |a| a[0] }.join + rev_left = left.reverse + right = tile.map { |a| a[-1] }.join + rev_right = right.reverse + [left, rev_left, right, rev_right, top, rev_top, btm, rev_btm] +end + +def get_sides(tile) + top = tile.first + btm = tile.last + left = tile.map { |a| a[0] } + right = tile.map { |a| a[-1] } + [top, btm, left, right] +end + +def check_tile(tile, input) + tile_id = tile.first + combs = build_combinations(tile.last) + + t = input.map do |id, val| + next if tile_id == id + + (combs & build_combinations(val)).count + end +end + +input.each do |tile| + $corners << tile.first if check_tile(tile, input).count(2) == 2 +end + +class Tile + attr_accessor :id, :grid + def initialize(id, grid) + @id = id + @grid = grid + end + + def top + @grid.first.join + end + + def btm + @grid.last.join + end + + def left + @grid.map(&:first).join + end + + def right + @grid.map(&:last).join + end + + def grid_without_borders + out = [] + @grid.each_with_index do |line, i| + next if i == 0 + next if i == 9 + + out << line[1..-2] + end + out + end + + def edges + [top, right, btm, left] + end + + def edge_orientations + out = [*edges] + out.push(*edges.map(&:reverse)) + out + end + + def flip_vertical + self.class.new @id, @grid.map(&:reverse) + end + + def flip_horizontal + self.class.new @id, @grid.reverse + end + + def rotate + self.class.new @id, @grid.transpose.map(&:reverse) + end + + def all_rotations + out = [self] + 3.times do + out << out.last.rotate + end + out + end + + def all_orientations + out = [self, flip_horizontal, flip_vertical, flip_horizontal.flip_vertical] + out.dup.each do |tile| + out.push(*tile.all_rotations) + end + out.uniq + end + + def to_s + @grid.map(&:join).join "\n" + end + + def find_matching_right_from(tiles) + tiles.map(&:all_orientations).flatten.uniq.each do |ori| + return ori if right == ori.left + end + end + + def find_matching_bottom_from(tiles) + tiles.map(&:all_orientations).flatten.uniq.each do |ori| + return ori if btm == ori.top + end + end + + def find_monsters + count = 0 + image = to_s.lines.map(&:chomp) + image[0..-3].each_with_index do |row, y| + row[0..-20].chars.each_index do |x| + count += 1 if monster_at?(x, y, image) + end + end + count + end + + def monster_at?(x, y, image) + MONSTER.each_with_index do |regex, i| + return false unless image[y + i][x, 20][regex] + end + true + end +end + +def rotate_top_left(tl) + tl.all_orientations.each do |ori| + left_side = ori.left + top_side = ori.top + + unless $all_orientations.include?(left_side) || $all_orientations.include?(top_side) + return ori + end + end + nil +end + +# @type [Array] +$tiles = input.map do |id, grid| + Tile.new id, grid.map(&:chars) +end + +top_left = $tiles.find { |tile| tile.id == $corners.first } +$tiles.delete(top_left) +$all_orientations = $tiles.map(&:edge_orientations).flatten.uniq + +$map = [[]] +$map[0] << rotate_top_left(top_left) + +11.times do + $map[0] << $map[0].last.find_matching_right_from($tiles) + $tiles.delete($tiles.find { |t| t.id == $map[0].last.id }) + $map << [$map.last.first.find_matching_bottom_from($tiles)] + $tiles.delete($tiles.find { |t| t.id == $map.last.last.id }) +end + +(1..11).each do |y| + 11.times do + $map[y] << $map[y].last.find_matching_right_from($tiles) + $tiles.delete($tiles.find { |t| t.id == $map[y].last.id }) + end +end + +corners = [$map[0][0].id, $map[0][11].id, $map[11][0].id, $map[11][11].id] +puts "Corners: #{$corners.inspect}" +puts "Product of corner ids: #{corners.inject(:*)}" +MONSTER = [ + /..................#./, + /#....##....##....###/, + /.#..#..#..#..#..#.../ +].freeze +image = '' + +$map.each do |row| + out = Array.new(8) { '' } + row.each do |tile| + tile.grid_without_borders.each_with_index do |line, i| + out[i] += line.join + end + end + image += out.join "\n" + image += "\n" +end + +image = image.lines.map(&:chomp) +image = Tile.new 1, image.map(&:chars) + +monsters = 0 +image.all_orientations.each do |ori| + monsters = ori.find_monsters + + break if monsters > 0 +end + +puts "Monsters: #{monsters}" +puts "Num of '#' not belonging to monster: #{image.to_s.count('#') - 15 * monsters}" diff --git a/day_20/input b/day_20/input new file mode 100644 index 0000000..f9ff739 --- /dev/null +++ b/day_20/input @@ -0,0 +1,1727 @@ +Tile 3371: +##...###.# +........#. +..#.#...#. +##..#..... +##.......# +##........ +...#...... +.........# +#.#......# +.#..###... + +Tile 2663: +.#.##..#.. +.#..#..... +#........# +....#....# +.......### +....##.... +##.#.##.## +.##..##..# +.........# +........#. + +Tile 1063: +####...### +..##.....# +.#..#....# +##...#.... +#..##...#. +#........# +##.......# +.......... +.#.#....#. +.###....#. + +Tile 2731: +.####.#.## +#......... +.#.#.##.#. +##..#..#.# +#.#.#....# +####...#.# +#.....#.## +##.##..... +..#..#..## +......#..# + +Tile 2711: +#.##..#..# +#...#...## +.#.###...# +......#..# +#.....#..# +....#.#... +.#......## +....#.#..# +.......... +###..####. + +Tile 1087: +...#.##### +#......... +.....#...# +#.#..#...# +####.#..## +..#.#..#.# +.#..##...# +##...##..# +........#. +##...#.... + +Tile 2767: +###...#.#. +#.###....# +......##.# +.#........ +##....#... +.#.#...... +.#..#.##.# +#.#.###... +#........# +..##..###. + +Tile 1951: +#...#...## +.......... +#.......#. +.........# +...#....## +#.##...### +#.##.#..## +...##....# +...#...... +##.####### + +Tile 2347: +#..##.###. +.........# +#.#......# +.#....#... +.......... +###......# +...###.#.# +#...#..... +......##.# +#.......## + +Tile 2243: +.#.#...#.. +#......... +#..#.#...# +.........# +#........# +#....#...# +#.....#..# +........#. +#......... +.#.#.#..#. + +Tile 3019: +.##...#.## +......###. +......##.# +..#.....## +#.#.....#. +##.....#.. +...#...... +#.##..#... +###....#.# +##..##.##. + +Tile 2851: +...#.##..# +........## +###..#...# +#......#.. +#...#..... +..#..##... +##.#...#.# +...#..##.. +..#..#..#. +#####..... + +Tile 2267: +#####.##.. +.....##..# +#.#....... +#........# +#.#...##.. +...###.... +#.#.....#. +.##....... +..#....... +.#..####.. + +Tile 2351: +#.#....#.. +#..#..#... +###....#.# +#..#.#...# +##...#.#.# +#.#..#.##. +.#..#.##.# +......#.#. +###....#.# +....###.#. + +Tile 1373: +..###..##. +..##....## +##..#.##.# +.#...#.... +..#..#...# +###....#.# +..##..#..# +...#.....# +#.#...##.. +#..##..##. + +Tile 2917: +###.#.#.#. +#........# +.#......## +....##...# +.........# +#......#.# +...#...... +..#.##..#. +#..###..#. +.#..##.#.. + +Tile 2423: +#.......## +#......#.. +.....#.... +##.#...... +.#.#..##.# +..#....### +#........# +.....#.... +#.....#.## +..###.#... + +Tile 3331: +.....##.## +#........# +#......... +#....#...# +.#.#....#. +#.#...#... +#..#...... +.#.......# +.......... +.#....#.#. + +Tile 1297: +.##.##.... +.......#.. +....#.#.#. +.#........ +....#..... +..#..#..#. +#.......## +#...#..... +#..#....## +.#.###.#.. + +Tile 3923: +...###.##. +#...#..... +.#........ +.#.#...... +#...#..... +.....##.#. +.....#...# +#...#.#... +#.....#... +.#.......# + +Tile 1571: +..##..##.# +..#..#..#. +#........# +...#...... +#.......#. +##........ +#......... +#...#.#... +.##.#....# +.##.#..#.. + +Tile 3461: +.#....#..# +........## +#...#...#. +.#...##... +.###...... +.......... +#..#....#. +#........# +.##..#...# +.##.#.#.#. + +Tile 1291: +#.#.#...#. +####....## +..#..#.#.# +....##...# +.......#.. +#.....##.. +....#...#. +..#..#..#. +#.###....# +...####.#. + +Tile 2179: +#.###.#... +#....###.. +...#.....# +#......... +...#.....# +...#.#.... +#........# +#........# +.........# +.#..##.... + +Tile 2153: +#...#....# +##...###.# +#...#..#.. +#....#...# +#......... +.#..#....# +#....#...# +#..#.#..#. +....#.#..# +##..###.## + +Tile 2621: +###..#..## +.......#.# +#........# +....##...# +##..##...# +#......... +..#......# +.....##..# +###.#....# +..##.##.## + +Tile 3347: +#.#..#..## +.#.......# +###..###.# +#...#.#..# +#....###.. +.##.#.##.# +#...#.##.. +.##.##.... +##..##..## +#.#....... + +Tile 3001: +#...###... +#......#.# +#.....#### +#....#.... +##.##.#... +#.#....... +.....#..#. +....#.#.## +#.....##.. +#.#..#.### + +Tile 2707: +.###..#..# +..##...#.# +##.##.#..# +....##...# +#...#..### +#......#.. +#......... +#.#......# +.........# +#...#.#... + +Tile 3041: +#....##.#. +.#..#..#.# +.........# +###....### +...#.....# +..##..#..# +.#......#. +##.......# +..###.##.. +#.#..##..# + +Tile 1709: +.##.#....# +.........# +#.#.##.... +###.....## +#.....#... +#.....##.. +.........# +#........# +..#..#..## +.####.##.# + +Tile 2837: +.#...#.##. +###..#...# +#..###..## +....#..... +#........# +.......... +#......#.# +....#...#. +..#..#.... +...#....## + +Tile 1741: +.####.##.. +.##......# +#.###..... +...#...#.# +.......... +##.#...... +....#....# +........#. +.......... +#....#..#. + +Tile 2383: +...##..... +....#..#.. +......#... +#####....# +.........# +......#... +#......#.# +##.....#.# +#.#...##.# +##.#.#..#. + +Tile 1823: +######..## +....#..... +..#...#... +##........ +.##....... +...#...... +#.......#. +##.#.#..## +#...###.## +#...#....# + +Tile 2003: +##..##.### +#.##.#.#.# +.#.#...... +...#...#.. +..#.#..... +.#........ +..#.....#. +#.#..#.#.# +##..##..#. +.##....#.. + +Tile 1367: +..#.###... +..#.##.### +##.####..# +#......### +##......#. +#.#...#..# +#..#.##... +.##....### +#...#..### +.####..#.. + +Tile 3733: +..#.###..# +.#....##.. +.##..#..## +..###....# +.........# +.#........ +.##.....#. +#....#...# +....#.#..# +.####....# + +Tile 3607: +..##..#### +.........# +.........# +.......... +#..#...... +#.#.##..## +.#..#...## +#....###.# +.#.#..#... +#...###... + +Tile 1559: +####.#..#. +##.#...... +.#..#.#.#. +#...#....# +##.##...#. +...#....#. +##.......# +...#...#.# +##..#...#. +#.#####.## + +Tile 2617: +.#..#..... +.........# +...##..#.# +...#.#.#.. +.#..#..... +#.#...#... +#......#.. +#....#...# +.##.##.##. +...####..# + +Tile 1249: +..##.###.. +.........# +#.....#..# +.#..#..... +#..#.....# +#........# +......#... +......##.. +#.#..#...# +#.##.....# + +Tile 1019: +##.##.###. +##....##.. +##........ +...#.##... +#.......#. +#........# +....##.... +..#.#..#.. +#......... +.#..#.##.# + +Tile 1451: +#.#.#..#.# +#.......## +#...#...## +#..#...... +..##...##. +....#....# +.#.#...... +....##.... +....#....# +.##...##.. + +Tile 1433: +##..###..# +...#...##. +#.##.....# +###....#.. +.....#..## +#...###..# +#......... +.....#...# +#...##.... +###..#.... + +Tile 3803: +.#..##.... +.###.....# +...#.....# +#........# +#.......## +#.##.....# +#.......#. +#......... +......###. +#..#.###.. + +Tile 3181: +###.#...#. +#.#......# +...#.#.#.. +.....#...# +.......... +........#. +###....... +#.###....# +###....#.. +.###.#.##. + +Tile 1831: +#..#..#.## +##...#.#.# +##......## +#..#....#. +##..#...#. +..#....... +#.##.....# +##.#....#. +#.#....#.# +##.###.##. + +Tile 2843: +.###...#.# +......##.# +#.#......# +##.#...#.# +.##.#..... +.#......#. +#.#.#....# +##........ +.......... +###.##..#. + +Tile 3691: +..#####... +.........# +#....#...# +.#...#..## +.......... +##....#.#. +#........# +#.#.#..... +#.#...#... +..#..##.## + +Tile 1327: +.#...#...# +#.....#.## +#..#.#..#. +##.......# +..#......# +#.#....... +..#..#..## +.#....##.. +#.#......# +.##..#..#. + +Tile 1669: +##.#.....# +.........# +......#.#. +..##....## +#.#....... +.###...... +#..#...... +.#.#...#.# +#..#...... +#..#..#.#. + +Tile 2819: +...#..##.. +#........# +#.......#. +#......... +.......#.. +#...#..... +.........# +#.#.#..#.. +#...#..#.. +#####..#.# + +Tile 1873: +....#.#### +#.#.#..### +.......... +.....#.... +#.#.....#. +#..##.#... +..#...###. +.#........ +#.#..#...# +##.#.#.... + +Tile 2441: +.####.#.#. +...#...##. +....#..... +#...#..... +#......... +#.....#.## +#.#....#.. +#...#....# +.........# +#####....# + +Tile 1867: +#..##..##. +#..#...... +#..#.#..## +....#...## +.#.##....# +....#..... +#......#.. +##......#. +#...#....# +###.#..#.# + +Tile 1993: +.#..###### +#.###...#. +...###.... +......##.. +#...#...#. +...###.#.# +..##...#.. +#.###.###. +...#.....# +...#.#.##. + +Tile 2087: +####...#.# +#..###..#. +..##..#..# +#....#...# +.#..#..#.. +.......#.. +#.#..#.... +.##.##.#.# +..##..#... +##..#.##.# + +Tile 1973: +#.###.#.## +.......#.# +.##...#... +....#.#### +#.#......# +#..#..#.#. +#......##. +...#...##. +#..#.##..# +#.....#.## + +Tile 2579: +#....###.. +...#...#.# +#.......#. +....#....# +#......... +......#.## +.....##... +...#.###.. +.#.#...#.# +#.####.#.. + +Tile 1583: +#.#...###. +#.....#..# +##....#..# +........## +...#....## +....#.#... +.##....#.# +.......#.# +..#....... +.#....##.# + +Tile 2971: +...#.###.. +#....##..# +##...##..# +##..##.##. +..##....## +#......... +##....#..# +#......... +..#.....#. +.#.....### + +Tile 3719: +#..##..#.. +.......... +#...#....# +......#..# +#.#..#.... +#..#...#.. +##.....### +#.#....#.. +#.##.#..## +..##...#.. + +Tile 1151: +.#...##... +#....#...# +.........# +#...#....# +.........# +.......... +##.......# +..##...... +.......#.. +##.##.#### + +Tile 3373: +...###.... +##...##..# +##...#.... +#....#...# +#.......#. +.........# +#...#....# +#.....#..# +#........# +#..##...## + +Tile 3571: +.#.#.#.### +#...#.#..# +#..#.....# +#..#.#.##. +..#....... +####....## +....##.#.. +#....#...# +.#......#. +.#..#.#... + +Tile 2137: +.#...###.. +#..#...... +.###...... +#...#..... +#...##..## +#...#..#.. +##.#...... +.....#...# +.......#.. +.#...#.#.. + +Tile 2377: +.....##... +..#......# +...#...... +#...#..... +..#...#..# +.#.#....#. +..##..#.## +.........# +.......#.. +#.#.##...# + +Tile 3407: +#..#..#### +.#......## +###....##. +...##.#... +###...#..# +##...##..# +...#.....# +.......... +...#.#.#.. +......#... + +Tile 1733: +###.####.# +...#..#.## +#....#.... +##..#.#... +#......... +#.#...#..# +.#..##..## +.#.....### +#........# +#...#.#.## + +Tile 3989: +.##.###### +........#. +.#....#### +#....#.... +.......... +.......... +.......#.# +#.##.#..## +##.#..##.. +..##..#### + +Tile 1051: +.####.#### +.......... +#.##....## +....#....# +.......... +#........# +.....#.#.# +##.....#.# +......###. +.#...####. + +Tile 3643: +.#.....#.# +.###...#.# +.......... +.#.##....# +##..#..#.# +##...#.... +.......#.# +.........# +..#.#....# +#.#...##.. + +Tile 3677: +...#.##... +#..###.#.# +.#.#..#..# +.##..#.... +#......... +.........# +#..#.....# +#..#..#..# +#..#....## +..#..#.... + +Tile 2063: +#.###.#### +#....###.# +......#..# +.........# +.###.....# +.#..#.#### +...#.##..# +.......... +#.#...#..# +..#..##..# + +Tile 3821: +...#...#.. +#..#.#...# +....#....# +..#.##...# +#.#.#..... +#......#.# +.......##. +......#..# +..#..#.... +#.###...## + +Tile 2477: +#..######. +....##.... +.#.#....## +.......... +..#...#..# +#......... +#...#...## +##......#. +#........# +#####..... + +Tile 2647: +##.#...### +##...##... +#..#...... +..#......# +#.#......# +#......... +##.#.....# +..#...#### +#........# +..####...# + +Tile 2749: +...#...### +##.......# +.....#..#. +#...#....# +#.#.....## +#...#..... +......#.## +.#.###.#.. +#.#.#..#.# +..#.#..##. + +Tile 2531: +#...##.#.. +.#..#..#.. +####.....# +#.#....#.. +...#.#...# +#.......## +####...... +###......# +.#.#.#...# +..##.##... + +Tile 3833: +.#.#.##..# +..##...#.. +..##.....# +###.....#. +.#...#.... +.##......# +...#...... +......#..# +.##....... +.##...#... + +Tile 2777: +....#.#.## +.#..##...# +#........# +#......... +..#....#.# +..#....... +#...#....# +.#..#..... +#.#.#..... +..##..#... + +Tile 2417: +####..#.#. +#..#.....# +#...#...## +......#... +.#....#..# +#...#....# +.......#.. +.#..#....# +#........# +##..#.##.# + +Tile 1531: +###...#.## +....#.#..# +.......... +..#.#..... +.#.....#.. +...#...#.. +#...#..... +##..#.#..# +#......... +.#.#.###.. + +Tile 2969: +#.##.###.# +..###.#.## +..#....#.# +##......## +........#. +#........# +##......#. +..#..##... +...#...... +.#....##.. + +Tile 1567: +##...##... +#....#...# +##.......# +#....#...# +........## +#.#..#.... +..#.....#. +#...#..... +.........# +#..###.#.. + +Tile 3779: +..######.# +###..#.... +....#..... +#........# +....#..... +#.#.#....# +.....#...# +...#.#.... +##..#.#... +###.###.## + +Tile 3467: +##..####.# +#.....#... +.....#...# +...#...#.. +....#..... +##..#.#... +#.##.....# +.#........ +##........ +##..#.#... + +Tile 2381: +#..#.##### +..###...#. +#..##.##.. +###...###. +#.#.....## +.....#.... +.......#.# +#.......## +#....#.#.# +##..#.#.#. + +Tile 3433: +#####..#.# +......#.## +.#..#..... +#......#.. +##.......# +....#.#..# +.......#.. +....#....# +....#....# +.#.###.### + +Tile 3559: +##..##.#.. +#......... +..#......# +..##.....# +#..#..#..# +######...# +#.....#..# +.....#.... +#......... +##..#..#.# + +Tile 1321: +.#...#.... +.#....#..# +#...#....# +#......... +#......... +#.##.##.#. +.#..#..### +..##.###.. +#...#...## +.#..#.#... + +Tile 1597: +##.##.##.. +.......... +#........# +#...###..# +#..#...... +#...##...# +###....... +#......... +####.#.#.# +.#.#.#...# + +Tile 2833: +.......### +.#.#.....# +#......... +#....#...# +###....... +..#....### +#.....#... +#..###.... +.#..#....# +.###...#.. + +Tile 3911: +.###.##..# +......#.## +#........# +......#... +.#........ +.......... +...#...... +..#.#....# +.#....#.## +..#.#..#.. + +Tile 1663: +####...#.# +#...#.#..# +.#.....### +.....##.#. +#......#.. +..#.....## +.........# +##.#.....# +#......##. +.#..#..... + +Tile 3469: +.#.##..#.# +.###....## +#.....#... +....##.#.# +....##.... +....###..# +..#.###..# +#...#....# +#........# +##.##..#.. + +Tile 1427: +#.#.##.### +#....#.#.# +###......# +#..#...... +#..##..#.# +..#..#..## +#....#.#.. +.#....##.# +#..##.#... +#...#.#... + +Tile 2311: +..###..#.# +.......... +...##.#... +#......... +#......... +#.....##.. +.#..#....# +.....#...# +#....##... +#####.##.# + +Tile 1997: +.####....# +##.....#.# +#.......## +...#....#. +.###..#.## +#....##..# +#.......## +..##...... +#..#..#..# +##.###.#.# + +Tile 1987: +####...##. +##....#..# +.#...#.... +#.....#..# +.......... +#......... +#.#....... +.......... +.......... +#.#.#.#..# + +Tile 3527: +#....##.#. +..###.#.## +....#....# +##......#. +....#....# +#..##..... +#....#...# +..##.#..#. +#........# +..#.#####. + +Tile 3023: +#...#...#. +.###...... +......#..# +#..#...... +#...#.#..# +....#..... +#.......#. +....#..... +.......#.# +..#.##..#. + +Tile 2539: +#.....#.#. +....#....# +#...##.... +##....#.## +.#.#.....# +..#....#.# +#..#....#. +..#.#....# +#.#....... +###..####. + +Tile 1033: +..#....##. +.........# +#........# +.......### +.....#.### +...#...#.# +...#....#. +##.......# +........#. +#...#..#.. + +Tile 1301: +.#.#....#. +#...#..#.. +....#..... +..#......# +...#.#.... +#......#.. +#..#.#.... +..#....... +...##..... +..#...##.# + +Tile 3169: +###..##... +#....#...# +.....##... +.##.#..#.. +#....##... +......#.## +..##.....# +#..#.....# +....####.. +.#.##..##. + +Tile 1021: +#.##..#..# +...#.....# +##........ +.........# +#..#...... +....#..... +......#..# +#........# +#......#.. +.#.#.####. + +Tile 1303: +.#.#.#.#.# +..####.... +#...#..#.. +#...#..### +.......... +...##.#..# +.##....#.# +#.....#... +##.......# +..##.####. + +Tile 3631: +.#.##..##. +#....#.#.# +##.......# +#......#.# +#..#....## +....#..... +........#. +..#....#.# +#.#......# +##.#..###. + +Tile 2957: +.....###.# +#..#...... +#..#...#.# +...#.....# +.........# +..#....#.# +#......#.# +....#....# +#.##.#...# +####..#.## + +Tile 3229: +##.#####.# +.....#...# +......#..# +......#... +#.....#... +#..####... +.....#..#. +#...##.... +#...##.... +..###...## + +Tile 3089: +#####.#.## +#......... +##...#..#. +....#..#.. +##.##..... +.#..#...## +#.#....#.. +#.....#..# +.....##... +#...###### + +Tile 2791: +.##.##.#.# +#.......#. +..##.##... +###....... +.......#.# +###..#.#.. +#.#.#.#.#. +#...#.#... +#........# +##..###..# + +Tile 2273: +...#..##.# +...##....# +.#........ +......#.## +#####....# +##...#.##. +........#. +.......##. +#..#....## +#.##..#.#. + +Tile 3919: +##.##.##.# +...##...## +#......#.. +#.....#.#. +..#.#...#. +..#....#.# +##.#...### +....#..... +#.#.#..#.. +..#.##...# + +Tile 3637: +##.##..... +#...###... +.........# +#......... +#...#..#.. +#...#.#... +...#.....# +....##..## +..#..#...# +#..#####.. + +Tile 2161: +#..###...# +.......... +...#...... +.#.......# +#...#..... +#..##.##.# +.####..#.# +....###... +##......#. +..##.#.### + +Tile 3449: +.###.##.#. +.........# +...##....# +#.#..#.... +.#.#.##..# +#....###.# +.#...##.## +..##.#...# +....#....# +.##.##.### + +Tile 2287: +#..#.....# +...#.#...# +....#...#. +.#.......# +#....#.#.# +.........# +#......### +#..##.#... +#.#....#.. +....#...## + +Tile 2789: +#.#.#.##.. +....#...## +###.#.#... +#..#.##..# +#.....#..# +......#... +..#..#..## +..#.###..# +#.....#... +.....###.# + +Tile 2143: +#.#...#... +#.#.#...#. +...###.#.# +#..##...#. +#........# +........## +.......... +##....##.# +..#.....#. +#.#####..# + +Tile 2089: +.##....### +.#.#...#.# +.#...##..# +#....#.... +##....#... +#....#...# +......#... +...#.#.... +..##.#...# +.##....... + +Tile 3457: +#...###..# +#...###... +#.......#. +##......#. +#.....##.# +.......... +##..#.#... +....#....# +.#...#.#.# +..####.... + +Tile 2609: +........#. +......#..# +#.##...... +#........# +..###....# +#.#..#..## +......#.#. +##........ +#.....#.#. +#.#.###.## + +Tile 1187: +.#######.# +#....#.#.# +#.#.###... +.##.###..# +#.#.#....# +#.......## +..#..#.... +.##...#..# +.....##..# +.#...#.... + +Tile 2341: +###.##.#.. +#...#..### +#...#....# +....###..# +..##.....# +.##....... +##...#..## +###.#..... +......#.#. +.#..###... + +Tile 1171: +##....###. +........## +#........# +.......##. +.#.#....#. +.....##..# +#..#...... +....#....# +##....#..# +##..#####. + +Tile 1949: +.....###.. +...#.#...# +#..##..##. +#...#..... +...#....#. +..#.#..### +#..##..... +#.##.....# +#.#.#.#.#. +..#.#..### + +Tile 1871: +##.##.#### +###....... +#..#..#... +#..#.....# +#....#.... +..##....## +......#... +..#....... +#..#.#.### +#..#.##... + +Tile 3907: +####...... +#....#...# +....#.#... +#..#...### +....##.##. +.......... +#........# +.....##.#. +#...#..##. +.##.#...#. + +Tile 1723: +..#.#..#.# +#......... +.#..##...# +#......... +#..##..#.# +..####..#. +#........# +#.....#..# +#..#...... +.#.#.##.#. + +Tile 1237: +#.#....... +#..##..... +.......... +.#..#..#.. +####...### +..##.#...# +#.....#... +..#....... +.....#..## +....#..### + +Tile 2897: +#.#...#..# +......#... +#...##...# +........#. +#........# +#....#.#.. +.....#...# +#..#...... +#......#.# +.##....... + +Tile 2659: +##.##..#.# +##..#....# +###.....## +..#.....## +#.#...#... +##......## +#..###...# +#........# +.##.....#. +#.##.###.# + +Tile 1931: +#...#.#.#. +#....#.... +....#..#.. +.......... +#....#.... +....#...#. +.....#...# +.......#.# +#..#..#..# +####...##. + +Tile 1423: +#......#.. +#...#....# +#........# +#........# +#..#...... +.......... +##..#..#.# +.......... +......#..# +#.#.#.#### + +Tile 1163: +.####...## +.........# +#..##..... +#......... +#...#..... +....#..#.# +.#.......# +##........ +#.....#.#. +...##.##.. + +Tile 1429: +.#.#.#.#.. +##.#.##..# +....#....# +##....##.# +##.#.....# +#....#...# +...#..#..# +.......... +#.....#..# +.#####..## + +Tile 1523: +.##.#..##. +.....##... +##..##.... +....##.### +##.#...#.# +..#......# +....#..... +##...#...# +##...#.... +...###.##. + +Tile 2029: +#.###...#. +.##....... +........#. +#......... +#..#....## +....#.##.# +#.#...#... +..#..#..## +#..##....# +..###..#.# + +Tile 1213: +.##.##.#.. +##....#..# +#.#..###.. +.......#.. +#...#..... +#....##..# +#........# +#....#.... +..#..#...# +.##.##...# + +Tile 1697: +.#.......# +..####.... +....#..... +#....#.... +........#. +#.....#... +#........# +...#...... +.......... +..#......# + +Tile 3389: +###....#.. +#..#...... +##..##.#.# +#.##....## +#.....#..# +.........# +...##..... +##.....#.. +#......... +.####.#...