Add 2024 Quest 15

This commit is contained in:
Chris Alge 2024-11-23 17:19:52 +01:00
parent 3fbd447edd
commit 7484de90f3
8 changed files with 535 additions and 0 deletions

View file

@ -0,0 +1,6 @@
[package]
name = "day15_from_the_herbalists_diary"
version = "0.1.0"
edition = "2021"
[dependencies]

View file

@ -0,0 +1,66 @@
Part I
Visiting the alchemists' workshop is always a fascinating experience. The shelves are filled with colourful herbs, each meticulously cared for, all housed in its own pot. Many of them you are seeing for the first time in your life, which seems odd as you know the nearby forests like the back of your hand. The only place you couldn't explore is the Infinite Loop Forest, guarded day and night by the knights of the Order. You have suspected for a long time that these unique plants can be found there, and today you will have the chance to verify that by yourself!
This time, the candidates for joining the Order must demonstrate their ability to navigate unfamiliar terrain. Each knight receives a map with the locations of various herbs (your notes). Each type of herb is represented by a unique capital letter and can appear in multiple locations. To collect the herb, you must step on the field where this herb grows. Fields marked with # are poison bushes (and thus, should be avoided).
Every map represents an enclosed area with a single entry point at the top edge. The race begins from this point. The first task is to find the herb marked on the map with H and return to the starting point. Only a single plant is enough. You don't have to visit all the places where the herb grows. Time is of the essence, so you need to plan the shortest possible route to achieve this goal!
Example based on the following notes:
#####.#####
#.........#
#.######.##
#.........#
###.#.#####
#H.......H#
###########
In the example above, the herb we need to collect grows in the lower corners of the map.
One possible path is as follows (arrows show the direction of movement):
It takes 13 steps to reach the herb in the left corner,
#####↓#####
#↓←←←←....#
#↓######.##
#→→↓......#
###↓#.#####
#H←←.....H#
###########
and then another 13 steps to go back to the starting point.
#####.#####
#→→→→↑....#
#↑######.##
#↑←←......#
###↑#.#####
#→→↑.....H#
###########
Therefore, the total distance is: 13 + 13 = 26 steps, which is also the shortest possible path to collect the herb.
What is the minimum number of steps required to collect the herb and then return to the starting point?
Part II
The second round is very similar to the first one. The only changes are the map itself and the presence of a lake, marked with the symbol ~ , that you cannot enter because your armour would get rusty, significantly slowing your movement. Additionally, the number of herb types you need to collect has increased, but it is still required to collect only one plant of each kind.
Example based on the following notes:
##########.##########
#...................#
#.###.##.###.##.#.#.#
#..A#.#..~~~....#A#.#
#.#...#.~~~~~...#.#.#
#.#.#.#.~~~~~.#.#.#.#
#...#.#.B~~~B.#.#...#
#...#....BBB..#....##
#C............#....C#
#####################
In the example map above, there are three different types of herbs: A, B, and C.
The shortest path to collect at least one plant of each kind takes 38 steps:
12 steps to reach the A on the left side,
7 more steps to move to the C in the left corner,
9 more steps to move to the first B from the left,
and 10 more steps to return to the entry point.
What is the minimum number of steps required to collect at least one plant of each type of herb on your map and then return to the starting point?
Part III
The final round of the competition seems to be the same as it was in the previous two rounds. All the rules remain unchanged. The map is slightly larger, the number of herbs to collect has increased again, but some areas seem familiar, so it should go smoothly... right?
What is the minimum number of steps required to collect at least one plant of each type of herb on your map and then return to the starting point?

View file

