adventofcode

git clone https://git.ce9e.org/adventofcode.git

commit
18f5919f86025a58624a35f4bd5e7a8729e5b317
parent
b8abde72fc085b81597438e99fdbd8dad857d85e
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-12-14 09:24
2023-12-14

Diffstat

A 2023/14/input.txt 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/14/part1.rs 33 +++++++++++++++++++++++++++++++++
A 2023/14/solution.rs 163 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/14/test.txt 10 ++++++++++

4 files changed, 306 insertions, 0 deletions


diff --git a/2023/14/input.txt b/2023/14/input.txt

@@ -0,0 +1,100 @@
   -1     1 ......#.O#O.##...O.....#...#..##...OO#.OO.......O.##....O.......O..#.#..O.O...O#O.O....#.O..OO..O.O.
   -1     2 .##.##OO..#.#O..##..OOO#..O.....O.O...#.........#.......#.O#.O..O...O..OO#O..O....#..O..#OO.O..O....
   -1     3 O.....#..#..O.#OOO.OO..O..#..#O.....O...#.O..#..#O#.........#.#.....###.#.#.O...#.#.O......O..OO..#.
   -1     4 O..#.#..#........O......O.OO#.OO..O.O...O.O.......O...O......#....O##.#.OO.#..#.O#O.O.#.#.O...#...O.
   -1     5 ...O........#.O.....#O.....OO#.#.##O...#..OO...#.O.#.##.OO...#.O.#O..O......#..#.....#..#..O#..#....
   -1     6 ..O....O.....O.#..O...O..#O..O.O.#....#.#OO.O#.#..#....#..#....#.OOO..O.O#O##O......#.O.O...#O.....O
   -1     7 .OO.#....#.O..O..OO.....#.O.OO........OO...#.#..O....#.O.....O.#.#..#...O#.#.O##O..#O#.OO..#O.#.O#..
   -1     8 .O..O.##O...O.O..O.O.....O....O...#O.........O.....O.#.O........O.OO.#O....OO..O..O.........#O......
   -1     9 ....#....O...O...#OO#....#O......O#..O.#OO.#.##.#.....O.#O.O##....#.O.......O.#O##........#......O.O
   -1    10 .#OO#.OO.O.##O.#..#.##OO.O....O#.....#...##..#.....#O#O.O....O.O..#....O...#.O.O.....O..#OOO#O...#O.
   -1    11 #....#......#..O.........#..#..O.###..#...#.O.O...OOO#......#..#O...O#..#OO#.#..#....#OO.OOO.....OO.
   -1    12 .OO#....###....OO..#O..O..O.O..O.O..O...#..#O...#O.OOOO..#..##...#.O.OO..#O...#.O#....O...O...#....#
   -1    13 .....O...O###O.#....#.O.....O..OOO.....O.#.O.O#.#.O.#.O..O...#OO...#O.#O....O.#.#....#O#..O......OO#
   -1    14 .O#.#.O.OO......#.....#....O.....O.O...OOO..........##......O......O....OO...O..O#....O....OO.......
   -1    15 #.......#...O.OOO...##O.OO.O.O...O..OO#O#O###.....#.OOO.O#O#.....#..#.O###O.......#OO.O...O.O....O.O
   -1    16 O....#.O.............O..#.......O.#.....O....#..O.#O#OO.O.#O.O....O..#O#.O....#O#OO..#..O.O......OO.
   -1    17 O...#.O.OO.O.#O#O.#.....###.O..#.#.#.O.O..#..#........#.O...#....#.O.....O.....#O.O..O..#...##....O.
   -1    18 ....#............O#.....O...OOO..#O....##..#..O#...O..##.O...O....#.......##.O.#.#O..O..O.#O#...###O
   -1    19 ...#O...O.OO#.....O..#......O.O#O..##O.O.O..#.#O.......O..O...#....O...#.#O...#.O.#O#.#.#O..O.###O.O
   -1    20 #..#O..O.#...#...#..O..#..#......O.....O.#...O..#.OO........#..#....#...##..O..O..O.......O...OO...O
   -1    21 .OOO...O.........#.O....O..O##....##.......#....#O..#.OO.O......O#O....#.......O......O.O......##..O
   -1    22 ......#...#O#...#...#OO.O#...O.O.O....O.O.....#.#..O.........O#.#.#..O#.#..#.......O.O....O...OO.O..
   -1    23 ...........#.OO....OOOO.....O...O#...O...#OO..O.O.#..#.O##O........#......#...#.#...##OO....#O#O###.
   -1    24 .#.##O....O#.O........O........OOO.OO..#..OO.....O.O.####...OO..O...#.O...O.OOO.#.....#..#.OO#.#O#O.
   -1    25 ..O..#.#..OO....OO..O............OO.....O#..OOO.O.O..#.O...O..O.OO#.O.#O.OO......#.##......O.#OO....
   -1    26 #.O...#O#O...O.O....O...#.###O...#...#...O..OO...O.......O.#....#..O.#O.#O..O..#O#...O....#.O.##O#..
   -1    27 .O#.....OO....O#.#.......#.#..###OO.......O....#...#O..#..#.O.O....O.O..#O........##O..#...O#.#O..O#
   -1    28 .O..##..#.....#.......#.....O....#..#O...#O#.O..O.O............O...#.#.#..OO#...O..#..O.O..#.....O.#
   -1    29 ..O..O#..#.###O..........#..O.OO.....O#.O..O...#.......###.......O..O#...#O##..O...O...#O....O#...O.
   -1    30 ..#O.#...OOOO.O...OO.OO...#....#.#.##...#.O.#O..#..O........O#.O...O.O#.....O#.#O..O...O.....#..#...
   -1    31 OO.....O.O#.O#.#.#...O#.#...#.........OO.#.#...#....O.OO...O...#O.##.O........O.O...O..O#..O..#.#.O.
   -1    32 .#.#..O..O..OO##...#.O.###O...#.O.....O...O...OO#.O...#O.#....#..OO#.O.O...#O#.#....O...#OO#..OO.#O.
   -1    33 O..O....O......#..O.#.#.#.#.....O.....#.#.O...O....OO....O.....O.....O...O.#O.....#OO...#..#.##..#..
   -1    34 ..O#....#..##......O..O..#....OO....OOO...#O...#...O..##..#...OO...OO......O#.OO....O....O.#O..O.O#O
   -1    35 .....O.....#OOO.O.O.OO..O.O....#....O..O#O#..#.#......#.O.O##.O..O......OOO...O.........O..O#.O.##.#
   -1    36 .O.#.....O#...O#.....OOO....O.O#....#.OO#......O........#.OO#O...O.##O.O....O..O#O.#.......O.....O#.
   -1    37 ..O..#.O.....#.OOO.#.....#O.#...O.OO..O.....#O.###...O.#..##...O...#.##......O....O...O#....O....O..
   -1    38 .O.O#O.O#.O......#.#.O..O#.......O.OO...OO...O.#OO#.....OO.O.O..#..OOO.....O#....O.#.....#....#.O...
   -1    39 ..O.........#.O..##...#..#OO#O#.#..#......O.#...#..#O.........#.#...OO....#......OO#O.##O.O..OO#....
   -1    40 ...O#.O.#.#........#.#..O.O#...O.#......O....##..##.#.O..OO.#.#....O..O....O..#O.#...#O#.O...#....O#
   -1    41 ...O..#...O...#O...#...OO.#O..#.O....O.#.O..O..O#.O....O.##O..#O.##....#.OO..#.#..#...OOO.O..O.#....
   -1    42 .......O#.O.#O##O..O..O.....O...O..O#O..O#O..#....O..O........O.....OO#...#...O.O#O....#.OO#....##..
   -1    43 #.##O#.......#...O#...#...#...#O.O.O...O..#.OO......#.O.#...##.O.#.O..O..#O#O...........OOOOOOO....#
   -1    44 .....O..O.#..O......#....O.....OO..O..#.....#.O..#..OO..#.OO.O.#....#...##...O.......#OO.O...#O.....
   -1    45 O.......##..OO...#..O.#.#.#.....O#.....O..O#.O#....##....O.#..OO.#..#OOO.O.O###O#.#OO......O...O...O
   -1    46 .......O..##O....O...#..#....O..OO#..O##O...O.OO....#....O...#.##O...O...##..#.#.O..O#O....#O...#O..
   -1    47 O.O.....O.O#.O#.O....O.#..##O.#.O..#.#.O.O###.#.O...#..O.O#...#.O.....#O..OO.O#O#..#O#.#...........O
   -1    48 .#...O.O#...#..OOO.O....O..#....O#...#........O#O.##.#...OO.....#....#O..#O.....O#...O...........#..
   -1    49 .#.#...O#O.....O#OO.#O....O##..##..O...#..O.O.O.....O..#O..O#O......#.O...O........O...#.........O.O
   -1    50 O.#O.##.....O#...OOO.......O.O.#.#.#.....#.OO.......#O.....#.O.O#...O##..#.#.............#.O#O....#.
   -1    51 ...O##.O#....OO.........#OO........O.O.OOO.#.#..O..#...OO....OO..........O...OO#OO..#O...O.O..O...O.
   -1    52 .OO.O#..#.#.O...#O...O..#...O.O..#..##.........#..##O.OO..#..O#.........#O.OOO......O.##...O#O....#.
   -1    53 .OOO....O...#..#O.......#.O......OO.O#O.....O...O..#....O.O#......O.O....O....OOO###..OO...#OO......
   -1    54 .O..O....#...OO.O...#....#O.O...#...OO##.....O..O...O........O...O#O...O...O.O....OO.OO......O.....#
   -1    55 ...#...#.OOO...O.......#......O.O.#.##.#.O.O...##.OO.#.O.O..OO#......OO..O.O#.#.......#..#.OO.O.OOO.
   -1    56 O#..#..##..O..OOO..O....#..O.......O...##O#..#..#.O.OO..#.O....#...OOO..O.O...OOO#.........#.#O...O.
   -1    57 .#...O..#.##.O........O..#..#O..##...#..OO...#.....O#..O.....#.##......#..OO........O..O#....#O#....
   -1    58 O.O#..O..#OOO..#.......#...#.O....##...#.O#...O......##........O.O####O.OO#..O....#...##O#..O..#....
   -1    59 ....#..O..#.O..O#O.#.......O.##....O#O#.OO.OO#.......O.O#..O...#O.OO.O.#..##OO#.O..OO.O.#OO#....O#O.
   -1    60 ....O..O...O...O#.#O.O...#.#O...O...O...O....#O##.#......##......O.....OO###OO....OO##.#...#.....OO#
   -1    61 .O.O.#...O...O......#.O..OOO#..O.O...O.#O......O......O...O.##..O.....#..#..O.#....O...##...........
   -1    62 #.O..##O.OO.O.....###O##OOO#O.#.#OO.O.O.O...#.#O#OOOO#.#O..O....O......OO....O........##.O..#O..O...
   -1    63 O#O..#OOO.O..O......#...O.......O.#..O#........#..##..#..O..O...#.#..#....O..O..OO.......O..#..O#..#
   -1    64 ..#....#.O..#.O#OO...........#...#.#OO#...#...#.##..O.#O.O.##...O#.#...O.##....O.O.O....O..O#.O.##.O
   -1    65 O..#.O...O....#....##.....#.#.O#..O..O.....#O.OO#.O..#...#.#.#.O.#..O#..OO.##O..O......O#O#..#..O.O.
   -1    66 .O....O.....O.#.......O.......O...#O..#...O..#OO##..O...##.#.O.O#.O..OO.......#OO.O....OO....##O.OO#
   -1    67 ..OO.#..O.......#O.O....O..#.O.O.OO....O..#....O.O.O....OO.#O##.....OOO#..O.#O.#...##OO.#...O.O.O..#
   -1    68 ..OO..OO.O#O...O..........O........O.O..#.#.O.O.......#O...O.O...##.#....#.O..#.....#...O.#...OO#O.#
   -1    69 .O.O.O.O..O#...O.....#.....O..O#....O..#..O###.O#.O.O...O.....O...##.#...O#..O#..O......O#...O.O....
   -1    70 .#...OO...OO.O#O.#....#....#O#..#...O.O...#OO.#O..#...#.O.......O#O..O#..#.#.OO...##.OO..O.#...O....
   -1    71 ....##...OOO..OO..O.O..#..#..##O..#O...........#..#..O#.OO.#....#..##OO#O.O#..#O#.##O##O##OO.O.#O.#O
   -1    72 .....#..O.....#....O#..#.O#.#..#OO.#..O.....O...#..#.O.O....#.#O.O.#..#.O.OO..O..#..O..#..#OOO....#O
   -1    73 OO#.#O..........O.......O#O..#O.#.##OO.#....O..O..#.O....#OO..#.##...#.....##O#.O.O...O#..O#..#....#
   -1    74 .O..O.OO..O.#...........OOO##..O..O...O.O#.O#OO...O.#...O.#.O.##.#..O.OO##.O.##O.O...O....OO#.......
   -1    75 .OOO.......#..O......OO.#...O...O#O.#......#.......O.#..#O..#O#...O.........OOO...O...##O.....#...OO
   -1    76 O..O.......#.O.O..#O##.##O.......#...O..OO.OO.#.OO.#.O.#.O...O....OO..O.##.......O....#.#.O..#....##
   -1    77 #..O.OO....#O......O..O.O...#.O....OO.O.OO..#..OO......#.....#.##.OO.##O.#O......#...O.OOO.....O..O.
   -1    78 .O....##..OO.##O####..........O##.##.O..O#O##.#O.#..O#......#O.OO........O#......##O...#OOO.....#.#.
   -1    79 .....#O..#..#....OO#....O.##....O.O.O.O#..#O.O..O....OO..OOOO.O.O.O..O....#.#..O..O..#...OO....#.O#O
   -1    80 #.#.#OO.....##.O...........#.##...#.#.O#O......#.......O.OOO..#.O...O....#.O.....#....O..#..O...##O.
   -1    81 ......OO...#....#...O#.OO...OO...O...O..#.#....##......O..................O.O..#.##......#.........#
   -1    82 ..O..#.O..##O.#.OO##O.OO.O..O..#....O.#.#.O.O..OO........O......O..O..#........###.#....O.#.#.......
   -1    83 ..##.......OO#..#.O.O#O.##.#..#.#...#O......O.O..O#...#O.O...OO...#..O#..#..O.#..O##..#...#..##..#O#
   -1    84 #O.OO..#....O...OO.#...O#.....O#..#..O...OO..#.....OO#.#.O...O..O.O.O.O.......O..O#..O..#OO.O#..#O#O
   -1    85 ......#........O.......#.O.O#.O...#...O.#........O..#O.#.O...O..O.##..O.O.........#OO.##............
   -1    86 #OO.O.O#O.#O..O.O.#.O..#.#O.O#......##..#O.........#O.....O..O#.##OOO.#......##...O.#..O##...O.#O.#.
   -1    87 #...O.#O.O..OO...O.##...#.O...O#O.#.#.O....O......O....O...#...O..#.....O#....O.O.#O.......#.O.###.O
   -1    88 ....##..O......O.........#.O..#..#O...OOO....#O###......#.#...#..OO....#...OO..O#.O..##.O.#........#
   -1    89 ......#.O#O#...OOO....OO..#.#...O...OO......#.###........O.OOO......##..O#...OO..O.#OO#....O.OO.##..
   -1    90 .#O#O#...##O...##O#...#.............#.#.O..O#OOO.##O#.O..#....O#....O......O..........#.#..O#.#...O.
   -1    91 O#O#.....OOO.....#............#.OO.#.O...O...O..#...#...##...O...O...O..#..O....O.....O.........#...
   -1    92 ...#O......O.##..#O...O#.O#O...O...#...O...O..#..O.O..........#....##..O.......#........#OO.........
   -1    93 ........#.O....O#.#.#O......##..#.#.....O.#..#...O..OO.O.#OO..O....O#...O.#..O.O...#.O.#O..O.O..#OO.
   -1    94 ..#.#.......#...#.O#...OOOOO..#...O...OOOO#..#...O.#OO..#..O............O....O..#.O.#.O.#...#..O.#.#
   -1    95 .#O....#.O..#O.O.#..#OO....O.O..O##O...O.##.....#..OO.##...#....OO...#.OO...O.#.O#.....##.#OO.#.##..
   -1    96 .O..O.O...##......#OOO..OO....O....O#..#.......O....O...#O.#.O.O#O#O#.......O.#.....O.....##.#..#.O.
   -1    97 #.#O..O##....OOO..O##....#O.O.O##...O.#OO..##..O.#...O..O#...O.....#.##....O..OO.#.O...O.OO..#..O...
   -1    98 ..#.#...O..OOO#...#..........#.O...###.......O..O....O..#..#....##.....OO#O......O.OO....#..#...#OOO
   -1    99 .O...O...#.##.#OO.#.O...O...O#O.#O....#..#....O#...OO.O....#O.O........O....#.....O...O#.OO..#......
   -1   100 .OO.O.#....O.O#......O#...#.##O#...O.#....#..O#O..#...#....O..OOO#.#.....O#.#O.##.#O#O.#.O....#.##O.

