aboutsummaryrefslogtreecommitdiff
path: root/Puzzle19.hs
blob: 5195926770459a7653a28869f7c837ada9d610bf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
{-
Copyright (C) 2017 Yuchen Pei.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU Affero General Public
License along with this program.  If not, see
<https://www.gnu.org/licenses/>.
-}
import Data.Map (Map)
import qualified Data.Map as Map
import Data.List.Split (splitOn)
import Data.List (elemIndex)
import Data.Maybe (fromJust)

walk :: (Int, Int) -> (Int, Int) -> [Char] -> [Char]
walk (x, y) (x', y') xs
  | w == ' ' = xs
  | w == '|' || w == '-' = walk (x', y') (2 * x' - x, 2 * y' - y) xs
  | w `elem` alphabet = w:(walk (x', y') (2 * x' - x, 2 * y' - y) xs)
  | w == '+' = walk (x'', y'') (2 * x'' - x, 2 * y'' - y) xs
    where w = pmap Map.! (x, y)
          x1 = y' - y + x
          y1 = x' - x + y
          x2 = y - y' + x
          y2 = x - x' + y
          (x'', y'') = if Map.findWithDefault ' ' (x1, y1) pmap == ' '
                         then (x2, y2)
                         else (x1, y1)

walk' :: (Int, Int) -> (Int, Int) -> Int -> Int
walk' (x, y) (x', y') n
  | w == ' ' = n
  | w `elem` ("|-" ++ alphabet) = walk' (x', y') (2 * x' - x, 2 * y' - y) (n + 1)
  | w == '+' = walk' (x'', y'') (2 * x'' - x, 2 * y'' - y) (n + 1)
    where w = pmap Map.! (x, y)
          x1 = y' - y + x
          y1 = x' - x + y
          x2 = y - y' + x
          y2 = x - x' + y
          (x'', y'') = if Map.findWithDefault ' ' (x1, y1) pmap == ' '
                         then (x2, y2)
                         else (x1, y1)

alphabet :: [Char]
alphabet = ['A'..'Z']

solve1 = walk (0, y0) (1, y0) []
  where y0 = fromJust $ elemIndex '|' input

solve2 = walk' (0, y0) (1, y0) 0
  where y0 = fromJust $ elemIndex '|' input

pmap :: Map (Int, Int) Char
pmap = parseInput input

parseInput :: [Char] -> Map (Int, Int) Char
parseInput xs = mat2Map $ splitOn "\n" xs

mat2Map :: [[a]] -> Map (Int, Int) a
mat2Map xs = Map.fromList $ mconcat $ fmap f $ zipWith (,) [0 .. length xs - 1] xs
  where f (x, ys) = zipWith (,) ((\y -> (x,y)) <$> [0 .. length ys]) ys

input = input1

input0 = "     |          \n     |  +--+    \n     A  |  C    \n F---|----E|--+ \n     |  |  |  D \n     +B-+  +--+ "