@ -0,0 +1,266 @@
use core::fmt::Display;
use std::collections::{BTreeSet, HashMap, HashSet, VecDeque};
#[derive(Debug, PartialEq, Eq)]
pub enum ParseError {
EmptyInput,
NonRectangular,
NoStart,
ParseCharError(char),
}
impl Display for ParseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::EmptyInput => write!(f, "Input doesn't contain a map"),
Self::NonRectangular => write!(f, "Input is not rectangular"),
Self::NoStart => write!(f, "First line doesn't contain a walkable tile"),
Self::ParseCharError(e) => write!(f, "Unable to parse into a field: {e}"),
}
}
}
type Coordinates = (usize, usize);
#[derive(PartialEq, Eq, PartialOrd, Ord)]
struct Position {
estimated_total_costs: u32,
costs: u32,
to_collect: usize,
coordinates: Coordinates,
collecting: u8,
}
struct Map {
walkable: Vec<Vec<bool>>,
herbs: HashMap<u8, Vec<Coordinates>>,
width: usize,
height: usize,
start: Coordinates,
}
impl TryFrom<&str> for Map {
type Error = ParseError;
fn try_from(value: &str) -> Result<Self, Self::Error> {
let mut herbs: HashMap<u8, Vec<Coordinates>> = HashMap::new();
let mut walkable = Vec::new();
for (y, line) in value.lines().enumerate() {
let mut walkable_row = Vec::new();
for (x, c) in line.chars().enumerate() {
match c {
'.' => walkable_row.push(true),
'#' | '~' => walkable_row.push(false),
l if l.is_ascii_uppercase() => {
walkable_row.push(true);
herbs.entry(l as u8 - b'A').and_modify(|v| v.push((x, y))).or_insert(Vec::from([(x, y)]));
},
e => return Err(Self::Error::ParseCharError(e)),
}
}
walkable.push(walkable_row);
}
let height = walkable.len();
if height == 0 {
return Err(Self::Error::EmptyInput);
}
let width = walkable[0].len();
if walkable.iter().any(|row| row.len() != width) {
return Err(Self::Error::NonRectangular);
}
let start_x = walkable[0].iter().position(|tile| *tile).ok_or(Self::Error::NoStart)?;
Ok(Self { walkable, herbs, width, height, start: (start_x, 0), })
}
}
impl Map {
fn route_single(&self, herb: u8) -> Option<u32> {
let mut open_set = VecDeque::from([(self.start, 0)]);
let mut visited = HashSet::from([self.start]);
if let Some(targets) = self.herbs.get(&herb) {
while let Some((pos, dist)) = open_set.pop_front() {
if targets.contains(&pos) {
return Some(dist);
}
[(0, 1), (2, 1), (1, 0), (1, 2)]
.iter()
.filter(|(dx, dy)| {
pos.0 + dx > 0 &&
pos.1 + dy > 0 &&
pos.0 + dx <= self.width &&
pos.1 + dy <= self.height &&
self.walkable[pos.1+dy-1][pos.0+dx-1]
}).for_each(|(dx, dy)| {
let next_pos = (pos.0+dx-1, pos.1+dy-1);
if !visited.contains(&next_pos) {
visited.insert(next_pos);
open_set.push_back((next_pos, dist+1));
}
});
}
}
None
}
fn route(&self, start: Coordinates, dest: Coordinates) -> Option<u32> {
let mut open_set = VecDeque::from([(start, 0)]);
let mut visited = HashSet::from([start]);
while let Some((pos, dist)) = open_set.pop_front() {
if pos == dest {
return Some(dist);
}
[(0, 1), (2, 1), (1, 0), (1, 2)]
.iter()
.filter(|(dx, dy)| {
pos.0 + dx > 0 &&
pos.1 + dy > 0 &&
pos.0 + dx <= self.width &&
pos.1 + dy <= self.height &&
self.walkable[pos.1+dy-1][pos.0+dx-1]
}).for_each(|(dx, dy)| {
let next_pos = (pos.0+dx-1, pos.1+dy-1);
if !visited.contains(&next_pos) {
visited.insert(next_pos);
open_set.push_back((next_pos, dist+1));
}
});
}
None
}
fn route_all(&self) -> Option<u32> {
let interesting: Vec<(u8, Coordinates)> = self.herbs
.iter()
.flat_map(|(herb, coords)| coords.iter().cloned().map(|c| (*herb, c)).collect::<Vec<(u8, Coordinates)>>())
.chain([(255, self.start)])
.collect();
let network: HashMap<(Coordinates, Coordinates), u32> = interesting
.iter()
.enumerate()
.flat_map(|(l_idx, (l_herb, l_coords))| interesting
.iter()
.skip(l_idx + 1)
.filter(|(r_herb, _r_coords)| l_herb != r_herb)
.flat_map(|(_r_herb, r_coords)| {
let dist = self.route(*l_coords, *r_coords).unwrap();
[((*l_coords, *r_coords), dist), ((*r_coords, *l_coords), dist)]
}).collect::<Vec<_>>())
.collect();
let all_herbs: Vec<_> = self.herbs.keys().cloned().collect();
let all_herbs_int = (1_usize << all_herbs.len()) - 1;
let mut open_set = BTreeSet::from([Position{
estimated_total_costs: 0,
costs: 0,
coordinates: self.start,
to_collect: all_herbs_int,
collecting: 0,
}]);
let mut visited = HashMap::new();
while let Some(pos) = open_set.pop_first() {
if pos.to_collect == 0 {
if pos.coordinates == self.start {
return Some(pos.costs);
} else {
let costs = pos.costs + network.get(&(pos.coordinates, self.start)).unwrap();
open_set.insert(Position {
estimated_total_costs: costs,
costs,
coordinates: self.start,
to_collect: 0,
collecting: 0,
});
}
}
if !visited.keys().any(|(coords, to_coll)|
*coords == pos.coordinates &&
(to_coll ^ pos.to_collect) & to_coll == 0
) {
visited.insert((pos.coordinates, pos.to_collect), pos.costs);
let collected = all_herbs_int - pos.to_collect - (1 << pos.collecting);
if let Some(remaining) = visited.get(&(pos.coordinates, collected)) {
open_set.insert(Position {
estimated_total_costs: pos.costs + remaining,
costs: pos.costs + remaining,
coordinates: self.start,
to_collect: 0,
collecting: 0,
});
} else {
all_herbs
.iter()
.enumerate()
.filter(|(idx, _herb)| pos.to_collect & (1_usize << idx) != 0)
.for_each(|(idx, herb)| {
let to_collect = pos.to_collect - (1_usize << idx);
self.herbs.get(herb).unwrap()
.iter()
.for_each(|&coordinates| {
let costs = pos.costs + network.get(&(pos.coordinates, coordinates)).unwrap();
let estimated_total_costs = costs + all_herbs
.iter()
.enumerate()
.filter(|(idx, _herb)| to_collect & (1_usize << idx) != 0)
.map(|(_idx, herb)| self.herbs.get(herb).unwrap()
.iter()
.map(|&c| (c, network.get(&(coordinates, c)).unwrap()))
.min_by_key(|(_coords, dist)| *dist)
.unwrap()
).map(|(c, d)| d + *network.get(&(c, self.start)).unwrap_or(&0))
.max()
.unwrap_or(0);
open_set.insert(Position {
estimated_total_costs,
costs,
coordinates,
to_collect,
collecting: idx as u8,
});
});
});
}
}
}
None
}
}
pub fn run(input: &str, part: usize) -> Result<u32, ParseError> {
let map = Map::try_from(input)?;
match part {
1 => Ok(2 * map.route_single(b'H' - b'A').unwrap()),
2 | 3 => Ok(map.route_all().unwrap()),
_ => panic!("Illegal part number"),
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs::read_to_string;
fn read_file(name: &str) -> String {
read_to_string(name).expect(&format!("Unable to read file: {name}")[..]).trim().to_string()
}
#[test]
fn test_sample() {
let expected = [26, 38];
for part in 1..=expected.len() {
let sample_input = read_file(&format!("tests/sample{part}"));
assert_eq!(run(&sample_input, part), Ok(expected[part-1]));
}
}
#[test]
fn test_challenge() {
let expected = [200, 526, 1504];
for part in 1..=expected.len() {
let challenge_input = read_file(&format!("tests/challenge{part}"));
assert_eq!(run(&challenge_input, part), Ok(expected[part-1]));
}
}
}

View file

@ -0,0 +1,26 @@
#####################.#####################
#.........................................#
##########.#.#########.#########.##########
#.........................................#
#.###.###############################.##.##
#.........................................#
################.###.#.###.################
#.........................................#
##.#####.##############################.#.#
#.........................................#
#############.#####.##.########.###########
#.........................................#
#.#######################################.#
#.#.#.#.#.#.#.................#...#.#.#.#.#
#...#.#.#...#.................#...#.#.#.#.#
#.#.#...#.#.#.................#.#.#...#.#.#
#.#.#.#.#.#.#....###...###....#.#.#.#.#.#.#
#.#.#...#.#.#...#####.#####...#.#.#...#...#
#...#.#.#...#...#####.#####...#.#.#.#.#...#
#.#.#.#...#......###...###......#.#.#.#.#.#
#.#.#.#...#.#.....#.....#.....#.#.#.#.#.#.#
#.#...#.#.#.#.....#.....#.....#.#...#...#.#
#.#...#.#.#.#.................#.#.#.#.#.#.#
#.#.#.#.#.#.....H.H.H.H.H.H.....#...#.#.#.#
#.#.#.#.#.#.#.................#.#.#.#...#.#
###########################################

View file

@ -0,0 +1,77 @@
##########################################.##########################################
#.A.#.#...#.#.#...#...#.#.#.#.....#.#.#.#.........#.#.#...#.....#...#...#...#.#.#.A.#
#.A...#.#.#.#...#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.#.#.#.#.A.#
#.A.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.A.#
#.A.#...#.#...#.#.#.#.....#.#.#.#...#...#.#.#.#.#.#...#.#.#.#.#.#.#.#.#...#.#.#.#.A.#
#.A.#.#.#...#.#.#...#.#.#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.....#.#.#.#.#.#.#.......A.#
#.A.#.#.#.#.#...#.#...#.#.#.....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.A.#
#.A.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.#.#...#.#.#.#.#.A.#
#.A.#.#...#...#...#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#...#.#.#.#.#.#...#.#.....#.#.#.A.#
#.A.#.#.#.#.#.#.#.#.#.....#.#.#.#.....#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#...A.#
#.A.....#.#.#.#.#.....#.#.#.#.#.#.#.#.#.....#.#.....#.#.#.#.......#...#.#.#...#.#.A.#
#.A.#.#.#...#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.A.#
#.A.#.#.#.#.....#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#...#...#.#.#.#...#.#.#.#.#...#.A.#
#.A.#.#...#.#.#...#.#.#.#.#...#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#.#...A.#
#.A...#.#.#.#.#.#...#.#.#.#.#...#...#.#.....#.#.#.#.#.#.#...#.#...#.#.#.#.#...#.#.A.#
#.A.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#...#.#...#.#.#.A.#
#.A.#...#...#.#.#.#.#.#...#.#.#...#.#.#.#.#...#.#...#.#...#.#...#.#.#.#.#.#.#...#.A.#
#################.#################################################.#################
#.....#.#.#.#.#...#.#.#.#...#.#.#.B.B.B.B.B.B.B.B.B.#.#.#.#...#.#...#.#.#.#.#.#.#...#
#.#.#.#.#.#.#...#.#.#.#...#.#.#.B.B...............B.B.#.#.#.#.#.#.#.#...#...#.#.#.#.#
#.#.#.#.#.#.#.#.#.#...#.#.#.#.B.B.....~~~~~~~~~.....B.B.#.#.#...#.#.#.#.#.#...#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.B....~~~~~~~~~~~~~~~....B.#...#.#.#.#.#.#...#.#.#...#.#
#.#.#.#...#.#.#.#...#.#.#.#.B.B...~~~~~~~~~~~~~~~~~...B.B.#.#.#.#.#.#.#.#.#.#...#.#.#
#.#.#...#...#.#.#.#.#.....#.B...~~~~~~~~~~~~~~~~~~~~~...B.#.#.#...#.#.#.#.#.#.#.#.#.#
#.#...#.#.#.#.#...#.#.#.#.#.B...~~~~~~~~~~~~~~~~~~~~~...B.#.#.#.#.#...#.#.#.#.#.#.#.#
#.#.#.#.#.#...#.#.#.#.#.#...B...~~~~~~~~~~~~~~~~~~~~~...B.#.#.#.#...#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#...#...#.#.#.#.B.B...~~~~~~~~~~~~~~~~~...B.B.#.#.#.#.#.#.#.#.#.#...#.#.#
#.#.#.#.#...#.#.#.#.#.#.#.#.#.B....~~~~~~~~~~~~~~~....B.#...#...#.#.#...#...#.#.#.#.#
#.#.#...#.#.#.#.#.#.#.#.#.#.#.B.B.....~~~~~~~~~.....B.B.#.#...#.#.#.#.#.#.#...#.#.#.#
#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.B.B.B...........B.B.B.#.#.#.#.#...#.#.#...#.#.#.#.#.#
#.#.#.#...#.#.#.#.#.....#.#.#.#.#.#.B.B.B.B.B.B.B.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#
#.####################################.#.#.#.#.####################################.#
#.C.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#..#.#.#.#..#.#.#.#.#.#.....#.#.#...#.#.#.#.#.C.#
#.C.#.#.#.#.#.#...#.#.#.#.#.#.#.....#.............#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.C.#
#.C.#.#.#.#.#.#.#.#.......#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.C.#
#.C.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#...#.#.C.#
#.C.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.C.#
#.C.#.#.#...#...#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.....C.#
#.C.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.C.#
#.C.......#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.......#...#.#.#.C.#
#.C.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.C.#
#.C.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.C.#
#.C.#.#.#.#.#.#.#...#.#.#...#.#...#.#.#.#.#...#...#.#.#...#.#.#.#.#.#.#...#.#.#.#.C.#
#.C...#...#.....#.#.#...#.#.#...#...#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.C.#
#.C.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#...#.#.#.#.#.#.C.#
#.C.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.C.#
#.C.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#.#...#.#.#.#.#.#.#...#.#.#...C.#
#.C.#.#.#.#...#...#...#...#.....#.#.#...........#...#.#.#.....#.#...#.#.#.#.#...#.C.#
#.####################################.#.#.#.#.####################################.#
#...#.#.#.#.#.#.#.#.......#.#.#.#.#.#...........#.#.#.#.#.#.#.#.#.#.#.#.....#...#...#
#.#.#.#.#.#.........#.#.#...#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#
#.#.#.#...#.#.#.#.#.#.#.#.#...#...#...#.#.#.#.#.#.#...#.#.#...#.#.#.#...#.#.#.#.#.#.#
#.#...#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.....#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.#...#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#
#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#
#.#.#.#.#.#.#...#...#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#.#.#
#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#...#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.#.#
#.#.....#...#.#...#...#...#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#...#...#.#...#.#.#
#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.#...#...#...#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#...#.....#.#.#.#...#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#.#...#.#.#.#.#.#...#.#.#...#.#.#.#...#.#
#######################.#####################################.#######################
#...#...#.#...#.#.#.#.#...#.#.#.#.#...............#.#.#.#.#.#.#.#.#...#.#...#...#...#
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#......###......#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#
#.#...#...#.#...#.#.#.#.#.#.#.....#....#######....#.#.#.#...#.#.#.#.#.#...#.#.#.#.#.#
#.#.#.#.#...#.#.#.....#.#.#.#.#.#.#...#########.......#.#.#.#.#.#.#.#...#.#.#.#...#.#
#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#########...#.#.....#.#.#.#.#.#.#.#...#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#......#######....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.....#.#.#.#.#.#.#.#.#.#.#.#.#......###......#.#.#.#.#.........#.#.#.#.#...#.#.#
#.#.#.#.#.#.#.#.#.#.#...#.#.#...#.#.......#.......#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#
#.#...#.#.#.#.#.....#.#.#.#...#...#.......#.......#.#...#.#.#.#.#.#.#.#.#.#...#.#.#.#
#.#.#.#.#...#.#.#.#...#.#.#.#.#.#.#.......#.........#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#...............#.#.#.#...#.....#.#.#...#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.........D.......#.#.#.#.#.#.#.#.#.....#.#.#.#.#.#.#
#E#.#.#.#.#...#...#.#...#.#...#.#.#...............#...#...#.#.#.#...#.#.#.#...#.#.#E#
#####################################################################################

View file

@ -0,0 +1,77 @@
###############################################################################################################################.###############################################################################################################################
#.A.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.....#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.A.#..G.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.....#.#.#.#.#.....G..#.N.#...#.#.#.#.#...#.#...#.#.#.#.......#...#.#.#.#.#...#.#.#.#.#.#.#.#.........#.N.#
#.A.#.#.........#.#.#...#.....#...#.#.#.#.#.#.....#...#.#.#.#.#.#.#.......#.#.#.#.A..#.G...#...#.....#.#.#.#.#.#.#.#.#.....#.#...#.#.#.#.....#.....#.#.#.....#.#.#.#.#.G.#..N.#.#...#.#...#.#.#.#.#...#...#.#.#.#.#.#.#...#...#.#.#.....#.....#.#.#.#.#.#.#.N.#
#.A.#.#.#.#.#.#.....#.#...#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.A.#..G.#.#.#.#.#.#.#.#...#.#.#.#.....#.#.....#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.G..#.N...#.#.#.#.#.#.#.#.#.#.#...#...#.#.#...#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.N.#
#.A.#...#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#...#.........#...#.#.#.#...#.#.#.A..#.G.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.#.#.....#.#.G.#..N.#.#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#...#.#.#.#.#.#.#.#.#.N.#
#.A...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#...A.#..G.#...#...#.#...#.#.#.#.....#.#.#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.#...#.#.#...G..#.N.#.#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.....#.#.#.#.#.......#.#.#.#.N.#
#.A.#.#.#.......#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.A..#.G.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#...#.#...#.#...#.#.#.#.#.G.#..N.#.#.#...#.#.#.#...#.#.#.#.#.#.#.....#...#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.N.#
#.A.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.A.#..G.#.#.#.#...#.#.#...#.#.#.#.#.#.........#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.G..#.N.#...#.#.#.#.#.#.#.#.....#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.....N.#
#.A.#...#.#.#.#...#.#.#.#...........#.#.#...#.#.#.#.#...#.....#...#.#.#.#.#.#.#.#.A..#.G.#.#...#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.....#...#.#.#.#.#.#.#...#.#.G.#..N.#.#...#.....#...#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.N.#
#.A.#.#.#.#.#.#.#...#.#...#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.....#.#.#.A.#..G.#...#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.......#.#.#.#.#.#...#.#.#.#.#.#.#...#.G..#.N...#.#.#.#.#...#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#...#.#.#.#.#.#.N.#
#.A...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#.......A..#.G.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#...#.#...#.#.#.....#.#.#.G.#..N.#.#.#.#.#.#.#.#...#.#.#...#.#.#...#...#.#.#.#.#.#.#...#.#...#...#...#.#...#.#.N.#
#.A.#.#...#.#...#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.A.#..G...#.#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.....#.#.#.#.#.#...#.#.#.#.#.#.#.G..#.N.#...#.#.#.#.#.#.#.....#.#.#.#...#.#.#.#...#...#...#.#.#.#.#.#.#.#.#...#.#.#...N.#
#.A.#...#...#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.......#.#.#.#.#...#.#.#.#.#.#.#.#.A..#.G.#.#.#...#.#...#...#.....#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#...G.#..N.#.#.#.......#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.N.#
#.A.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.A.#..G.#.#...#.#.#.#.#.#.#.#.#.#.#.....#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.G..#.N.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#...#.#.#.N.#
#.A.#.#.#.#.#.#...#.#...#.#...#.#...#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#...#...A..#.G.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#...#.#.G.#..N.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.......#...#.#.#.#.#...#.#.#...#...#.#.#...#.N.#
#.A.#.#.#.#.#.#.#.#.#.#...#.#...#.#...#...#.#.#.#.#.#.#.#.#.#.#.#...........#...#.A.#..G.#...#.#.#.#.#...#...#.#.#.#.#.#.#...#.#.#...#.....#.#.#.#.#.#.#.#...#...#...#.G..#.N.#.#.#.#.#.#.#.#.#...#.....#...#.#.#.#.#.#.#...#...#...#...#...#.#.#.#.#...#.#.N.#
#.A...#...#.#.#.#.....#.#...#.#...#.#.#.#.#.#.#.#.......#.#.#.#.#.#.#.#.#.#.#.#.#.A..#.G...#.#.........#.#.#.#.......#.#.#.#...#.#.#.#.#.#.....#.....#.#...#.#.#.#.#.#.G.#..N...#.#...#.#...#...#.#.#.#...#.#.#.#.#.#...#.#...#.#.#.#.#...#.#.#.#.#.#.#.#...N.#
#################.#################################################.#################.################.#################################################.################.#################.#################################################.#################
#.....#.#.#.#.#.#.#.#.#.#...#.#.#.B.B.B.B.B.B.B.B.B.#.#.#.#.#...#.#...#...#.#.#.#....#...#.#.#.#.#.#.#...#.#.#.#.#.#.#.H.H.H.H.H.H.H.H.H.#.#.#...#.#...#.#.#...#.#.#.#...#......#.#.#.#.#.#...#.#.#.#.#.#.#.O.O.O.O.O.O.O.O.O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.B.B...............B.B.#.#.#...#.#.#.#.#.#.#.#.#...#.#..#...#.#.#.#.#.#.#.#.#.#...#.#.H.H...............H.H.#.#.#.#.#.#.#.#.#.#.#.#...#.#..#.#.#.#.#.....#.#.#.#.#.#.#.#.#.O.O...............O.O.#.#.#.#.#.#...#.#.#...#...#.#.#
#.#.#.#...#.#.#.#...#.#.#.#.#.B.B.....~~~~~~~~~.....B.B.#.#.#.#.#.#.#.#.#.#.....#.#..#.#.#.#.....#.#.#.#.#.#...#.#.H.H.....~~~~~~~~~.....H.H.#.#...#.#...#.#.#.....#.#.#.#..#.#.#.#.#.#.....#.#...#.#.#.O.O.....~~~~~~~~~.....O.O.#...#.#.#.#.#.#...#.#.#.#.#.#
#.#.#.#.#.#.#.#...#...#...#.#.B....~~~~~~~~~~~~~~~....B.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#...#.#.#.....#.#.#.#.#.#.H....~~~~~~~~~~~~~~~....H.#.#.#.#.#.#.#...#.#.#.#.#.#..#.#.#.#.#.#.#.#.#.#...#.....#.O....~~~~~~~~~~~~~~~....O.#.#.#.#.#.#.#.#.#.#...#.#.#.#
#.#.#...#.#.#.#.#.#.#.#.#.#.B.B...~~~~~~~~~~~~~~~~~...B.B.#.#.#.#...#.#.#.#.#.#.#.#..#.#.#.#.#.#...#.#.#.#.#.#.#.H.H...~~~~~~~~~~~~~~~~~...H.H.#.#.#...#...#.#.#.#.#...#.#..#.#...#.#.#.#.#.#.#.#.#.#.O.O...~~~~~~~~~~~~~~~~~...O.O.#.#.#.#.#.#...#.#.#.#.#.#.#
#.#.#.#.#...#.#.#.#.#.#.#...B...~~~~~~~~~~~~~~~~~~~~~...B...#.#...#.#.....#.#.#...#.#..#.#.#.#.#.#.#.#.#.#.#.#.#.H...~~~~~~~~~~~~~~~~~~~~~...H.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#.#...#.#.#.#.#.#.#.#.O...~~~~~~~~~~~~~~~~~~~~~...O.#.....#.#.#.#.#.#.#.#...#.#
#.#...#.#.#...#.#.#.#...#.#.B...~~~~~~~~~~~~~~~~~~~~~...B.#.#.#.#.#.#.#.#.#.#...#.#..#.#.#.#.#...#.#.#...#.#.#.#.H...~~~~~~~~~~~~~~~~~~~~~...H.#.#...#.#.#.#.#.#.#.#.#.#.#..#...#.#.#...#.....#.#.#.#.O...~~~~~~~~~~~~~~~~~~~~~...O...#.#...#...#.#.#.#.#.#.#.#
#.#.#.#.#.#.#...#.#.#.#.#.#.B...~~~~~~~~~~~~~~~~~~~~~...B.#.#.#.#.#...#.#...#.#.#.#.#..#.#.#.#.#.#.#.#.#.....#.#.H...~~~~~~~~~~~~~~~~~~~~~...H...#.#.#.#.#.#.....#.#.#.#..#.#.#.#...#.#.#.#.#.#.#.#.#.O...~~~~~~~~~~~~~~~~~~~~~...O.#.#.#.#.#.#.#.....#...#.#.#
#.#.#.#...#.#.#...#.#.#.#.#.B.B...~~~~~~~~~~~~~~~~~...B.B.#.....#.#.#.#.#.#.#.#.#.#..#.#...#.#.#.#.#.#.#.#.#...#.H.H...~~~~~~~~~~~~~~~~~...H.H.#...#.#...#...#.#...#.#.#.#..#.#.#.#.#.#.#.#.#...#.#.#.O.O...~~~~~~~~~~~~~~~~~...O.O.#.#.#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.#.#...#.#.#...#.#.#.#.#.B....~~~~~~~~~~~~~~~....B.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#.#.#.#...#.#.#.#.#.#.H....~~~~~~~~~~~~~~~....H.#.#.#.#.#.#...#.#.#.#.#...#..#.#.#.#.#.#.#...#.#.#.#...#.#.O....~~~~~~~~~~~~~~~....O.#.#...#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#...#...#.#.B.B.....~~~~~~~~~.....B.B.#.#.#.#.....#.#.#.#...#.#.#..#.#.#...#.#...#.#.#.#.#.#.#.#.H.H.....~~~~~~~~~.....H.H.#.#.#.#.#.#.#.#.#.#.#...#.#.#..#.#.#.#.#.#.#.#.#.#...#.#.#.O.O.....~~~~~~~~~.....O.O.#.#.#...#.#.....#.#.#.#...#.#
#.#.#...#.#.....#.#.#.#.#.#.#.#.B.B.B...........B.B.B.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#..#.#.#...#.#...#.#.....#.#.#.#.H.H.H...........H.H.H.#.#.#.#...#.#.#.#.#.#.#.#.#.#..#.#.#.....#.#.#.#.#.#.#.#...#.#.O.O.O...........O.O.O.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.B.B.B.B.B.B.B.#.#.#.#...#.#.#.#.#.#.#...#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.H.H.H.H.H.H.H.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.O.O.O.O.O.O.O.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#.#
#.####################################.#.#.#.#.####################################.#..####################################.#.#.#.#.####################################..#.####################################.#.#.#.#.####################################.#
#.C...#.#.#.#.#.#.#.#...#.#.#.#.#...#..#.#.#.#..#.#.#.#.#.#.#.#.#...#.#...#.#...#.C..#.I...#.#.#.#.#.#...#.#.#.#.#.#.#.#.#..#.#.#.#..#.#.#.#.#.....#.#...#.#...#.#...#.I.#..P.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#....#.#.#.#....#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.P.#
#.C.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...........#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.C.#..I.#.#.#.#.#.....#.#.#.#.#.#.#.#.#.#.............#.#.#.#.#.#...#.#.#.#.#.#.#.#...I..#.P.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...........#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.P.#
#.C.#...#...#.#.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#...#.#.#.#.#.#.#.#.....#.#.#.#...C..#.I.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#...#.#...#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.I.#..P.#.#.#.#.#.#.#...#.#.#...#...#.#.#.#.#.#.#.#.#.#.#...#.....#.#.#.#...#.#.#.#.#.P.#
#.C.#.#.#.#.#.#.#.#.#.#.#...#...#.#...#.#.#.#.#.#.#.....#.#...#.#.#.#.#.#.#.#.#.#.C.#..I.#.#.#.#.#.#.#.#.....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#...#.#.I..#.P.#.#.#.#.#.#.#.#...#...#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...P.#
#.C.#.#.#.#.....#.......#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.C..#.I.#.#.#.....#.#.#.#.#.#...#...#...#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.....#.#...#.I.#..P...#...#.#.#...#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.....#.#.#.P.#
#.C.#.#.#.#.#.#...#.#.#...#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.C.#..I.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.I..#.P.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.P.#
#.C...#...#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.C..#.I.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.....#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.I.#..P.#...#.#.....#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.....#.#.#.#.#.#.#.#...#.#.#.#.#.#.P.#
#.C.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.C.#..I.#.....#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.I..#.P.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.P.#
#.C.#.#.#.#.#...#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.C..#.I.#.#.#.#.#.#.#.#...#.#...#.#.#.#.#.#.#.#.#.....#.#.#...#.#.#.#.#.#.#.#...#.#.#.I.#..P.#.#.#.#.#.#.....#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.....P.#
#.C.#.#.#.#.#.#...#.#.#.#.#.#.#.....#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.#.#.C.#..I.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.I..#.P.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#...#.#.#.#...#.#...#.#.#.#.#.#.#.#.#.P.#
#.C.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#.#.......#.....#.#.#.#.C..#.I...#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.I.#..P.#.#.#.#...#.#.#.#.#.#.#...#.#.#.#.....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.P.#
#.C.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...C.#..I.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#.I..#.P.#.#.#.#.#...#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#...#.#.#.#.#...#.........#.#.P.#
#.C.#.#.#.....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#.#.#.#.#.#.#...#.#.....#.#.C..#.I.#.#.#.#.#.....#.#.#.#.#.#...#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#...#...#.#.#.I.#..P...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.P.#
#.C.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.....#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.C.#..I.#...#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.I..#.P.#...#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#...#.#.#.#...#.#.#...#...#.#.#.#.#.#.#.#.P.#
#.C.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.C..#.I.#.#.#...#.#.#...#.#.#.#.#.#...#.#.#.....#.#.#.#.#.#.#.#.#.#.....#.#.#.#.#.#.#.I.#..P.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.P.#
#.C.#.#.#.#.#.#.#...#.#.#.#...#.#.#.#...........#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.C.#..I.#.#...#...#.#.#.#.#...#.#.#.#.#.............#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...I..#.P.#.#...#.#.#.#.#...#.#.#.#.#...#.#...........#...#.#.#...#...#.#.#.#.#.#...#.#.P.#
#.####################################.#.#.#.#.####################################..#.####################################.#.#.#.#.####################################.#..####################################.#.#.#.#.####################################.#
#.#.#...#.#...#.#.#.#...#.#.#.#...#.#...........#.#...#.#.#.#...#.#...#...#.#.#.#.#.#..#...#.#.#.#.#.#.#.#.#.#.#.....#.#.#...........#.#.......#...#.#...#.#...#.#...#.#..#.#.....#.#.#.#.#...#...#.#.#.#.#.#.#...........#.#.#.#.#...#.#.#.#.#.#.#...#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#...#.#.#.#.#.#.#.#...#.#...#.#.#...#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#...#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#..#.#.#.#.....#.#.....#.#.#.#.#.#.....#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#...#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#.#...#...#.#
#.#.#.#.#...#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#...#...#..#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#..#.#.#...#.#.#.#.#...#.#...#...#...#.......#.#.#.#.#...#.#...#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.#...#.#...#.#...#.#.#.#.#.#...#.#.#.#.#.#.#...#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#.#...#.#...#.#.#...#...#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#...#.......#.#.#.#...#..#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#.....#.#.#.#.#.#...#.#.#
#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#...#.#.#.#...#...#.#.#.#...#.#.#.#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.#...#.#.#...#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#...#.#.#.#.#.#.#.#.#
#...#.#.#.#.#.#...#.#...#.#...#.#.#.#.....#.#.#.#.#.#.#.#.#.#.......#.#.#.#.#.#.#...#....#.#.#...#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#...#.#.#...#.#.#.#.#.#.#.#.#.#.#....#...#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#...#
#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.....#..#.#.#.#.#.#.#.#.....#.#.#.#.#.#.#.#.#.#...#...#.#.#.#.#...#.#.#.#.#.#.#.#...#.#.#.#.#..#...#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#
#.#.#.#.#...#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#...#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#...#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#...#.#.#.#.#.#..#.#.#...#.#.#.#.#.#...#.#...#.#...#.#.#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#..#.#...#.#.#.#.#.#.#.#.#.#...#.#.....#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#..#.#.#.#.#.#.#.#.#.#.#...#...#.#.#.#...#.#.#.#.#.....#.#.#.#.....#.#.#.#.#.#.....#.#
#.#.#.#.#.#...#.#.....#.#...#.#.....#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#.#.#.#.#.#...#.#.#...#.#.#...#.#...#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#.#...#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#
#.#...#...#.#.....#.#.#.#.#.#.#.#.#.#...#.#.#.#.#...#...#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#...#.#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#.#.#.#.#...#...#...#.#.#.#..#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.....#.#...#...#.#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#...#.#...#.#...#.#.#...#...#.#.#...#.#.#...#.#.#...#...#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#.#.#.#...#.#...#.#.#.#...#.#.#.#..#.#.#.#.#.#.....#.#.#.#.#.#.#.....#.#.#...#.#.#...#.#.#.#.#.#.#.#.#...#.#...#.#.#.#.#
#######################.#####################################.######################.#######################.#####################################.#######################.######################.#####################################.#######################
#...#.#.#...#.#.#.#.#...#.#.#.#.#.#.................#.#.#.#.....#...#.#.....#.......#....#.#.#.#.#...#.#.#.#...#.#.#...#...............#...#.#.#.#.#...#.#...#.#.#.#.#....#...#.#.#.#.#.#.#.#.....#.#.#.#.#.#...............#.#.#...#...#.#.#...#.#.#.#.#.....#
#.#.#.#.#.#.#...#...#.#.#.#.#.#.#.#......###......#.#.#.#.#.#.#...#...#.#.#.#.#.#.#..#.#.#.#.#.#...#.#.#.#...#...#.#.#........###......#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#..#...#...#.#...#.#.#.#.#.#.#.#...#......###......#...#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#....#######....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#....#######....#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#..#.#.#.#.#.#...#.#.#.#.#.#.#.#...#......#######....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#
#.#.....#.#.#.#...#.#.#.#.#...#.#.....#########...#.#.#...#.#.#.#.#.#...#.#.#.#.#.#..#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#...#########...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.......#.#.#...#########...#.#.#.#.#.#.#...#.#.#.....#...#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#...#...#.#...#########...#.....#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#...#.#.#.#...#.....#.#.#.#.#.#.#...#########.....#...#.#.#...#.#.#.#.#.#.#...#.#..#.#.#.#.#...#.#.#.....#.#.#.#.#.#.#...#########.....#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.#...#.....#.#.#.#...#.#.#.#.#....#######....#.#.#.#...#.#.#.#.#.#...#.#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#....#######....#.#.#.#.#.#.#...#.#.....#...#.#.#.#..#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#....#######....#.#...#.#.#...#...#...#.#...#.#.#.#
#.#.#.#.#...#.#.#.#.#.#.#.#.#.#...#......###......#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#..#.#.#.....#.#.#.#.#.#.#.....#.#.#......###......#.#.#.#.....#.#.#.#.#.#.#.#.#...#..#.#.#.#...#.#.#.#.#.#.#.#.#.#............###......#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#
#.#.#.#.#.#.#.#...#.#...#.#.#.#.#.#.......#.......#.#.#.#.#...#...#.#...#.#.#.#.#.#..#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.......#.......#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..#.....#.#.....#.#.#...#.#.#.#.#.#.......#.......#.#.#.#...#.#.#.#.#.#.#...#.....#.#
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.......#.......#.#.#...#.#.#.#.#.#.#.#.....#...#.#..#.#...#.#.#.#.#.#...#.#.#.#...#.#.......#.........#.#...#.#.#.#.#.#.#.#.#.#...#.#..#.#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.......#.......#.#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#
#.#.#...#.#.#.#.#.....#...#.#.#.#.#.......#.......#.#.#.#.#.#...#.#.#.#.#.#.#.#.#.#..#.#...#.#.#...#.#.#.#...#.#.#.#...#.......#.......#.....#.#.#.#.#.#.#.#...#...#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.......#.......#...#.#.#.#.#.#...#.#.#.#...#.#.#.#
#.#.#.#.#.#.#.#.#.#.#.#.#.....#.#.#...............#...#.#.#.#.#.#.#...#.#.#.#.#.#.#.#..#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...............#.#.#.#.#.#.#.#...#.#.#...#.#...#..#.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#...............#.#.#...#.#.#...#.#.#.#.#.#.#.#.#.#
#.#.#.#...#...#.#.#.#.#.#.#.#.#.#.#.......D.........#...#...#.#.#.#.#.#.#.#.#.#.#.#..#.#.#.#...#.#.#.#.#.#.#...#.#.#.#.........J.......#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.#.#..#.#...#.#.#.#.#.#.#.#.#...#.#.#.#.......Q.........#...#...#...#.#.#.#.#.#.#.#.#.#.#
#E#...#.#.#.#.#.#.#.#.#.#.#.#.....................#.#.#.#.#.#.#.#...#.#.#.#...#.#.#E..K#.#...#...#.#.#...#.#.#.#...#.#.#...............#.#.#...#.....#.#...#.#.#.#.#.#.#K..R#.#.#.#.#.#.#...#.#.#...#.#.#.#.#...............#.#.#.#.#.#.#.#.#.....#.#.#.#.#.#R#
###############################################################################################################################################################################################################################################################

View file

@ -0,0 +1,7 @@
#####.#####
#.........#
#.######.##
#.........#
###.#.#####
#H.......H#
###########

View file

@ -0,0 +1,10 @@
##########.##########
#...................#
#.###.##.###.##.#.#.#
#..A#.#..~~~....#A#.#
#.#...#.~~~~~...#.#.#
#.#.#.#.~~~~~.#.#.#.#
#...#.#.B~~~B.#.#...#
#...#....BBB..#....##
#C............#....C#
#####################