diff --git a/2023/14/part1.rs b/2023/14/part1.rs

@@ -0,0 +1,33 @@
   -1     1 #[path = "../lib.rs"]
   -1     2 mod lib;
   -1     3 
   -1     4 fn main() {
   -1     5     let mut width = 0;
   -1     6     let mut height = 0;
   -1     7     let mut cols = vec![];
   -1     8     let mut sum = 0;
   -1     9     let mut count = 0;
   -1    10 
   -1    11     for (y, line) in lib::iter_input().enumerate() {
   -1    12         height = y;
   -1    13         if width == 0 {
   -1    14             width = line.len();
   -1    15             cols = vec![0; width];
   -1    16         }
   -1    17 
   -1    18         for (x, b) in line.bytes().enumerate() {
   -1    19             match b {
   -1    20                 b'#' => { cols[x] = y + 1 },
   -1    21                 b'O' => {
   -1    22                     sum += cols[x];
   -1    23                     cols[x] += 1;
   -1    24                     count += 1;
   -1    25                 },
   -1    26                 b'.' => {},
   -1    27                 _ => unreachable!(),
   -1    28             }
   -1    29         }
   -1    30     }
   -1    31 
   -1    32     println!("part1: {}", count * (height + 1) - sum);
   -1    33 }

diff --git a/2023/14/solution.rs b/2023/14/solution.rs