input1 = "                                                               |                                                                                                                                         \n       +-------------------------------------------------------|-----------------------------+ +-------+ +-------+           +-+   +-------------------------------------------------------------+       \n       |                                                       |                             | |       | |       |           | |   |                                                             |       \n       |     +-------+                     +---------------+   |                     +-------|---------|-+       |         +-|-----------------------------------------+                         |       \n       |     |       |                     |               |   |                     |       | |       |         |         | | |   |                                   |                         |       \n       |     |       +---------------------|-----------------------------------------|-------|-----+   |         |         | +-|---+                         +-----------------------------------------+ \n       |     |                             |               |   |                     |       | |   |   |         |         |   |                             |         |                         |     | \n       |     | +---------------------------|---+ +-------+ +---|---+               +-|-------|-------------------------------+ |                             |         |                     +-+ |     | \n       |     | |                           |   | |       |     |   |               | |       | |   |   |         |         | | |                             |         |                     | | |     | \n   +---------|---------------------------------|---------|---------|---------------|---------------|---|-------------------|-|-------------------------------|-------+ |                     | | |     | \n   |   |     | |                           |   | |       |     |   |               | |       | |   |   |         |         | | |                             |       | |                     | | |     | \n   |   +-----|-------------------------------------------------|---|---------------------------|-------|-------------------------------------------------------------------------------+     | | |     | \n   |         | |                           |   | |       |     |   |               | |       | |   |   |         |         | | |                             |       | |               |     | | |     | \n   |         | |                           |   +---------|-----|---+               | |       | | +-----+         |     +---|-+ +-----------------------------|---------|---------------|-----|-----+   | \n   |         | |                           |     |       |     |                   | |       | | | |             |     |   |                                 |       | |               |     | | | |   | \n   |         | |                           |   +-+ +-----------|-----------+       | |       | | +-------------+ |     |   |                     +-------------------+ |               | +-----|---|---+ \n   |         | |                           |   |   |     |     |           |       | |       | |   |           | |     |   |                     |           |         |               | |   | | | |     \n   |         | |                       +-------|---|-----------|-----------|-------------------|---|-------------|-------------------------------|-----------|---------|---------------+ |   | | | |     \n   |         | |                       |   |   |   |     |     |           |       | |       | |   |           | |     |   |                     |           |         |                 |   | | | |     \n   |         | |                       |   |   |   +-----|-----------------|-----------------|-+   |           | |     |   |                     |           |         |                 |   | | | |     \n   |         | |                       |   |   |         |     |           |       | |       |     |           | |     |   |                     |           |         |                 |   | | | |     \n   |         | |                       |   |   |         |   +-+           |       | |       |     |           | |     |   |                     |           |         |                 |   | | | |     \n   |         | |                       |   |   |         |   |             |       | |       |     |           | |     |   |                     |           |         |                 |   | | | |     \n   |         | |                       |   |   |         |   |             |       | |       |     |           | |     |   |                     |           |         |   +-+           |   | | | |     \n   |         | |                       |   |   |         |   |             |       | |       |     |           | |     |   |                     |           |         |   | |           |   | | | |     \n   |         | |                       |   |   |         |   |             |       | |       |     |           | |     |   |   +-----------------|-----------|-----+   |   | |           |   | | | |     \n   |         | |                       |   |   |         |   |             |       | |       |     |           | |     |   |   |                 |           |     |   |   | |           |   | | | |     \n   +-+ +-------------------------------+   |   +---------|-----------------|-------|---------------------------|---------------|-------+         |           |     |   |   | |           |   | | | |     \n     | |     | |                           |             |   |             |       | |       |     |           | |     |   |   |       |         |           |     |   |   | |           |   | | | |     \n   +-|-|---+ | |         +---------------+ |   +-------------|-------------|---------+       |     |   +---------|---------|---|---------------+ |           |     |   |   | |     +-----|-------------+ \n   | | |   | | |         |               | |   |         |   |             |       |         |     |   |       | |     |   |   |       |       | |           |     |   |   | |     |     |   | | | |   | \n +-+ | |   +---------------------+       | |   | +-------------------------|-----------------+     |   |       | |     |   |   |       |       | |           |     |   |   | |     |     +---+ | | |   | \n |   | |     | |         |       |       | |   | |       |   |             |       |               |   |       | |     |   |   |       |       | |           |     |   |   | |     |           | | |   | \n | +-|-|-----------------|-----------------|---|-|-------|---|---------------------|---------------|---|-------|---------------------------------|-------------------+ |   | |     |           | | |   | \n | | | |     | |         |       |       | |   | |       |   |             |       |               |   |       | |     |   |   |       |       | |           |     | | |   | |     |           | | |   | \n | | | |     | |         |       |       | |   | +---------------------------------|-------+       |   |       | |     |   |   |       |       | |           |     | | |   | |     +-----------+ | |   | \n | | | |     | |         |       |       | |   |         |   |             |       |       |       |   |       | |     |   |   |       |       | |           |     | | |   | |                   | |   | \n | | | |     | |         |       |       | |   |         |   |             |       |       |   +---|-----------|-|-----+   |   |       +-------|-------------------+ | |   | |                   | |   | \n | | | |     | |         |       |       | |   |         |   |             |       |       |   |   |   |       | |         |   |               | |           |       | |   | |                   | |   | \n +-|-----+   | |         |     +-|-------|-----|-------------|-------------|---------------------------|-------|-----------|---|---------------|-|-----------------+ | |   | |                   | |   | \n   | | | |   | |         |     | |       | |   |         |   |             |       |       |   |   |   |       | |         |   |               | |           |     | | |   | |                   | |   | \n +-------+ +-|-|---+     |     | |       | |   |         |   |             |       |       |   |   |   |   +---|---------------|---------------|---------------+   | | |   | |                   | |   | \n | | | |   | | |   |     |     | |       | |   |         |   |             |       |       |   |   |   |   |   | |         |   |               | |           | |   | | |   | |                   | |   | \n | +-|-|-+ | | |   |     |     | +-------|-|---|-------+ |   |             |       |       |   |   |   |   |   | |         |   |               | |           | |   | | |   | |                   | |   | \n |   | | | | | |   |     |     |         | |   |       | |   |             |       |       |   |   |   |   |   | |         |   |               | |           | |   | | |   | |                   | |   | \n | +---|---|-|-+ +-------|-----|-----------|---|-------------|-------------|---------------|-----------|-------|-|-------------|-----------+   | | +-------------------|-----|-+                 | |   | \n | | | | | | |   | |     |     |         | |   |       | |   |             |       |       |   |   |   |   |   | |         |   |           |   | | |         | |   | | |   | | |                 | |   | \n | +-+ | | +-|-----|-----------|---------|-|---|-------+ |   |       +---------+   |       |   |   |   |   |   | |         |   +-----------|-----|-----------------|-----------|-+               | |   | \n |     | |   |   | |     |     |         | |   |         |   |       |     |   |   |       |   |   |   |   |   | |         |               |   | | |         | |   | | |   | | | |               | |   | \n |     | | +-----|-------------|---------|-----|---------------------------|-----------------------|-------|-----------------------------+ |   | | |         | |   | | |   | | | |               | |   | \n |     | | | |   | |     |     |         | |   |         |   |       |     |   |   |       |   |   |   |   |   | |         |             | |   | | |         | |   | | |   | | | |               | |   | \n |     | | | |   | |     |     |         | |   +---------|---|-------+     |   |   |       |   |   |   |   |   | |         |             | |   | | |     +---+ |   | | |   | | | |               | |   | \n |     | | | |   | |     |     |         | |             |   |             |   |   |       |   |   |   |   |   | |         |             | |   | | |     |     |   | | |   | | | |               | |   | \n +---+ | | | +---|-|-----|-----|-------------------------|---|-------------|-------|-------|-------|---|-------|-|---------|-------------|-|---|---|---+ |     |   | | |   | | | |               | |   | \n     | | | |     | |     |     |         | |             |   |             |   |   |       |   |   |   |   |   | |         |             | |   | | |   | |     |   | | |   | | | |               | |   | \n     | | | |     | |     |     |         | |             | +---------------|---|-------------------|-----------+ |         |             | |   | | |   | |     |   | | |   | | | |       +---+   | |   | \n     | | | |     | |     |     |         | |             | | |             |   |   |       |   |   |   |   |     |         |             | |   | | |   | |     |   | | |   | | | |       |   |   | |   | \n     | | | |   +---------|-----|---------|-----------------|-|---------+   |   |   |       |   |   |   |   |     |         |             | |   | | |   | |     |   | | |   | | | |       |   |   | |   | \n     | | | |   | | |     |     |         | |             | | |         |   |   |   |       |   |   |   |   |     |         |             | |   | | |   | |     |   | | |   | | | |       |   |   | |   | \n     | | | |   +-|-|-----------|---------|---------------+ +-|---+ +-------+   |   |       |   |   |   |   |     |         |             | |   | | |   | |     |   | | |   | | | |       |   |   | |   | \n     | | | |     | |     |     |         | |                 |   | |   |       |   |       |   |   |   |   |     |         |             | |   | | |   | |     |   | | |   | | | |       |   |   | |   | \n     | | | |     | |     |     |         | |                 |   | |   |     +-------------|-------|---|---------|---------|-------------|-|---|-|-|-----------|---|-------+ | | +-------|---|---|-|---+ \n     | | | |     | |     |     |         | |                 |   | |   |     | |   |       |   |   |   |   |     |         |             | |   | | |   | |     |   | | |     | |         |   |   | |     \n     | | | |     | |     |     |         | |                 |   | |   |     | |   |       |   |   |   +-----------------------------------|---|-|---------------+ | | |     | |         |   |   | |     \n     | | | |     | |     |     |         | |                 |   | |   |     | |   |       |   |   |       |     |         |             | |   | | |   | |     | | | | |     | |         |   |   | |     \n     | | | |   +-|-|-----------|-------+ | |                 |   | | +-|-----|-----------------|---|-------|-----|---------|-------------|-|---|---|---|-----------|-|-|-----|-------------+ |   | |     \n     | | | |   | | |     |     |       | | |                 |   | | | |     | |   |       |   |   |       |     |         |             | |   | | |   | |     | | | | |     | |         | | |   | |     \n     | | | |   | | |     |     |       | | |                 |   | | | | +-------+ |       |   |   |       |     |         |             | |   | | |   | |     | | +---|-----|-|---+     | | |   | |     \n     | | | |   | | |     |     |       | | |                 |   | | | | |   | | | |       |   |   |       |     |         |             | |   | | |   | |     | |   | |     | |   |     | | |   | |     \n     | | | |   | | |     |     |       | | |                 | +---+ +---|---|---|---------|---+   |       |     |         |             | |   | | |   | |     | |   | |     | |   |     | | |   | |     \n     | | | |   | | |     |     |       | | |                 | | |     | |   | | | |       |       |       |     |         |             | |   | | |   | |     | |   | |     | |   |     | | |   | |     \n     | | | |   | | |   +-|-----------------|-----------------|-|-----+ | |   | | | |       |       |       |     |         |             | |   | | |   | |     | |   | |     | |   |     | | |   | |     \n     | | | |   | | |   | |     |       | | |                 | | |   | | |   | | | |       |       |       |     |         |             | |   | | |   | |     | |   | |     | |   |     | | |   | |     \n     | | | |   | | |   +-|-------+     +---|-----------------|---|-+ | | |   | | | | +-----|-------|-------------|---------|-------------|-|-----|-|-----|---+ | |   | |     | |   |     | | |   | |     \n     | | | |   | | |     |     | |       | |                 | | | | | | |   | | | | |     |       |       |     |         |             | |   | | |   | |   | | |   | |     | |   |     | | |   | |     \n     | | | | +-|---|-------------------+ | |             +-------+ | | | |   | | | | | +---|---------------------|---------|-------------|-|---|---|---+ |   | | |   | |     | |   |     | | |   | |     \n     | | | | | | | |     |     | |     | | |             |   | |   | | | |   | | | | | |   |       |       |     |         |             | |   | | |     |   | | |   | |     | |   |     | | |   | |     \n     | | | | | | | |   +-+     | |   +-|---|-------------|---|-----|-|-|-|---|-|---|-|-|---|-------+       |     |         |             | |   | | |     |   | | |   | |     | |   |     | | |   | |     \n     | | | | | | | |   |       | |   | | | |             |   | |   | | | |   | | | | | |   |               |     |         |             | |   | | |     |   | | |   | |     | |   |     | | |   | |     \n     | | | | | | | |   +---------|-------|-|-------------|-----+   | | | |   | | | | | |   |               |     |         |             | |   | | |     |   | | |   | |     | |   |     | | |   | |     \n     | | | | | | | |           | |   | | | |             |   |     | | | |   | | | | | |   |               |     |         |             | |   | | |     |   | | |   | |     | |   |     | | |   | |     \n     | | | | | | | |           | |   | | | |             |   |     | | +-|-------|-|-----------------------|---+ |         |       +---------------|---------|-|-|-----------|-----|-----|-|-|-----|---+ \n     | | | | | | | |           | |   | | | |             |   |     | |   |   | | | | | |   |               |   | |         |       |     | |   | | |     |   | | |   | |     | |   |     | | |   | |   | \n   +-|---------|-|-------------------|-----|-------------|---|-----|-|---|-----|-|-----|-------------------|---|-|---------|-------------------|-|-+     |   +---------|-------|-+ |     | | |   | |   | \n   | | | | | | | | |           | |   | | | |             |   |     | |   |   | | | | | |   |               |   | |         |       |     | |   | |       |     | |   | |     | | | |     | | |   | |   | \n   | | | | | | | | |           | |   | | | |             |   |     | | +-----|---|-|-----+ |               |   | |         |       |     | |   | |       |     | |   | | +-----|-+ |     | | |   | |   | \n   | | | | | | | | |           | |   | | | |             |   |     | | | |   | | | | | | | |               |   | |         |       |     | |   | |       |     | |   | | |   | |   |     | | |   | |   | \n   | | | | | | | | |           | |   | | | |             |   |     | | | |   | | | +---|-|-|---------------------------------------------------|-----------+   | |   | | |   | |   |     | | |   | |   | \n   | | | | | | | | |           | |   | | | |             |   |     | | | |   | | |   | | | |               |   | |         |       |     | |   | |       | |   | |   | | |   | |   |     | | |   | |   | \n   | | | | | | | | |           | |   | | | |             |   |     | | | |   | | |   | | | |               |   | |         |       |     | |   | | +-+   | |   | |   | | |   | |   |     | | |   | |   | \n   | | | | | | | | |           | |   | | | |             |   |     | | | |   | | |   | | | |               |   | |         |       |     | |   | | | |   | |   | |   | | |   | |   |     | | |   | |   | \n   | | | | | | | | |   +---------|---|-|-|-+             |   |     | | | |   | | |   | | | |               |   | |         |       |     | |   | | | |   | |   | |   | | |   | |   |     | | |   | |   | \n   | | | | | | | | |   |       | |   | | |               |   |     | | | |   | | |   | | | |               |   | |         |       |     | |   | | | |   | |   | |   | | |   | |   |     | | |   | |   | \n   | | | | | | +---|---|-------------|-|---------------------|-------|-|-|---|---|---|---------------------|---|-----------|-------|-----|-|-----|-+ |   +-|-+ | |   | | |   | |   |     | | |   | |   | \n   | | | | | |   | |   |       | |   | | |               |   |     | | | |   | | |   | | | |               |   | |         |       |     | |   | |   |     | | | |   | | |   | |   |     | | |   | |   | \n   | | | | | |   | | +-------+ +-----|-|-----------------------+   | | | |   | | |   | | | |               |   | +---------|-------------|-----|-|-----------|---|-+ | | |   | |   |     | | | +-----+ | \n   | | | | | |   | | | |     |   A   | | |               |   | |   | | | |   | | |   | | | |               |   |           |       |     | |   | |   |     | | | | | | | |   | |   |     | | | | | | | | \n   | | | | | |   | | | |     |   |   +-|-----------------|-----|-------|-|-------|---|-|---|-------------------|-----------|-------|-----|-----------|-------|-----|-|-|-----|-----------|---------|-+ | \n   | | | | | |   | | | |     |   |     | |               |   | |   | | | |   | | |   | | | |               |   |           |       |     | |   | |   |     | | | | | | | |   | |   |     | | | | | |   | \n   | | | | | |   +-|---------|---|-------|-------------------|---------|-|---|-|-----|---+ |               |   |           |       |     | |   | | +-------|-+ | | | | | |   | |   |     | | | | | |   | \n   | | | | | |     | | |     |   |     | |               |   | |   | | | |   | | |   | |   |               |   |           |       |     | |   | | | |     |   | | | | | |   | |   |     | | | | | |   | \n   | | | | | |     | | |     |   |     | |               |   | |   | | | |   | | |   | |   |               | +-|---------------------------|-------|-|-----+ +-----+ | | |   | | +-------|-----|-|-|-+ | \n   | | | | | |     | | |     |   |     | |               |   | |   | | | |   | | |   | |   |               | | |           |       |     | |   | | | |       | | |   | | |   | | | |     | | | | | | | | \n   | | | | | |     | +-|-+   +---------|-|-------------------|-|---|---|-|---|---------|---------------------|-------------|-------|-----|-------|-|---------+ | |   | | |   | | | |     | | | | | | | | \n   | | | | | |     |   | |       |     | |               |   | |   | | | |   | | |   | |   |               | | |           |       |     | |   | | | |         | |   | | |   | | | |     | | | | | | | | \n   | | | | | |     |   | |       |     | |               |   | |   | | | |   | | |   | |   |               | | |           |       |     | |   | | | |   +-------|---|-----+ | | | |     | | | | | | | | \n   | | | | | |     |   | |       |     | |               |   | |   | | | |   | | |   | |   |               | | |           |       |     | |   | | | |   |     | |   | | | | | | | |     | | | | | X | | \n   | | | | | |     |   | |       |     | |               |   | |   | | | |   | | |   | |   | +---------------|-|-------------------|-----------|---+ |   |     | |   | | | | | | | |     | | | | | | | | \n   | | | | | |     |   | |       |     | |               |   | |   | | | |   | | |   | |   | |             | | |           |       |     | |   | |   |   |     | |   | | | | | | | |     | | | | | | | | \n   | | | | | |     |   | |       |     | |               +---|-|-----|---|-----------|-|-------------------------------------------|-------------|-------------|-----|-|-+ | | | | |     | | | | | | | | \n   | | | | | |     |   | |       |     | |                   | |   | | | |   | | |   | |   | |             | | |           |       |     | |   | |   |   |     | |   | |   | | | | |     | | | | | | | | \n +-|---------|-----------------+ |     | |                   | |   | | | |   | | |   | |   | |             | | |           |       |     | |   | |   |   |     | |   | |   | | | | |     | | | | | | | | \n | | | | | | |     |   | |     | |     | |                   | |   | | | |   | | |   | |   | |             | | |           |       |     | |   | |   |   |     | |   | |   | | | | |     | | | | | | | | \n | | | | | | |     |   | |     | |     | |                   | |   | | | |   | | |   | |   | |             | | | +---------|-------|-----|-|-+ | |   |   |     | |   | |   | | | | |     | | | | | | | | \n | | | | | | |     |   | |     | |     | |                   | |   | | | |   | | |   | |   | |             | | | |         |       |     | | | | |   |   |     | |   | |   | | | | |     | | | | | | | | \n | | | | | | |     |   | |     | |     | |                   | |   | | | |   | | |   | |   | |             | | | |         |     +-|-------|---|-----|---|-----------|-----+ | | | |     | | | | | | | | \n | | | | | | |     |   | |     | |     | |                   | |   | | | |   | | |   | |   | |             | | | |         |     | |     | | | | |   |   |     | |   | |     | | | |     | | | | | | | | \n | | | +-----------|---|-|-----|-|-----|---------------------------|-|-|-|---|-|-|---|-------|-----------------|-|---------|-----|-------+ | | | |   |   |   +-------|-----+ | | | |     | | | | | | | | \n | | |   | | |     |   | |     | |     | |                   | |   | | | |   | | |   | |   | |             | | | |         |     | |       | | | |   |   |   | | |   | |   | | | | |     | | | | | | | | \n +-------|-|---------------------|---------------------------------|-----|---|-|-----|-----|-+             | | | |         |     | |     +---|-+ +---+   |   | +-|---|-----|---|---|-+   | | | | | | | | \n   | |   | | |     |   | |     | |     | |                   | |   | | | |   | | |   | |   |               | | | |         |     | |     | | |           |   |   |   | |   | | | | | |   | | | | | | | | \n   | |   | | |     |   | |     | |     | | +-+           +---|-|---+ | | | +-|---+   | |   |               | | | |         |     | |     | | |         +-|---|---|---------|---|-----+   | | | | | | | | \n   | |   | | |     |   | |     | |     | | | |           |   | |     | | | | | |     | |   |               | | | |         |     | |     | | |         | |   |   |   | |   | | | | |     | | | | | | | | \n   +-|-----|-|-----|---|-|-------------|-|-------------+ |   | |     | | | | | |     | |   |   +-----------|-|-------------|-----------------|---------|-|-------|---|-----|-+ | | +-+   | | | | | | | | \n     |   | | |     |   | |     | |     | | | |         | |   | |     | | | | | |     | |   |   |           | | | |         |     | |     | | |         | |   |   |   | |   |   | |   |   | | | | | | | | \n     |   | | |     |   | |   +-|-------+ | | |         | |   | |     | | | | | +-----|-|-------|-----------|-|-------------------|-|-------|-----------+ |   |   |   | |   |   | |   |   | | | | | | | | \n     |   | | |     |   | |   | | |       | | |         | |   | |     | | | | |       | |   |   |           | | | |         |     | |     | | |           |   |   |   | |   |   | |   |   | | | | | | | | \n +-+ |   +---------|-----|---|-----------|---|-----------|---|-|-----------|-|-------|---------|-----+     | | | |         |     | |     | | |           |   |   +---|-|---|---------+   | | | | | | | | \n | | |     | |     |   | |   | | |       | | |         | |   | |     | | | | |       | |   |   |     |     | | | |         |     | |     | | |           |   |       | |   |   | |       | | | | | | | | \n +---|-----|-----+ |   | |   | | |       | | |         | |   | |     | | | | +-------|-------------+ |     | | | |         |     | |     | | |           |   |       | |   |   | |       | | | | | | | | \n   | |     | |   | |   | |   | | |       | | |         | |   | |     | | | |         | |   |   |   | |     | | | |         |     | |     | | |           |   |       | |   |   | |       | | | | | | | | \n +---|-----------------|-----|-|-----------|-----------|-|---|-------|---|-|---------|-|-----------|-------------|---------------|-|-----|-|-------------|-----------+ |   |   | |       | | | | | | | | \n | | |     | |   | |   | |   | | |       | | |         | |   | |     | | | |         | |   |   |   | |     | | | |         |     | |     | | |           |   |         |   |   | |       | | | | | | | | \n | | |     | |   | |   | |   | | |       | | |         | |   +-------|-+ | |         | +---|---------+     | | | |         |     | |     | | |         +-|-----------------------|-----------|---|---+ | \n | | |     | |   | |   | |   | | |       | | |         | |     |     |   | |         |     |   |   |       | | | |         |     | |     | | |         | |   |         |   |   | |       | | | | | |   | \n +-|-|-------|-----|---|-----|---|-------|-|-----------|-------------|---|-----------------|---------------|-|-|-----+     |     | |     | +-----------|-+   |         | +-|---------+   | | | | | |   | \n   | |     | |   | |   | |   | | |       | | |         | |     |     |   | |         |     |   |   |       | | | |   |     |     | |     |   |         |     |         | | |   | |   |   | | | | | |   | \n   | |   +-|-----|-----+ |   | | |       | | |         | |     |     |   | |       +-|-------------|------------Z|---|-----------------------+         |     |         | | |   | |   |   | | | | | |   | \n   | |   | | |   | |     |   | | |       | | |         | |     |     |   | |       | |     |   |   |       | | | |   |     |     | |     |             |     |         | | |   | |   |   | | | | | |   | \n   | |   | | |   | |     | +-+ | +-----------------------------|-----|-----|---------------|---|---------------|-----+     |     | +-------------------|-----------------|-|---|-|-------|-|-+ | | |   | \n   | |   | | |   | |     | |   |         | | |         | |     |     |   | |       | |     |   |   |       | | | |         |     |       |             |     |         | | |   | |   |   | |   | | |   | \n +-|-+   | | |   | |     | |   | +---------------------+ |     |     |   | |       | |     |   +---|-------|-|-------------|-------------|-------------|-----|-------------|-----|-----+ | |   | | |   | \n | |     | | |   | |     | |   | |       | | |           |     |     |   | |       | |     |       |       | | | |         |     |       |             |     |         | | |   | |   | | | |   | | |   | \n | |     | | |   | |     | |   | |   +---|-+ |           |     |     |   | |       | |     |       |       | | | |         |     |       |             |     |         | | |   | |   | | | |   | | |   | \n | |     | | |   | |     | |   | |   |   |   |           |     |     |   | |       | |     |       |       | | | |         |     |       |             |     |         | | |   | |   | | | |   | | |   | \n | |     | | |   | |     | |   | |   |   |   |           |     |     +---|---------|-|-------------|---------|-|-|-------------------------------------|-----|---+     | | |   | +-----|-------+ | |   | \n | |     | | |   | |     | |   | |   |   |   |           |     |         | |       | |     |       |       | | | |         |     |       |             |     |   |     | | |   |     | | | |     | |   | \n | |     | | |   | |     | |   | |   |   |   |           |     |         | |       | |     |       |       | | | |         |     |       |             |     |   |     +-------|-----+ +-------+ | |   | \n | |     | | |   | |     | |   | |   |   |   |           |     |         | |       | |     |       |       | | | |         |     |       |             |     |   |       | |   |         | |   | | |   | \n | |     | | |   | |     | |   | |   |   |   |           |     |         | |       | |     |       |       | | | |         |     |       |             |     |   |       | |   |         | |   | | |   | \n | |     | | |   | |     | |   | |   |   |   |           |     |         | |       | |     |       |       | | | |         |     |       |             |     |   |       | |   |         | |   | | |   | \n | |     | | |   | |     | |   | |   |   |   |           |     |         | |       | |     |       |       | | | |         |     |       |             |     |   |       | |   |         | |   | | |   | \n | |     | | |   | |     | |   | |   |   |   |           |     |         | |       | |     |       |       | | | |         |     |       |             |     |   |       | |   |         | |   | | |   | \n | +-----+ | |   | |     | +---|-----|-------|---------------------------|-+       | |     |       |       | | | |         |     |       |             |     |   |       | |   |         | |   | | |   | \n |         | |   | |     |     | |   |   |   |           |     |         |         | |     |       |       | | | |         |     |       |             |     |   |       | |   |         | |   | | |   | \n | +---------|-----|-----|-----|-+   |   |   |           |     +---------------------------|-------|-------|-|-|-----+     |     |       |             |     |   |       | |   |         | |   | | |   | \n | |       | |   | |     |     |     |   |   |           |               |         | |     |       |       | | | |   |     |     |       |             |     |   |       | |   |         | |   | | |   | \n | |       | |   | |     |     |     |   |   |           |               |         | |     |       |       | | | |   |     |     |       +-------------|--I--------+     | |   |         | |   | | |   | \n | |       | |   | |     |     |     |   |   |           |               |         | |     |       |       | | | |   |     |     |                     |     |   | |     | |   |         | |   | | |   | \n | |       | |   | |     |     |     |   |   |         +-----------------+         | |     |       |       | | | |   |     |     |                     |     |   | |     | |   |         | |   | | |   | \n | |       | |   | |     |     |     |   |   |         | |                         | |     |       |       | | | |   |     |     |                     |     |   | |     | |   |         | |   | | |   | \n | |       | |   | |     | +---|-------------------------|---------------------------|-----|---+   |       | | | |   |     |     |                     |     |   | |     | +-+ |     +-+ | |   | | |   | \n | |       | |   | |     | |   |     |   |   |         | |                         | |     |   |   |       | | | |   |     |     |                     |     |   | |     |   | |     | | | |   | | |   | \n | |       | |   | |     | |   |     |   | +-|---------|-|---------------------------|-----|---+   |       | | | |   |     |     |                     |     |   +-----------|-|-----+ | | |   | | |   | \n | |       | |   | |     | |   |     |   | | |         | |                         | |     |       |       | | | |   |     |     |                     |     |     |     |   | |       | | |   | | |   | \n +-|-------------|---------|---------|---|-|-|---------|-|---------------------------------|-------|-------|-|-------------------------------------+ +-|-----|---------------|-|---+   | | |   | | |   | \n   |       | |   | |     | |   |     |   | | |         | |                         | |     |       |       | | | |   |     |     |                 | | |     |     |     |   | |   |   | | |   | | |   | \n   |       | |   | |     | |   |     |   +---+         | +---------------------------------|---------------|-----------------------------------+   +-|-----------------------------+   | | |   | | |   | \n   |       | |   | |     | |   |     |     |           |                           | |     |       |       | | | |   |     |     |             |     | |     |     |     |   | |       | | |   | | |   | \n   |       | +-+ +-------------------|-----|---------------+                       | |     |   +---|-------|-|---|---|-----------|-------------|-----|-+     |   +-+     |   | |       | | |   | | |   | \n   |       |   |   |     | |   |     |     |           |   |                       | |     |   |   |       | | | |   |     |     |             |     |       |   |       |   | |       | | |   | | |   | \n   |       |   |   +-----+ +---------|-----------------|---|-----------------------+ |     |   |   +-----------|-|---|-------------------------------|-------|-----------|-------------+ | |   | | |   | \n   |       |   |               |     |     |           |   |                         |     |   |           | | | |   |     |     |             |     |       |   |       |   | |         | |   | | |   | \n   +-------|---|---------------------------|---------------------------------------------------|---------------|-|---|-----------|-------------+     |       |   |       |   | |         | |   | | |   | \n           |   |               |     |     |           |   |                         |     |   |           | | | |   |     |     |                   |       |   |       |   | |         | |   | | |   | \n           +-------------------|-----|-----|---------------|-----------------------------------|-------------|-------------------|-------------------|-------|---------------|-|---------|-----|-+ |   | \n               |               |     |     |           |   |                         |     |   |           | | | |   |     |     |                   |       |   |       |   | |         | |   |   |   | \n               |         +-----------------|-----------+   |                         |     |   |           | | | |   |     |     |                   +-------|---|-----------------+     | |   |   |   | \n               |         |     |     |     |               |                         |     |   |           | | | |   |     |     |                           |   |       |   | |   |     | |   |   |   | \n               |         +-----------|U----|---------------+                         |     |   |           | | | |   |     |     |                           |   |       +-----|---|-------|---|-------+ \n               |               |     |     |                                         |     |   |           | | | |   |     |     |                           |   |           | |   |     | |   |   |     \n             +-|---------------------|-----------------------------------------------|-+   |   |           | | | |   |     |     |                           |   |           | |   |     | |   |   |     \n             | |               |     |     |                                         | |   |   |           | | | |   |     |     |                           |   |           | |   |     | |   |   |     \n             | |               |     |     |                                         | |   |   |           | | | |   |     |     |                         +-----+           | |   |     | |   |   |     \n             | |               |     |     |                                         | |   |   |           | | | |   |     |     |                         | |               | |   |     | |   |   |     \n             | |               |     |     |           +-----------------------------|-----|---|--------S--|-|---|---------------|---------------------------|---------------+ | +-+     +-|-------+     \n             | |               |     |     |           |                             | |   |   |           | | | |   |     |     |                         | |                 | |         |   |         \n             | |               |     |     |           |                             | |   |   |           | +-------------+     +---------------------------+               +---+         |   |         \n             | |               |     |     |           |                             | |   |   |           |   | |   |                                     |                 | |           |   |         \n             | |               |     |     |         +-|-----------------------------|-----|---|-----------|-----|-------------------------------------------+     +---------|-|-----------------------+ \n             | |               |     |     |         | |                             | |   |   |           |   | |   |                                     | |     |         B |           |   |       | \n   +---------|-|---------------------|-----------------------------------------------|-+   | +-----------------------|---------------------------------------------|-----------------+     |   |       | \n   |         | |               |     |     |         | |                             |     | | |           |   | |   |                                     | |     |         | |     |     |   |       | \n Y +---------|-----------------------+     +-----------------------------------------+     +-|-------------|-----|---|---------------------------------------|-----|-----+ +-+ +-+   |     |   |       | \n |           | |               |                     | |                                     | |           |   | |   |                                     | |     |     | |     |   |     |   |       | \n |           | |               |   +-----------------+ +-------------------------------------+ |           |   +-+   +-------------------------------------|-|-------------|-----|-------+ |   |       | \n |           | |               |   |                                                           |           |                                               | |     |     | |     |   |   | |   |       | \n |       +---+ |               |   |                                                           +--------------------------------------------W----------------|-----|-----+ +-----+   +-----+   +-------+ \n |       |     |               |   |                                                                       |                                               | |     |                     |               \n +-------+     +---------------+   +-----------------------------------------------------------------------+                                               +-+     +---------------------+               \n                                                                                                                                                                                                         "