aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Dessaux2023-12-15 13:17:21 +0100
committerJulien Dessaux2023-12-15 13:17:21 +0100
commit2625cd05dae00e4a0093f1482af960ba32e7445f (patch)
treea4122d24dcdd59039b664f6401732a4321b6a452
parent2023-12 part 2 in haskell (diff)
downloadadvent-of-code-2625cd05dae00e4a0093f1482af960ba32e7445f.tar.gz
advent-of-code-2625cd05dae00e4a0093f1482af960ba32e7445f.tar.bz2
advent-of-code-2625cd05dae00e4a0093f1482af960ba32e7445f.zip
2023-13 part 1 in haskell
-rw-r--r--2023/13-Point_of_Incidence/example16
-rw-r--r--2023/13-Point_of_Incidence/first.hs73
-rw-r--r--2023/13-Point_of_Incidence/input1380
3 files changed, 1469 insertions, 0 deletions
diff --git a/2023/13-Point_of_Incidence/example b/2023/13-Point_of_Incidence/example
new file mode 100644
index 0000000..b056c34
--- /dev/null
+++ b/2023/13-Point_of_Incidence/example
@@ -0,0 +1,16 @@
+#.##..##.
+..#.##.#.
+##......#
+##......#
+..#.##.#.
+..##..##.
+#.#.##.#.
+
+#...##..#
+#....#..#
+..##..###
+#####.##.
+#####.##.
+..##..###
+#....#..#
+
diff --git a/2023/13-Point_of_Incidence/first.hs b/2023/13-Point_of_Incidence/first.hs
new file mode 100644
index 0000000..b7f19bc
--- /dev/null
+++ b/2023/13-Point_of_Incidence/first.hs
@@ -0,0 +1,73 @@
+-- requires cabal install --lib megaparsec parser-combinators
+module Main (main) where
+
+import Control.Applicative.Permutations
+import Control.Monad (void, when)
+import Data.Char qualified as C
+import Data.Either
+import Data.Functor
+import Data.List qualified as L
+import Data.Map qualified as M
+import Data.Maybe
+import Data.Set qualified as S
+import Data.Vector qualified as V
+import Data.Void (Void)
+import Text.Megaparsec
+import Text.Megaparsec.Char
+
+import Debug.Trace
+
+exampleExpectedOutput = 405
+
+data Tile = Ash | Rock deriving (Eq)
+instance Show Tile where
+ show Ash = "."
+ show Rock = "#"
+type Row = [Tile]
+type Pattern = [Row]
+type Input = [Pattern]
+
+type Parser = Parsec Void String
+
+parseTile :: Parser Tile
+parseTile = char '.' $> Ash
+ <|> char '#' $> Rock
+
+parseRow :: Parser Row
+parseRow = some parseTile <* eol
+
+parsePattern :: Parser Pattern
+parsePattern = some parseRow <* eol
+
+parseInput' :: Parser Input
+parseInput' = some parsePattern <* eof
+
+parseInput :: String -> IO Input
+parseInput filename = do
+ input <- readFile filename
+ case runParser parseInput' filename input of
+ Left bundle -> error $ errorBundlePretty bundle
+ Right input' -> return input'
+
+compute :: Input -> Int
+compute = sum . map findMirror
+ where
+ findMirror :: Pattern -> Int
+ findMirror xs = 100 * findMirrors xs 1 + findMirrors (L.transpose xs) 1
+ findMirrors :: Pattern -> Int -> Int
+ findMirrors xs i | i == length xs = 0
+ | not identical = next
+ | otherwise = i
+ where
+ (is, ts) = L.splitAt i xs
+ next = findMirrors xs (i+1)
+ is' = reverse is -- we need to flip the left side
+ identical = and $ zipWith (==) is' ts
+
+main :: IO ()
+main = do
+ example <- parseInput "example"
+ let exampleOutput = compute example
+ when (exampleOutput /= exampleExpectedOutput) (error $ "example failed: got " ++ show exampleOutput ++ " instead of " ++ show exampleExpectedOutput)
+ input <- parseInput "input"
+ print $ compute input
diff --git a/2023/13-Point_of_Incidence/input b/2023/13-Point_of_Incidence/input
new file mode 100644
index 0000000..62f9d20
--- /dev/null
+++ b/2023/13-Point_of_Incidence/input
@@ -0,0 +1,1380 @@
+##..#..#......#
+.........#..#..
+.####.#.######.
+#....#.###..###
+..##..#.#.##.#.
+######...#..#..
+#.##.#.#.#..#.#
+#....#..######.
+.#..#...#.##.#.
+#....#....##...
+.#..#.#..####..
+......#.######.
+##..##.#.####.#
+
+.#...##..
+..##.#.##
+.#.###...
+###..#.##
+##.#.####
+..#.#..##
+.###...##
+.#...#.##
+#####.#..
+...#..###
+###.##.##
+####...##
+####..###
+###.##.##
+...#..###
+
+#####...####.#.
+##..###..#..#.#
+...#.###.....#.
+...#.###.....#.
+##..###..#..#.#
+#####...####.#.
+##....####.....
+#..##.....#..#.
+#..##.....#..#.
+##....####.....
+#####...######.
+##..###..#..#.#
+...#.###.....#.
+
+#..##...#
+#..#..###
+#..#..###
+#..##...#
+.##..#.#.
+.....###.
+#..#.##.#
+...#..###
+.##.#..##
+.##.#.#.#
+#####.#..
+
+######.#.#.#...
+.#..#.#.##...#.
+...#....#.#.#..
+#.##.#.#.....#.
+.......##.#.###
+#######.##.#..#
+......##...##..
+#.##.#....#.#..
+#.##.#....#.#..
+
+#...#..##..
+.##..######
+....###..##
+.#..#..##..
+.####.####.
+###.##....#
+.#..##...##
+###.#..##..
+#.#.#......
+.####......
+....#.####.
+..##..#..#.
+..#.#.####.
+..#.#.####.
+..##..#..#.
+
+#...#.#.##.#.#...
+###.#..#..#..#.##
+#...##.####.##...
+#.....#.##.#.....
+...#####..#####..
+##..#.######.#..#
+###.##.#..#.##.##
+...#..#.##.#..#..
+....#........#...
+#..##.#.##.#.##..
+#................
+
+...##.###.#
+...##.###.#
+##..#....#.
+##.....#.##
+#.##..#.#.#
+..##...#.#.
+...#####..#
+
+.##.##.#.##..
+#..#.#.#.....
+####.###..#.#
+####.####.###
+#..#.#####.##
+#..#.#....###
+#..#.#....###
+#..#.#####.##
+####.####.###
+####..##..#.#
+#..#.#.#.....
+.##.##.#.##..
+.....##.#.#..
+####..#.#.##.
+#####.#...###
+#####.#...#..
+#..#...####.#
+
+#..#.#...#...##..
+...#...#..#..##..
+#..####.#.#.####.
+..#####..#.##..##
+..#...####.##...#
+.#.#########....#
+.#.#########....#
+
+#..#...#.#.#...#.
+#.####...###.#.#.
+#.....##...##.#.#
+##.##....#....#..
+#.....##....#....
+..##.##.#...#..#.
+..##.##.#...#..#.
+#.....##....#....
+##.##....#....#..
+#.....##...##.#.#
+#.####...###.#.#.
+#..#...#.###...#.
+......#.#..##....
+......#.#..##....
+#..#...#.###...#.
+#.####...###.#.#.
+#.....##...##.#.#
+
+....#..
+#.##...
+#.###..
+#...##.
+.##..##
+.##..##
+#...##.
+#.###..
+#.##...
+
+##.##.#..
+..#..#..#
+...#####.
+..#....##
+##.##.##.
+##.##.##.
+..#...###
+...#####.
+..#..#..#
+
+...####.....#####
+.#......#.####..#
+.#########.##....
+####..#####.#####
+..######..#...##.
+#.##..##.#....##.
+....##....##.....
+#........#.#.....
+....##.....#.....
+...#..#.......##.
+#.######.##......
+.##....##.###.##.
+...####...#..#..#
+
+.#...###..###...#
+##..##.#....##..#
+.#.#.########.#.#
+.######.##.######
+.##.#...##...#.##
+.#...########...#
+.#.#...#..#...#.#
+#..#....##....#..
+#..####.##.####..
+#.##..##..##..##.
+..#...#.##.#...#.
+#..#..........#..
+#..#..........#..
+
+....#..###....#
+#..#..#..#....#
+#..##.....####.
+.##..#..#..##..
+####.###..####.
+###.#.##.#.##.#
+.##..#..##....#
+#####.###..##..
+####..#...#..#.
+#..#....#..##..
+#..####..##..##
+......#.##.##.#
+.##...#########
+.........#.##.#
+.##..######..##
+#..####..#....#
+.##.####..#..#.
+
+#..#.##...#.##.
+###.##.##.#...#
+##.########.#.#
+.#.#.##.#...###
+.#.#....####...
+.#.#....####...
+.#.#.##.#...###
+##.########.#.#
+###.#..##.#...#
+#..#.##...#.##.
+#..#.##...#.##.
+
+.##..####..##..
+####..##..#####
+.#.#.####.#.#..
+..##..##..##...
+#....#####...##
+####.#..#.#####
+##..........###
+#.#.#....#.#.##
+#...##..##...##
+.##.##..##.##..
+..##..##..##...
+....#.##.#.....
+###.######.####
+
+########..#.##.#.
+######..######.##
+#.##.#.#.###.###.
+#....#.#.####.###
+#....##..#..###..
+......##.##..###.
+..##..#..#.###..#
+..##..#.#.##...#.
+##..######..##..#
+##..######...#..#
+..##..#.#.##...#.
+..##..#..#.###..#
+......##.##..###.
+#....##..#..###..
+#....#.#.####.###
+#.##.#.#.###.###.
+######..######.##
+
+#.####..##..#
+#.#.#........
+.#.###...#..#
+#...#..##....
+...#.#.###..#
+#..####.#....
+#####.#..#..#
+.##..####....
+.....#...#..#
+##.#...#.####
+.....###.....
+###..##.#....
+.#..##.#.####
+#...#..#..##.
+##...#.......
+.#...#.......
+#...#..#..##.
+
+...#..##.
+..#.#.#.#
+######.##
+#####.###
+..####...
+######..#
+######..#
+..####...
+#####.###
+######.##
+..#.#.#.#
+...#..##.
+#..###.##
+####..##.
+...#.#..#
+...###.#.
+..##.##.#
+
+.####.....#.#
+........#.###
+##..##...##.#
+..##...####..
+..##...####..
+##..##...##.#
+........#.###
+.####.....#.#
+######.##.#..
+.#..#.####.#.
+##..####.##.#
+#.##.##..#...
+##..########.
+##..##.##.#.#
+.####....#.#.
+.....#.#.#.#.
+.#..#....#.##
+
+#..########..##
+#............##
+#.##########.##
+.#.#.####.#.#..
+##.#......#.###
+.#.###..#.#.#..
+###.######.####
+#.##.####.##.##
+##.##....##.###
+#.#.#.##.#.#.##
+#.##......##.##
+
+.#......#..####.#
+#.#.#####.#.###..
+##..##.#..#...##.
+.##.#..###...#..#
+.##.#..###...#..#
+##..##.#..#...##.
+#.#.#####.#.###..
+.#......#..####.#
+#..##.#.##..#.#..
+#..##.#.##..#.#..
+.#.....##..####.#
+#.#.#####.#.###..
+##..##.#..#...##.
+
+.#....#......#.
+..#.##.######.#
+...#.#..#..#..#
+##..#.###..#.#.
+##.............
+##..#.########.
+..#.##..####..#
+..#.##..####..#
+##..#.########.
+##.............
+##..#.###..#.#.
+
+####.##
+###..##
+#.#####
+##..#..
+#......
+####.##
+#.#....
+..###..
+..#####
+#.#....
+####.##
+#......
+##..#..
+#.#####
+###..##
+####.##
+#####..
+
+###.##.....
+##.##..#..#
+##.##.....#
+###.##.....
+#####...#..
+..#########
+########.##
+##.###...##
+..#..#..#.#
+..##...##..
+...####.#.#
+
+#.##...#....#
+##....##....#
+##..##..#..#.
+##..##..#..#.
+##.....#....#
+#.##...#....#
+.##.....####.
+#####..#.##.#
+#.####.#.##.#
+.#.##.#.#..#.
+#...#.#..##..
+###..##.####.
+.#####.......
+
+#..##.#
+#.###..
+#.###..
+#..##.#
+.##.##.
+...#...
+#..###.
+#..##..
+#..#..#
+#..#..#
+#..##..
+#..###.
+.#.#...
+
+.###.##
+.##.###
+##.....
+##..#..
+.##.###
+.###.##
+#...###
+
+..##..#.##.
+.#..#.....#
+.#..#.##.#.
+######.####
+..##.......
+..##.......
+######.####
+.#..#.##.#.
+.#..#.....#
+..##..#.##.
+#........#.
+########..#
+##..##..##.
+
+..######.....#...
+...........##.##.
+.#.####.#....####
+.#..##..#.####..#
+####..#####......
+###########.#.##.
+.#..##..#..###..#
+###.##.###...####
+#..####..##.#####
+
+###.#####..##..
+...........##..
+.#.##...#..##..
+.#...##.##....#
+.....#.###.##.#
+..#####..#....#
+##..###..##..##
+####.##...#..#.
+.#.##..##.#..#.
+.####...##.##.#
+...#.##..######
+..#..##..######
+..#..###..####.
+..#..###..####.
+..#..##..######
+.#.#.##..######
+.####...##.##.#
+
+..##.##..#.....
+..##.##..#.....
+.##...##.##...#
+.....##..##.##.
+#####.####..##.
+.#......#.##..#
+....##..###.##.
+
+#..####
+##.##..
+..#.#..
+..#.#.#
+..#...#
+.....#.
+.#.#...
+.#.#...
+.....#.
+..#...#
+..#.#.#
+
+#.###.#
+#####.#
+.##..#.
+.##..#.
+#####.#
+#.###.#
+...####
+.#.##.#
+......#
+
+#.##..##.####.#
+..######..##..#
+###....###..###
+...####...##...
+#........####..
+###.######..###
+##.####.##..##.
+##..##..######.
+.#......#.##.#.
+#.#....#.####.#
+##......######.
+..#....#..##..#
+###.##.########
+.#......#.##.#.
+.#......#....#.
+
+.##........#.
+...#.##.##..#
+.#..###..####
+...#.....####
+.#....##..###
+#..#...#.#...
+#.#...#.##.#.
+#.#...#.##.#.
+#..#...#.#...
+##....##..###
+...#.....####
+.#..###..####
+...#.##.##..#
+.##........#.
+.##........#.
+...#.##.##..#
+.#..###..####
+
+....##....###
+.########....
+##.#..#..####
+#...##...##..
+#........#.##
+###.##.####..
+..##..##..###
+..#....#.....
+#..####..####
+##.####.##.##
+##..##..##.##
+
+########.#.#.##.#
+###..####.##....#
+##....##...##..##
+#......#.########
+#.####.##.##.##.#
+#......##.#.#....
+#......##....##..
+.######.##.......
+##....####.#.##.#
+#..##..#.###....#
+...##...#....##..
+.######....######
+##.##.##.#...##..
+#..##..#.#.##..##
+.#....#.##...##..
+
+###.#...####...#.
+#..#.##..##..##.#
+.##...##....##...
+#####......#...##
+#####......#...##
+.##...##....##...
+#..#.##..##..##.#
+
+####..#.##.#.
+.#..##.####.#
+#..#.#.####.#
+#..#.#.####.#
+.#..##.####.#
+####..#.##.#.
+.###.#.####.#
+##....#......
+####.#..##..#
+##..#...##...
+...##.#....#.
+##.##########
+###.####..###
+
+#..######..#...
+.###....###..##
+.#.####.#.#..##
+.###.##.###..##
+..###..###..###
+.#...##...#..##
+###.#..#.###...
+#.#.#..#.#.##..
+#..######..##..
+...#.##.#...###
+..#......#.....
+
+......##.#.
+##.#..#....
+##.#..#....
+......##.#.
+#.#.#.##.#.
+..#.#.###.#
+#####..##..
+##.###.#..#
+..#.##...#.
+
+##......###.###
+##......###.###
+#.##..##.##..#.
+.##....##.###.#
+..........#.#.#
+..######...#..#
+##.####.##...#.
+..#....#..##..#
+.###..###..##.#
+.#......#.##.#.
+.#......#.##..#
+.#.####.#..#..#
+###.##.######..
+##..##..#.#....
+.##.##.##...##.
+
+.#....#.#..#.
+...##....##..
+##.##.##....#
+#.#..#.#.##.#
+.######..##..
+###..####..##
+##.##.###..##
+..#..#..#..#.
+.#.####.#..#.
+.#....#......
+#..##..##..##
+.#....#..##..
+###..###....#
+
+##.##.##.###....#
+.######.####....#
+#......##.##.#..#
+..#..#..##.##..##
+.#....#..#.#.##.#
+#..##..#..#######
+..#..#...##.#..#.
+...##.....#######
+#.####.#.#.##..##
+##....#######..##
+.######..##.#..#.
+.##..##..#..#..#.
+###..####...#..#.
+.#.##.#..#.#....#
+.######.#.###..##
+.........####..##
+##.##.##.........
+
+....##.##.#.#..##
+####.##.###.####.
+#..##..#.####..##
+.##....##.#.##.##
+#..#...#.#.##....
+.##......##..#.##
+#..#.##...#.#.#..
+
+....##.##
+....##.##
+....#....
+..###.#..
+##.#.####
+....#.#..
+..#......
+###....#.
+#...#.#.#
+
+.....##...###.#.#
+.##.#.##.....#...
+.##.#.##.....#...
+.....##...###.#.#
+#.######...###...
+..#.#....#.##.#.#
+##########.#..#.#
+..#..#....###..#.
+...##.#.##..###..
+#####.#.......##.
+..#..#.#.#...##.#
+..#..#.#.#...##.#
+#####.#...#...##.
+...##.#.##..###..
+..#..#....###..#.
+
+.#.##.#.....#....
+#.#..#.#.#.##.#.#
+###..####......##
+#.####.#..#..#..#
+..#..#..###..###.
+..####.....##....
+##....####....###
+
+##..#.##......#
+..#.##.#.##.###
+#..#......#.###
+.##.##.#.....#.
+#.#..##.##.##.#
+#.#..##.##.##.#
+.##.##.#.....#.
+#..#......#.###
+#.#.##.#.##.###
+##..#.##......#
+#....###.##.#..
+#....###.##.#..
+##..#.##......#
+#.#.##.#.##.###
+#..#......#.###
+
+..##.#...#.##
+.#.##.#..#...
+#..##..##..##
+#......###...
+...........##
+.#.##.#.###..
+#.#..#.###...
+.#.##.#.##.##
+##....##.####
+.#.##.#....##
+##.##.##..#..
+#.####.#.####
+#.####.#.#.##
+.#....#.##.##
+..#..#..##.##
+#..##..##....
+#......#.#.##
+
+..#..###.....
+.##.#.#...#.#
+..######.#.#.
+...#####.#.#.
+.##.#.#...#.#
+..#..###.....
+#..#######...
+.#..#.#......
+..####.#..#..
+...#..##.####
+.####.......#
+#...#.##..#.#
+...####.##.##
+...####.##.##
+#...#.##..#.#
+
+...###.
+.#..###
+.#..###
+...###.
+..#.#..
+.###..#
+..#.#.#
+.#.#.#.
+.###..#
+.###..#
+.#.#.#.
+#.#.#.#
+.###..#
+..#.#..
+...###.
+
+..######.....
+##########..#
+...####......
+#.######.#..#
+#..#..#..#..#
+#.##.###.#..#
+##..##..##..#
+##.####.##..#
+##.####.#####
+#.#.##.#.#..#
+.#..##..#.##.
+#...##...####
+..######.....
+##.####.##..#
+..........##.
+
+##.##.###.#......
+#..##..#.#..####.
+#......###.#....#
+#########.##....#
+...##.....#######
+#..##..#..#......
+#......####.#..#.
+#..##..#..#......
+.##..##.#..#.##.#
+..#..#...#.##..##
+...##....#####.##
+##########.#....#
+##.##.#####..##..
+#.####.######..##
+###..#######.##.#
+#......#..#.#..#.
+..#..#......####.
+
+.#..##.##..###.
+.#.###.##..###.
+#...#...#####..
+...##.####...##
+....#.#####.#.#
+##.#..#.###.#..
+.#.##.####..##.
+##.#...##.##.#.
+....######.####
+....#.#.##..###
+..##...#......#
+#####...####.##
+#####...####.##
+..##...#......#
+....#.#.##..###
+....######.####
+##.#...##.##.#.
+
+#..##.###
+.##.....#
+.##.##..#
+###..####
+#####.#.#
+......#.#
+#..##.#..
+#..##.#..
+......#.#
+#####.#.#
+###..####
+.##.##..#
+.##.....#
+#..##.###
+#..######
+
+..#.#.#..#.#.
+..#.#.#..#.#.
+#...#.#..#.#.
+.###.#..#..#.
+.#.#..#.#.#..
+#.....#...###
+##.##.#####..
+##.##.#####..
+#.....#...###
+.#.##.#.#.#..
+.###.#..#..#.
+
+####...#.#.
+####...#.#.
+#..#..#..##
+.....#..###
+#..#.#..###
+.........#.
+.....###.##
+######.#...
+#..##.###.#
+.........#.
+..#..#.#.#.
+#######.##.
+####.#..#.#
+
+#..###.
+#..###.
+.....##
+##.#...
+#.#.#..
+.###.#.
+#.##.##
+##..##.
+..###.#
+...###.
+.#.###.
+
+############...##
+##..####..##.#...
+##..####..##.##..
+.####..####..#.##
+..##....##..##.#.
+.####..####.#..#.
+..............##.
+#..........#.##.#
+##############.#.
+.#..#..#..#.#.#.#
+............#.#.#
+..##....##..###..
+#....##....#.###.
+##############.##
+.#..#..#..#.#...#
+
+.##......#.####
+....###..###.##
+.....######....
+....#..##.##...
+######....#.###
+#..###.##....#.
+########.#.###.
+#..#####.#..###
+.##..#...####..
+.##....##..####
+#...##.##.###..
+.##...#..######
+#..#.#.#.#.#...
+.##...#..#....#
+.##...#..#....#
+
+##.#.##.#.###
+.#.##..##.#.#
+#.#..##..#.#.
+###.#..#####.
+#.#.#..#.#.#.
+##.######.###
+#.##....##.#.
+#.##....##.#.
+##.######.###
+
+###..#####.##
+###..#####.##
+.....###..###
+...##..###...
+##.#.##.##.##
+..##.....#.##
+#.###........
+#...##...##.#
+#.####.##.#..
+#.#..###.####
+.#.#.#####...
+#.##.##.##...
+####...####..
+#####....####
+.#.##.##.#...
+.##.##..##...
+.#.#...##.#..
+
+.###..###
+.#.#....#
+.#..##..#
+.#......#
+...#..#..
+##..##..#
+####..###
+##.#..#.#
+#.##..##.
+#.##..##.
+##.#..#.#
+####..###
+##..##..#
+
+###...#....
+...##.#.#.#
+..#########
+..##....#.#
+..#######.#
+..#....##..
+..#....###.
+..#######.#
+..##....#.#
+
+####......#...###
+#.#..#..##..#..#.
+##.##..####..##.#
+..###...##...###.
+.######....######
+..#####....#####.
+#.###...##...###.
+.#......##......#
+...#..######..#..
+...#..######..#..
+.#......##......#
+
+...#..#.###
+##.####....
+...##..####
+###...#....
+..#..#...##
+##..#.##...
+...##...##.
+.......####
+####..###.#
+.....#.#..#
+##....#....
+#######.###
+##.####.###
+
+#.#..#...
+..##..#..
+..##..#..
+#.#..#...
+.####....
+##..#.###
+...##....
+...#...##
+..#..####
+.#.##...#
+....#....
+
+..#####.....##.
+#.##..#....##..
+........####..#
+......#.###..##
+....###....##.#
+....###....##.#
+......#.###..##
+........####..#
+#.##..#....##..
+..#####.....##.
+.##.#..#.#.#.##
+.##.#....#.#.##
+..#####.....##.
+
+.#.#.#.##
+.#.###.##
+.##...#..
+##.##.##.
+##.#..#..
+..#..#.#.
+##.#.#.##
+##.#.#.##
+..#..#.#.
+
+..#.#####
+##...#..#
+##.###..#
+######..#
+##...#..#
+..#.#####
+.#.#.....
+#.....##.
+...#.####
+####.####
+##.......
+#..#.#..#
+...##.##.
+#.#.##..#
+###......
+....#####
+..##..##.
+
+...##...#
+...######
+...##....
+###..#.##
+##.#.#.##
+.#...#.#.
+..#.#.###
+.....##..
+###.#....
+##.#.#.#.
+##.#.#.#.
+
+....#.....#..
+#..##.#....#.
+##...........
+..##.##...##.
+.###..#..###.
+##.########.#
+##..###....##
+###.##..#.##.
+###.##..#.##.
+##..###....##
+##.########.#
+.###.....###.
+..##.##...##.
+##...........
+#..##.#....#.
+....#.....#..
+....#.....#..
+
+..##.#.#.
+#####.#..
+#...####.
+##.###...
+##....#.#
+##.#.#...
+...#####.
+##..#...#
+.....###.
+###..##.#
+###.#.###
+###.#.###
+###..##.#
+
+..#.###
+.....#.
+..#...#
+..#..##
+####.##
+###.#.#
+###.#..
+####.##
+..#..##
+..#...#
+.....#.
+
+.###.#.#.##.#..
+#.####..##..#.#
+#.####..##..#.#
+.###.#.#.#..#..
+....#...#..##.#
+..####.##.#...#
+##..#.#..#..##.
+###..#...#.....
+###..#...#.....
+
+#...#.....##.
+#.###.#..####
+..###.######.
+.#..####..##.
+.#..####..##.
+..###.######.
+#.###.#..####
+#.........##.
+.##.##.###...
+#.##..#####..
+##..######..#
+###.#...#....
+.#.#.########
+###......###.
+....######.#.
+.###.##.##.#.
+.###.##.##.#.
+
+#..#..#....#..#
+..###.#.##.#.##
+##.###......###
+##...########..
+.....#.........
+#...###....###.
+#...###....###.
+
+.#..#....#..#..
+#....#..#####..
+.####.###..##..
+#....#####.##..
+..##.......#.##
+.......#.##..##
+##..###..###...
+.###....#.#.#..
+.#..#...##.....
+#....#..##.####
+##..###.####.##
+..##..#...#.#..
+.........#..###
+
+.####..
+#...#.#
+..##..#
+#..###.
+#..###.
+#.##..#
+#...#.#
+.####..
+..##.##
+..##...
+#....#.
+#.#..#.
+#.#..#.
+
+#####...#..##
+#.###...#..##
+.#####.#.#...
+.##.##..#####
+....##.###...
+..#.#.###.###
+.##....##..##
+##..#.###.###
+##...###.#...
+.#.##.#.#..##
+.#.#...#.####
+#....#...#...
+...##..##..##
+
+.....#.#.....
+....##.......
+#..#.#.##....
+#####.##.....
+#....####.##.
+#..####...##.
+#..###.#..##.
+....##..#####
+#####.###....
+....#.###....
+####.#...#..#
+#######......
+....#.##.####
+.##....#.#..#
+....###.##..#
+
+##.####......##.#
+....#.###.#...##.
+....#.###.#...##.
+##.####......##.#
+.##..#.##...#.###
+.#.#.#...#...#...
+#.##.#..##.#.#.#.
+#.##.#.###.#.#.#.
+.#.#.#...#...#...
+
+#####..####..####
+...###..##..###..
+..##..........##.
+##.#..##..##..#.#
+##....#.##.#....#
+##.#.#..###.#.#.#
+..#.###....###.#.
+..##..........##.
+..###...##...###.
+....#.##..##.#...
+.....#......#....
+
+.####..#..#..##
+..##...#..#....
+......###...###
+......##.##..#.
+#....#.#.#.#...
+######.###...##
+.####.#.#..##.#
+.......#.#..#..
+.......#.#..#..
+.####.#.#..##.#
+######.###...##
+#....#.#.#.#...
+......##.##.##.
+
+#.#..##.#.#..
+.#..##..#..##
+.#..##..#..##
+#.#..##.#.#..
+..#..#...#.#.
+.#...#.#.###.
+#.#####.#.##.
+#...#...#.#..
+#...#...#.#..
+#.#####.#.##.
+.#...#.#.###.
+..#..#...#.#.
+#.#..##.#.##.
+
+#..##......##..#.
+#..##......##..#.
+.#.#.#.##.#.#.#.#
+#..#.######.#..##
+.#..##.##.##..#.#
+#...#..##..#...#.
+#.############.#.
+#..##.#..#.##..##
+#..###....###..##
+##.#...##..##.###
+.##.##....##.##..
+
+..###.#.##.#.###.
+.##.##..##..##.##
+.##.##..##..##.##
+..###.#.##.#.###.
+.##..#.####.#..##
+###.##..##..##.##
+###.#.#.##.#.#.##
+.#..............#
+#...###.##.###.#.
+###...#....#...##
+.##..#..##..#..##
+..#..##....##..#.
+..#.#.######.#.#.
+###..##.##.##..##
+..#..#.#..#.#..#.
+
+###.##.##
+##..##..#
+#.######.
+#.######.
+##..##..#
+###.##.##
+.###..###
+#.#....#.
+..#.##.##
+
+....#.##..#
+......#.##.
+#.####.#..#
+#.####.#..#
+......#.##.
+....#.##..#
+.#.##.#..#.
+.##..##....
+#....##.##.
+
+.##...##.#.
+.#.##...##.
+#..#####.##
+#..#####.##
+.#.##...##.
+.##...##.#.
+.#..###...#
+###.##.##.#
+#...##.#.##
+#...##.#.##
+.##.##.##.#
+.#..###...#
+.##...##.#.
+
+.##...##.
+.##...##.
+##..###.#
+##.#.#..#
+.....#...
+#..#.##.#
+........#
+..##.###.
+..##.###.
+........#
+#..#.##.#
+.#...#...
+##.#.#..#
+##..###.#
+.##...##.
+
+####..#..##.##.##
+....#.##.........
+....#...#.######.
+.....##..##....##
+.....####........
+####..#...##..##.
+....###.##.#..#.#
+#####.....##..##.
+.##.....#...##...
+.##.##.#..######.
+#..#####..#.##.#.
+#..######.##..##.
+..#.#.#.#.######.
+.##...#..##.##.##
+####..####.####.#
+
+#...#.#
+#..#.##
+##..###
+##..##.
+#..#.##
+#...#.#
+.#....#
+#..##.#
+...#.#.
+###...#
+##..###
+.#####.
+.#####.
+##..###
+###...#
+
+##.##..##.##.#..#
+.##..##..#..##..#
+#############...#
+....#..#........#
+#..##..##..#.##..
+#..#....#..######
+#....##....###.##
+###.####.#####..#
+.#..####..#.#.###
+##..#..#..###..#.
+..##.##.##...##.#
+.##..##..##.....#
+...............#.
+...............#.
+.##..##..##.....#
+..##.##.##...##.#
+##..#..#..###..#.
+
+#.#######
+##.#...##
+#..##..##
+#..#.##..
+##.##..##
+###.#####
+###.#####
+##.##..##
+#..#.##..
+#..##..##
+##.#...##
+#.#######
+..#.#.#..
+#...#.##.
+.#.#..#..
+.#.##..##
+#.#..####
+
+.......#.#...####
+....#..#....#.##.
+..##...#...######
+##.#....#.##.####
+##..##...#####..#
+.##...#####.#####
+.####..##.#...##.
+#..#..#####..#..#
+#..#..#####..#..#
+.####..##.#...##.
+.##...#####.#####
+##..###..#####..#
+##.#....#.##.####
+..##...#...######
+....#..#....#.##.
+