@@ -0,0 +1,163 @@
   -1     1 #[path = "../lib.rs"]
   -1     2 mod lib;
   -1     3 
   -1     4 enum Cell {
   -1     5     Square,
   -1     6     Round,
   -1     7     Empty,
   -1     8 }
   -1     9 
   -1    10 fn parse_input() -> Vec<Vec<Cell>> {
   -1    11     return lib::iter_input()
   -1    12         .map(|line| {
   -1    13             line.bytes()
   -1    14                 .map(|b| match b {
   -1    15                     b'#' => Cell::Square,
   -1    16                     b'O' => Cell::Round,
   -1    17                     b'.' => Cell::Empty,
   -1    18                     _ => unreachable!(),
   -1    19                 })
   -1    20                 .collect()
   -1    21         })
   -1    22         .collect();
   -1    23 }
   -1    24 
   -1    25 fn tilt_north(rows: &mut Vec<Vec<Cell>>) {
   -1    26     for x in 0..rows[0].len() {
   -1    27         let mut next = 0;
   -1    28         for y in 0..rows.len() {
   -1    29             match rows[y][x] {
   -1    30                 Cell::Empty => {}
   -1    31                 Cell::Square => next = y + 1,
   -1    32                 Cell::Round => {
   -1    33                     rows[y][x] = Cell::Empty;
   -1    34                     rows[next][x] = Cell::Round;
   -1    35                     next += 1;
   -1    36                 }
   -1    37             }
   -1    38         }
   -1    39     }
   -1    40 }
   -1    41 
   -1    42 fn tilt_south(rows: &mut Vec<Vec<Cell>>) {
   -1    43     let last = rows.len() - 1;
   -1    44     for x in 0..rows[0].len() {
   -1    45         let mut next = 0;
   -1    46         for y in 0..rows.len() {
   -1    47             match rows[last - y][x] {
   -1    48                 Cell::Empty => {}
   -1    49                 Cell::Square => next = y + 1,
   -1    50                 Cell::Round => {
   -1    51                     rows[last - y][x] = Cell::Empty;
   -1    52                     rows[last - next][x] = Cell::Round;
   -1    53                     next += 1;
   -1    54                 }
   -1    55             }
   -1    56         }
   -1    57     }
   -1    58 }
   -1    59 
   -1    60 fn tilt_west(rows: &mut Vec<Vec<Cell>>) {
   -1    61     for y in 0..rows.len() {
   -1    62         let mut next = 0;
   -1    63         for x in 0..rows[0].len() {
   -1    64             match rows[y][x] {
   -1    65                 Cell::Empty => {}
   -1    66                 Cell::Square => next = x + 1,
   -1    67                 Cell::Round => {
   -1    68                     rows[y][x] = Cell::Empty;
   -1    69                     rows[y][next] = Cell::Round;
   -1    70                     next += 1;
   -1    71                 }
   -1    72             }
   -1    73         }
   -1    74     }
   -1    75 }
   -1    76 
   -1    77 fn tilt_east(rows: &mut Vec<Vec<Cell>>) {
   -1    78     let last = rows[0].len() - 1;
   -1    79     for y in 0..rows.len() {
   -1    80         let mut next = 0;
   -1    81         for x in 0..rows[0].len() {
   -1    82             match rows[y][last - x] {
   -1    83                 Cell::Empty => {}
   -1    84                 Cell::Square => next = x + 1,
   -1    85                 Cell::Round => {
   -1    86                     rows[y][last - x] = Cell::Empty;
   -1    87                     rows[y][last - next] = Cell::Round;
   -1    88                     next += 1;
   -1    89                 }
   -1    90             }
   -1    91         }
   -1    92     }
   -1    93 }
   -1    94 
   -1    95 fn cycle(rows: &mut Vec<Vec<Cell>>) {
   -1    96     tilt_north(rows);
   -1    97     tilt_west(rows);
   -1    98     tilt_south(rows);
   -1    99     tilt_east(rows);
   -1   100 }
   -1   101 
   -1   102 fn hash(rows: &Vec<Vec<Cell>>) -> Vec<(usize, usize)> {
   -1   103     let mut hash = vec![];
   -1   104     for y in 0..rows.len() {
   -1   105         for x in 0..rows[0].len() {
   -1   106             match rows[y][x] {
   -1   107                 Cell::Round => hash.push((x, y)),
   -1   108                 _ => {}
   -1   109             }
   -1   110         }
   -1   111     }
   -1   112     return hash;
   -1   113 }
   -1   114 
   -1   115 fn weigh(rows: &Vec<Vec<Cell>>) -> usize {
   -1   116     let mut sum = 0;
   -1   117     for y in 0..rows.len() {
   -1   118         for cell in rows[y].iter() {
   -1   119             match cell {
   -1   120                 Cell::Round => sum += rows.len() - y,
   -1   121                 _ => {}
   -1   122             }
   -1   123         }
   -1   124     }
   -1   125     return sum;
   -1   126 }
   -1   127 
   -1   128 fn part1() {
   -1   129     let mut rows = parse_input();
   -1   130     tilt_north(&mut rows);
   -1   131     let weight = weigh(&rows);
   -1   132     println!("part1: {}", weight);
   -1   133 }
   -1   134 
   -1   135 fn part2() {
   -1   136     let mut rows = parse_input();
   -1   137 
   -1   138     let period;
   -1   139     let mut history = vec![];
   -1   140     history.push(hash(&rows));
   -1   141     loop {
   -1   142         cycle(&mut rows);
   -1   143         let hash = hash(&rows);
   -1   144         if let Some(i) = history.iter().position(|h| *h == hash) {
   -1   145             period = history.len() - i;
   -1   146             break;
   -1   147         } else {
   -1   148             history.push(hash);
   -1   149         }
   -1   150     }
   -1   151 
   -1   152     for _ in 0..((1_000_000_000 - history.len()) % period) {
   -1   153         cycle(&mut rows);
   -1   154     }
   -1   155 
   -1   156     let weight = weigh(&rows);
   -1   157     println!("part2: {}", weight);
   -1   158 }
   -1   159 
   -1   160 fn main() {
   -1   161     part1();
   -1   162     part2();
   -1   163 }

diff --git a/2023/14/test.txt b/2023/14/test.txt

@@ -0,0 +1,10 @@
   -1     1 O....#....
   -1     2 O.OO#....#
   -1     3 .....##...
   -1     4 OO.#O....O
   -1     5 .O.....O#.
   -1     6 O.#..O.#.#
   -1     7 ..O..#O..O
   -1     8 .......O..
   -1     9 #....###..
   -1    10 #OO..#....