Compare commits

..

20 Commits

Author SHA1 Message Date
Fabian Schmidt
8c64ee3825 y2024d7 2024-12-08 00:42:18 +01:00
Fabian Schmidt
d3f4cfd897 y2024d6 2024-12-07 23:49:09 +01:00
49633b8504 y2016d5 2024-12-06 10:04:09 +01:00
8fd9bcd63a y2016d4 2024-12-05 12:54:39 +01:00
a09f89896d y2016d3 2024-12-05 10:47:26 +01:00
d12175371e y2016d2 2024-12-05 10:21:06 +01:00
3da784f97d y2024d5 2024-12-05 09:13:24 +01:00
b39f312e9f y2016d1 genuinely don't understand why this was so hard 2024-12-04 15:44:56 +01:00
f663a57db8 fixed justfile as I had some issues when I wanted to generated 2024 2024-12-04 14:39:44 +01:00
33ba8d72f4 y2015d25 2024-12-04 14:33:50 +01:00
29a122c3ff y2024d4 2024-12-04 11:19:28 +01:00
dafe576fc9 y2015d24 pretty easy also but had to use itertools instead of my own combinations/permutations impl because of an overflow 2024-12-03 15:28:12 +01:00
900f01913f y2015d23 refreshingly easy 2024-12-03 13:33:49 +01:00
f952db1e0f y2024d3p2 simplified, anyway, I lost too much time on it already 2024-12-03 13:03:49 +01:00
1ec3c9c939 y2024d3p2 2024-12-03 12:53:58 +01:00
27e9e60089 y2024d3 p2 still incorrect 2024-12-03 10:52:57 +01:00
d06a694543 y2024d3 use regex for part 1 2024-12-03 10:21:13 +01:00
d655185336 y2024d3 second try part 2 2024-12-03 10:12:20 +01:00
f468af10f4 y2024d3 first try part 2 2024-12-03 10:11:59 +01:00
4d1477d7c1 y2015d22 finally, alot of small things to watch out for 2024-12-02 15:51:01 +01:00
124 changed files with 228 additions and 20705 deletions

62
Cargo.lock generated
View File

@@ -11,31 +11,6 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "crossbeam-deque"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]] [[package]]
name = "either" name = "either"
version = "1.13.0" version = "1.13.0"
@@ -67,26 +42,6 @@ version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "rayon"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.11.1" version = "1.11.1"
@@ -133,9 +88,7 @@ dependencies = [
name = "y2016" name = "y2016"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"itertools",
"md5", "md5",
"utils",
] ]
[[package]] [[package]]
@@ -161,9 +114,6 @@ version = "0.1.0"
[[package]] [[package]]
name = "y2022" name = "y2022"
version = "0.1.0" version = "0.1.0"
dependencies = [
"utils",
]
[[package]] [[package]]
name = "y2023" name = "y2023"
@@ -173,18 +123,6 @@ version = "0.1.0"
name = "y2024" name = "y2024"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"itertools",
"rayon",
"regex",
"utils",
]
[[package]]
name = "y2025"
version = "0.1.0"
dependencies = [
"itertools",
"rayon",
"regex", "regex",
"utils", "utils",
] ]

View File

@@ -16,7 +16,6 @@ members = [
"y2022", "y2022",
"y2023", "y2023",
"y2024", "y2024",
"y2025",
] ]
[workspace.dependencies] [workspace.dependencies]
@@ -24,4 +23,3 @@ utils = { path = "../utils" }
itertools = "0.13.0" itertools = "0.13.0"
regex = "1.11.1" regex = "1.11.1"
md5 = "0.7.0" md5 = "0.7.0"
rayon = "1.10"

179
day22.js Normal file
View File

@@ -0,0 +1,179 @@
'use strict';
var bossStats = {
hp: 71,
damageAmt: 10,
}
class Player {
constructor(initial, isWizard) {
this.history = [];
this.initial = initial;
this.isWizard = !!isWizard;
if (this.isWizard) {
this.spells = [
{
cost: 53,
effect: (m, o) => o.damage(4),
},
{
cost: 73,
effect: (m, o) => { o.damage(2); m.hp += 2; },
},
{
cost: 113,
start: (m, o) => m.armor += 7,
effect: (m, o) => { },
end: (m, o) => m.armor -= 7,
duration: 6,
},
{
cost: 173,
effect: (m, o) => o.damage(3),
duration: 6,
},
{
cost: 229,
effect: (m, o) => m.mana += 101,
duration: 5,
},
];
}
this.start();
}
attack(opponent, spellIdx) {
if (!this.isWizard) {
opponent.damage(this.damageAmt);
} else {
this.history.push(spellIdx);
var spell = this.spells[spellIdx];
this.spent += spell.cost;
this.mana -= spell.cost;
if (spell.duration) {
var newSpell = {
idx: spellIdx,
effect: spell.effect,
duration: spell.duration,
};
if (spell.start) {
spell.start(this, opponent);
}
if (spell.end) {
newSpell.end = spell.end;
}
this.activeSpells.push(newSpell);
} else {
spell.effect(this, opponent);
}
}
}
damage(n) {
this.hp -= Math.max(1, n - this.armor);
}
duplicate() {
var newPlayer = new Player(this.initial, this.isWizard);
newPlayer.hp = this.hp;
newPlayer.spent = this.spent;
newPlayer.armor = this.armor;
newPlayer.turn = this.turn;
for (var i = 0; i < this.activeSpells.length; i++) {
newPlayer.activeSpells.push(Object.assign({}, this.activeSpells[i]));
}
for (var i = 0; i < this.history.length; i++) {
newPlayer.history.push(this.history[i]);
}
if (this.isWizard)
newPlayer.mana = this.mana;
else
newPlayer.damageAmt = this.damageAmt;
return newPlayer;
}
takeTurn(opponent) {
this.turn++;
for (var i = 0; i < this.activeSpells.length; i++) {
var spell = this.activeSpells[i];
if (spell.duration > 0) {
spell.effect(this, opponent);
spell.duration--;
if (spell.duration === 0 && spell.end) {
spell.end(this, opponent);
}
}
}
}
start() {
this.hp = this.initial.hp;
this.spent = 0;
this.armor = 0;
this.turn = 0;
this.activeSpells = [];
if (this.isWizard)
this.mana = this.initial.mana;
else
this.damageAmt = this.initial.damageAmt;
}
}
var me = new Player({ hp: 50, mana: 500 }, true);
var boss = new Player(bossStats);
var cheapestSpent = Infinity;
function playAllGames(me, boss, partTwo, depth) {
depth = depth || 0;
for (var i = 0; i < me.spells.length; i++) {
var spellMatch = false;
for (var j = 0; j < me.activeSpells.length; j++) {
if (me.activeSpells[j].duration > 1 && i === me.activeSpells[j].idx) {
spellMatch = true;;
}
}
if (spellMatch)
continue;
if (me.spells[i].cost > me.mana) {
continue;
}
var newMe = me.duplicate();
var newBoss = boss.duplicate();
if (partTwo)
newMe.hp--;
newMe.takeTurn(newBoss);
newBoss.takeTurn(newMe);
newMe.attack(newBoss, i);
newMe.takeTurn(newBoss);
newBoss.takeTurn(newMe);
newBoss.attack(newMe);
if (newBoss.hp <= 0) {
cheapestSpent = Math.min(cheapestSpent, newMe.spent);
}
if (newMe.hp > (partTwo ? 1 : 0) && newBoss.hp > 0 && newMe.spent < cheapestSpent)
playAllGames(newMe, newBoss, partTwo, depth + 1);
}
}
playAllGames(me, boss);
console.log('Part One:', cheapestSpent);
cheapestSpent = Infinity;
playAllGames(me, boss, true);
console.log('Part Two:', cheapestSpent);

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y{{YEAR}}::days::d{{DAY}}; use y{{YEAR}}::days::d{{DAY}};
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,27 +1,20 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d1; use y2015::days::d1;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {
let root = env!("CARGO_MANIFEST_DIR"); let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/1_input.txt")).unwrap(); let content = fs::read_to_string(format!("{root}/resources/1_input.txt")).unwrap();
println!("Answer: {}", d1::process_part1(&content)); println!("{}", d1::process_part1(&content));
} }
fn part2() { fn part2() {
let root = env!("CARGO_MANIFEST_DIR"); let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/1_input.txt")).unwrap(); let content = fs::read_to_string(format!("{root}/resources/1_input.txt")).unwrap();
println!("Answer: {}", d1::process_part2(&content)); println!("{}", d1::process_part2(&content));
} }

View File

@@ -1,17 +1,8 @@
use std::time::Instant;
use utils::time::get_elapsed_string;
use y2015::days::d10; use y2015::days::d10;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,8 @@
use std::time::Instant;
use utils::time::get_elapsed_string;
use y2015::days::d11; use y2015::days::d11;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d12; use y2015::days::d12;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d13; use y2015::days::d13;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d14; use y2015::days::d14;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d15; use y2015::days::d15;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d16; use y2015::days::d16;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d17; use y2015::days::d17;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d18; use y2015::days::d18;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d19; use y2015::days::d19;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d2; use y2015::days::d2;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,8 @@
use std::time::Instant;
use utils::time::get_elapsed_string;
use y2015::days::d20; use y2015::days::d20;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d21; use y2015::days::d21;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d22; use y2015::days::d22;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d23; use y2015::days::d23;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d24; use y2015::days::d24;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,13 +1,7 @@
use std::time::Instant;
use utils::time::get_elapsed_string;
use y2015::days::d25; use y2015::days::d25;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d3; use y2015::days::d3;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::time::Instant; use std::time::Instant;
use utils::time::get_elapsed_string;
use y2015::days::d4; use y2015::days::d4;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d5; use y2015::days::d5;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d6; use y2015::days::d6;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d7; use y2015::days::d7;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d8; use y2015::days::d8;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2015::days::d9; use y2015::days::d9;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -5,5 +5,3 @@ edition = "2021"
[dependencies] [dependencies]
md5 = { workspace = true } md5 = { workspace = true }
utils = { workspace = true }
itertools = { workspace = true }

View File

@@ -1,598 +0,0 @@
uzmnhwye
jvyyfmhr
eiwokyzj
rghqvfsx
pqjbfqey
ceqkjgny
kbpuzvof
epyeucto
bqhqvbef
tqduwleg
ysadziyj
onvxrwcl
dwbhjkmx
qvgqewkr
qazepxhd
bqtuexvi
vieyforp
kizhadeh
ofpraxry
xamrsokr
jrrottpf
gweaulph
gyctgzpo
mkddcnuk
llbxmhbt
mghoubct
arhrpksk
hzeshlue
loygkukn
asakqobo
vwvjnarb
pmqcgzkj
soucxjes
szsuqdss
hyjyxtyi
qjsjwjuf
cvkuyeit
qvlmnzih
distpoga
dtlpvlub
fszspsdu
zkpxuozx
yumhqgty
wetfiqij
ozpmcegi
ylpbjbru
rqksydxz
ifayduog
xqlhyrhl
wrolqshx
cliyrafn
jtuerdyy
damyknzr
olbtisgv
sdlvkpjg
tvfvrshv
ugywkitq
idjjqpzc
eeowwemi
npplofdm
ouzjrlph
foawnibc
xcdcepzd
irqsuacz
xtnmuzqp
sgsxsjoj
qhkpbuvq
tsvwtvtz
lgqaycod
adttxkwp
kjcyqgoc
bfkxbgxq
iiszhwbf
cgnihihb
gsgvjypz
lgcgjccw
rdkltabk
wnymgwbv
jdfqdvis
yxtuyupx
nsvafgfo
ztmbgjux
axugvumx
tstqlnye
eeyqirow
ovaityku
cdqyjdkz
vuhkumlu
rwebkmlj
prncgnbt
ftuhvnow
lhmnkhmy
unyaizoz
ezshlifw
bllzrnar
uxblibez
fpkclnns
zqocayvl
umoistgi
skmgbxls
jgtlmsux
nulmpeow
rxeyoiwy
xpqouwhq
ogepecdf
paeqseqk
auntemaj
kyorwfkl
tnvbjicg
xazuvzok
noiksasa
tvgkzpcl
jqzwlyvl
zcbzkese
notfmgol
vceqbfbg
qfeabvhv
hejfluqw
yoxvxdes
pbgiqytr
tntrwezn
duadnppa
nqnwslev
okmdpmyr
eljfthrk
fymbhtes
cdyjpcnd
qmaihzyz
cifmitdm
ksjznrxd
jdcmoqpo
caicyvmw
zhgsnmcv
idxndssh
ppykgzto
hvkjejgz
dezkqhas
ddfpqxfu
zabdhasf
qkhgknfl
gqrzmfdv
lnzrgbwm
wrytspbl
bsjzukak
kfpcoyua
zzbpiifh
ygrhxtug
zedbugkr
sienwiyq
vpophmnv
kvrgegtp
azpkkojs
jgwlwtjo
azwbmxgy
wblpgwvu
jwkustki
fmjixbct
ghkclypp
erczaojx
iqmhmlkf
yfqnajza
vhpadprc
hjicylfh
mwbavklg
txhtbhbm
pufqjjei
zazwoxia
yhzexooi
vuqtvkuv
mppianmz
tscbvqrg
hajzaamg
urqizitm
ircgrvlo
jgzcpbjo
erpiqxlw
xvnqbjqc
xauztetw
bcytezdp
sqwrbgjb
tinldoyz
rdkbfbew
kkpmcqid
fjiztfcy
ybdoeafy
burdrehw
uyredvvm
bwvobekv
fniozvjr
ifaoxink
zaoujdun
bykdovxw
wasdjrzy
uxokzwlb
votizlio
leoxtnlc
ymcesetp
mibahaht
ldgfbbar
aaegvpyn
etgdecrd
cbqerkil
myldihga
aycsmksz
sbdprnva
ytlllxsq
shxuxktj
otxymese
hygjpofa
lozdcvfn
ulrvezsj
elflfepx
xtyqbbaz
wombapna
uesqfrfo
amagopph
tdipmqwo
qlfhnwxp
qycwncct
haofnvsq
bwiyooof
fdftgidb
xzntthfa
ouzddcqt
fywssrae
ywmmvhut
gphtugjk
qxfymjuh
dbnxhxac
mvwunqfa
tfrrjcnr
lycvubak
pfxofasn
xiacctnn
vrlncgrn
wjkeqsav
vskxlpkf
iaknsppj
kzexhdzd
jesglqmn
lkqtzgzd
wnwksqbf
htqrcgyq
jjynwudx
lawnwevw
cfewlcwu
ledcrfvq
zlfpilwv
jckvhaly
xhggozqd
hrnuxzwq
ajominjf
bkoaxnil
zcjslwqq
vgexcqtl
ddfannml
ufbfceuh
vuibklnx
tmrtgqxx
izxwfael
njtzahxu
bzwyyycr
ggxoqbvo
oysvzvoi
ejxxjhjl
unwkfzyr
nwycafcu
lfqieudu
natvibge
qzrnpxew
mqjbtpmh
ixdsjywf
nmilafsn
tfwubeot
ccmrtlfs
uajfiusi
jhinkyxm
qwcvvimb
wlbhjanf
vdcedtkw
uiibfsbh
hkgxmybs
lsqlrxll
ihvodcrb
ewrfalkm
kelnqkcd
vroxnjwh
jeneowpg
ozivuper
fxatuncj
dchmobvr
oyxqiszo
uuyxgshp
sxcbjmhu
dorsqxgt
urygoghb
lolotlqh
ytaalnkv
bcspchnq
wbdululm
vzqwkjix
hinyyoag
qkyqkdit
lolhbfkp
zlwjxdoa
yudtkctc
xcvazkiu
ttvfuzxr
rqfrdkcm
rihwltdh
qcpjwsjz
bazpmmmx
grxiwhag
cbljykhx
weooldcv
lumfsfwj
kiunrfgy
fafbvyjx
acpzgmgh
pdyhmtvq
ssismufm
pdlzydrn
sxxbtkqi
gnuxwgui
wcuguqju
jkjkdkph
prpmfknq
csuabssx
khymlrkm
muavohgo
sqgzadar
svzwomsw
zfscsyyh
rhuwuqij
otxcyjya
ftecgqvj
nbdrbipz
sppapkeb
xxysrbxg
pkvvzfwx
mpadytha
iqbdgpwm
aqisvbnk
ipckdhwl
rkivzxzk
tkiykice
jmpfxvqq
shrwhvwl
uxlgxmgf
nhjjylml
ujvjqgao
yekgzrqv
ujbnxfya
pmtovthi
hsazctam
hhmesojw
vgxomjtg
ucudhxze
kzgkdvlj
vtjkjgrj
fticzjct
dwulyubi
fyfiwbkt
orcuggcq
kvxqcwfz
vvjeoumv
xsyobzop
iszghxbl
kxxvtiuf
klwsferz
emzmpfvt
gnsxgbib
nnrmtcdj
qqnfngkm
lkdxvyxe
vkeaswre
kfvpnnpd
mozumbpg
omwjojxc
sjmkijsk
fivvusjy
esmktnbm
mbkizlzq
mscagsvf
twpwpsbj
okwrcirc
hcexoyjh
tzhxxmkr
zfhzgnoe
soldpmdf
ejikyuba
cudjzzmg
xfwpcilo
vpjqpuyk
oprtpooj
djzadomw
shuqtulp
rlspstxi
gxbfmsqv
qoojsatd
rvupwphy
zfgqbrwb
ninnufxt
annvdtct
phwyfyjt
qxwfsujq
bwrbuwxs
ihwlqjbr
zylvjunv
bmmsjzxk
rvfidswe
fjgovnmk
mogllpfx
ddsefzqd
wrssovrq
yaqhesmy
cvvcswup
kpmipygw
xrjtbhze
nqucxgea
kpbbhdhz
fhdsgcdm
pmjidvmk
szbhczpa
tchjtqzu
qzorzcpu
mfnvijyy
wuutyddc
ysupoemc
dunwqmbn
mocewxzi
qiwracmo
rmbbhvud
cltnmdiy
ruutdaeo
wihpnryn
mgajpkys
iahfwmuw
vuocxwiu
mbygminp
kmkjaead
hxnztxbh
flnxmtbj
nkbrfcqg
blkvlojl
ppdielzk
ssclzhip
qvvymayo
cthwrgfx
rjqdlnep
hccjexgw
cbclqcga
cxjjdgvu
puthjawq
gvvzvjac
wtxxtwef
retdqdpn
hifhvrbd
jctkaclz
bftzisge
wofmrtss
fvojyyar
cbnhtlqp
jqozxhny
ybgsemfv
ooaqxove
gqvrbkqy
ppdcrmte
clfxucnu
toenbwtd
jzmywsup
inqsaqid
aehpaztz
gragbfrw
dlrjyzmu
sblqqwsb
gzruigwt
aplpzlui
wmrpyrjm
xyxwaeog
bhkpwzvo
egdpnujd
hbbdjlws
mbphcthb
bykhifcd
rrwkidpm
iztrhfnf
nydlpqze
dgulsfzt
eludirwj
iyvbrttp
aerocrzf
ejaearsc
dxruknqe
zmhbnkls
qnsykqvu
gotmslog
nbprjbxc
gtlykrzb
egethaib
flomperi
xcamglue
zceleqek
cnvgfdwf
dchfyogi
ygtzquvk
xxxunqji
amqehkhx
lsacrdtm
ybnapfyu
aiukmmqc
pepgjpqa
uermcxac
kapeodph
ozdanagr
pdjfzxdb
ioospvis
uhxuoyrd
jnnlwvdv
gnxaqkly
zsiucnpt
gtveajfy
tudfnxqg
pwugrcdu
obeeyadl
yhybzygs
enbwkfwn
iiziwmrj
rmldlsrp
wfqifmcn
aehofonk
bvxavoez
fwelvohr
eviaivqh
yjwslphn
wjdocdoc
dqgiuhli
geinepsk
npaemvap
ngnqfbvw
pobgwlhb
zufxdrkb
ggfdeuts
defhitoc
ndzvtils
oysmqhnq
tdmsbwqi
wwfvshad
btkerpuz
gwqvhvto
nflozwyk
tbiexdrg
okshetxm
mbgrhojh
eluzaxsb
hwqtiqwr
yrsddclj
wrsfnbdb
klfmnoqq
ztmkgmgg
xnkrekxs
qmdwfeuo
jwzfwhkv
nxjlnbiy
vdhnrrxi
smgjcxcp
aphleuvc
ljbadhdn
jkbnkinm
mjtovsxa
xpjsorxu
gicuerdc
azrhkarl
hpgwlzge
bweruitv
vnoglwep
pjwqtqdb
myvyrjye
xiqzlwfn
zqpnhjnn
hkzycpkb
fmoryqng
dfembrgo
dvguwian
rwgwffsn
ixgfpslt
rkxnxyff
ljankcms
kksozyit
cncygufc
agsevmlz
ectijrxs
rhvtaplx
hxddxhda
mpvfoaim
rtxkcevq
qythgaev
lnhqdrzc

File diff suppressed because it is too large Load Diff

View File

@@ -1,162 +0,0 @@
rect 1x1
rotate row y=0 by 6
rect 1x1
rotate row y=0 by 3
rect 1x1
rotate row y=0 by 5
rect 1x1
rotate row y=0 by 4
rect 2x1
rotate row y=0 by 5
rect 2x1
rotate row y=0 by 2
rect 1x1
rotate row y=0 by 5
rect 4x1
rotate row y=0 by 2
rect 1x1
rotate row y=0 by 3
rect 1x1
rotate row y=0 by 3
rect 1x1
rotate row y=0 by 2
rect 1x1
rotate row y=0 by 6
rect 4x1
rotate row y=0 by 4
rotate column x=0 by 1
rect 3x1
rotate row y=0 by 6
rotate column x=0 by 1
rect 4x1
rotate column x=10 by 1
rotate row y=2 by 16
rotate row y=0 by 8
rotate column x=5 by 1
rotate column x=0 by 1
rect 7x1
rotate column x=37 by 1
rotate column x=21 by 2
rotate column x=15 by 1
rotate column x=11 by 2
rotate row y=2 by 39
rotate row y=0 by 36
rotate column x=33 by 2
rotate column x=32 by 1
rotate column x=28 by 2
rotate column x=27 by 1
rotate column x=25 by 1
rotate column x=22 by 1
rotate column x=21 by 2
rotate column x=20 by 3
rotate column x=18 by 1
rotate column x=15 by 2
rotate column x=12 by 1
rotate column x=10 by 1
rotate column x=6 by 2
rotate column x=5 by 1
rotate column x=2 by 1
rotate column x=0 by 1
rect 35x1
rotate column x=45 by 1
rotate row y=1 by 28
rotate column x=38 by 2
rotate column x=33 by 1
rotate column x=28 by 1
rotate column x=23 by 1
rotate column x=18 by 1
rotate column x=13 by 2
rotate column x=8 by 1
rotate column x=3 by 1
rotate row y=3 by 2
rotate row y=2 by 2
rotate row y=1 by 5
rotate row y=0 by 1
rect 1x5
rotate column x=43 by 1
rotate column x=31 by 1
rotate row y=4 by 35
rotate row y=3 by 20
rotate row y=1 by 27
rotate row y=0 by 20
rotate column x=17 by 1
rotate column x=15 by 1
rotate column x=12 by 1
rotate column x=11 by 2
rotate column x=10 by 1
rotate column x=8 by 1
rotate column x=7 by 1
rotate column x=5 by 1
rotate column x=3 by 2
rotate column x=2 by 1
rotate column x=0 by 1
rect 19x1
rotate column x=20 by 3
rotate column x=14 by 1
rotate column x=9 by 1
rotate row y=4 by 15
rotate row y=3 by 13
rotate row y=2 by 15
rotate row y=1 by 18
rotate row y=0 by 15
rotate column x=13 by 1
rotate column x=12 by 1
rotate column x=11 by 3
rotate column x=10 by 1
rotate column x=8 by 1
rotate column x=7 by 1
rotate column x=6 by 1
rotate column x=5 by 1
rotate column x=3 by 2
rotate column x=2 by 1
rotate column x=1 by 1
rotate column x=0 by 1
rect 14x1
rotate row y=3 by 47
rotate column x=19 by 3
rotate column x=9 by 3
rotate column x=4 by 3
rotate row y=5 by 5
rotate row y=4 by 5
rotate row y=3 by 8
rotate row y=1 by 5
rotate column x=3 by 2
rotate column x=2 by 3
rotate column x=1 by 2
rotate column x=0 by 2
rect 4x2
rotate column x=35 by 5
rotate column x=20 by 3
rotate column x=10 by 5
rotate column x=3 by 2
rotate row y=5 by 20
rotate row y=3 by 30
rotate row y=2 by 45
rotate row y=1 by 30
rotate column x=48 by 5
rotate column x=47 by 5
rotate column x=46 by 3
rotate column x=45 by 4
rotate column x=43 by 5
rotate column x=42 by 5
rotate column x=41 by 5
rotate column x=38 by 1
rotate column x=37 by 5
rotate column x=36 by 5
rotate column x=35 by 1
rotate column x=33 by 1
rotate column x=32 by 5
rotate column x=31 by 5
rotate column x=28 by 5
rotate column x=27 by 5
rotate column x=26 by 5
rotate column x=17 by 5
rotate column x=16 by 5
rotate column x=15 by 4
rotate column x=13 by 1
rotate column x=12 by 5
rotate column x=11 by 5
rotate column x=10 by 1
rotate column x=8 by 1
rotate column x=2 by 5
rotate column x=1 by 5

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2016::days::d1; use y2016::days::d1;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2016::days::d2; use y2016::days::d2;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2016::days::d3; use y2016::days::d3;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2016::days::d4; use y2016::days::d4;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,8 @@
use std::time::Instant;
use utils::time::get_elapsed_string;
use y2016::days::d5; use y2016::days::d5;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2016::days::d6;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/6_input.txt")).unwrap();
println!("{}", d6::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/6_input.txt")).unwrap();
println!("{}", d6::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2016::days::d7;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/7_input.txt")).unwrap();
println!("{}", d7::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/7_input.txt")).unwrap();
println!("{}", d7::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2016::days::d8;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/8_input.txt")).unwrap();
println!("{}", d8::process_part1(&content, (50, 6)));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/8_input.txt")).unwrap();
println!("{}", d8::process_part2(&content));
}

View File

@@ -1,73 +0,0 @@
use std::collections::HashMap;
pub fn process_part1(input: &str) -> String {
let line_len = input.find("\n").unwrap();
let mut rows: Vec<HashMap<char, u32>> = vec![HashMap::new(); line_len];
input.lines().for_each(|line| {
for (idx, chara) in line.chars().enumerate() {
rows[idx]
.entry(chara)
.and_modify(|count| *count += 1)
.or_insert(1);
}
});
let mut res = String::new();
for row in rows {
let most_common = row.iter().max_by(|a, b| a.1.cmp(b.1)).unwrap().0;
res.push(*most_common);
}
res
}
pub fn process_part2(input: &str) -> String {
let line_len = input.find("\n").unwrap();
let mut rows: Vec<HashMap<char, u32>> = vec![HashMap::new(); line_len];
input.lines().for_each(|line| {
for (idx, chara) in line.chars().enumerate() {
rows[idx]
.entry(chara)
.and_modify(|count| *count += 1)
.or_insert(1);
}
});
let mut res = String::new();
for row in rows {
let most_common = row.iter().max_by(|a, b| b.1.cmp(a.1)).unwrap().0;
res.push(*most_common);
}
res
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &str = "eedadn
drvtee
eandsr
raavrd
atevrs
tsrnev
sdttsa
rasrtv
nssdts
ntnada
svetve
tesnvt
vntsnd
vrdear
dvrsen
enarar";
#[test]
fn part1() {
let result = process_part1(INPUT);
assert_eq!(result, *"easter");
}
#[test]
fn part2() {
let result = process_part2(INPUT);
assert_eq!(result, *"advent");
}
}

View File

@@ -1,163 +0,0 @@
pub fn process_part1(input: &str) -> u32 {
input
.lines()
.map(|line| if is_tls(line) { 1 } else { 0 })
.sum()
}
pub fn process_part2(input: &str) -> u32 {
input
.lines()
.map(|line| if is_ssl(line) { 1 } else { 0 })
.sum()
}
fn is_tls(ipv7: &str) -> bool {
let mut abba = false;
let mut part = String::new();
for chara in ipv7.chars() {
if chara == '[' {
if contains_abba(&part) {
abba = true;
}
part.clear();
} else if chara == ']' {
if contains_abba(&part) {
return false;
}
part.clear();
} else {
part.push(chara);
}
}
if contains_abba(&part) {
abba = true;
}
abba
}
fn contains_abba(part: &str) -> bool {
if part.len() < 4 {
return false;
}
for window in part.chars().collect::<Vec<char>>().windows(4) {
if window[0] == window[3] && window[1] == window[2] && window[0] != window[1] {
return true;
}
}
false
}
fn is_ssl(ipv7: &str) -> bool {
let mut abas = Vec::new();
let mut babs = Vec::new();
let mut part = String::new();
for chara in ipv7.chars() {
if chara == '[' {
if let Some(additional_aba) = get_aba_or_bab(&part) {
abas.extend_from_slice(&additional_aba);
}
part.clear();
} else if chara == ']' {
if let Some(additional_bab) = get_aba_or_bab(&part) {
babs.extend_from_slice(&additional_bab);
}
part.clear();
} else {
part.push(chara);
}
}
if let Some(additional_aba) = get_aba_or_bab(&part) {
abas.extend_from_slice(&additional_aba);
}
for aba in abas {
for bab in babs.iter() {
let aba = aba.chars().collect::<Vec<char>>();
let bab = bab.chars().collect::<Vec<char>>();
if aba[0] == bab[1] && aba[1] == bab[0] {
return true;
}
}
}
false
}
fn get_aba_or_bab(part: &str) -> Option<Vec<String>> {
if part.len() < 3 {
return None;
}
let mut aba_bab: Vec<String> = Vec::new();
for window in part.chars().collect::<Vec<char>>().windows(3) {
if window[0] == window[2] {
aba_bab.push(window.iter().collect());
}
}
if aba_bab.is_empty() {
None
} else {
Some(aba_bab)
}
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT_1: &str = "abba[mnop]qrst";
const INPUT_2: &str = "abcd[bddb]xyyx";
const INPUT_3: &str = "aaaa[qwer]tyui";
const INPUT_4: &str = "ioxxoj[asdfgh]zxcvbn";
#[test]
fn part1_1() {
let result = is_tls(INPUT_1);
assert!(result);
}
#[test]
fn part1_2() {
let result = is_tls(INPUT_2);
assert!(!result);
}
#[test]
fn part1_3() {
let result = is_tls(INPUT_3);
assert!(!result);
}
#[test]
fn part1_4() {
let result = is_tls(INPUT_4);
assert!(result);
}
const INPUT_5: &str = "aba[bab]xyz";
const INPUT_6: &str = "xyx[xyx]xyx";
const INPUT_7: &str = "aaa[kek]eke";
const INPUT_8: &str = "zazbz[bzb]cdb";
#[test]
fn part2_1() {
let result = is_ssl(INPUT_5);
assert!(result);
}
#[test]
fn part2_2() {
let result = is_ssl(INPUT_6);
assert!(!result);
}
#[test]
fn part2_3() {
let result = is_ssl(INPUT_7);
assert!(result);
}
#[test]
fn part2_4() {
let result = is_ssl(INPUT_8);
assert!(result);
}
}

View File

@@ -1,100 +0,0 @@
use itertools::Itertools;
enum Instruction {
Rect(u32, u32),
ShiftRight(u32, u32),
ShiftDown(u32, u32),
}
pub fn process_part1(input: &str, grid_size: (usize, usize)) -> i32 {
let instructions = input
.lines()
.map(parse_instruction)
.map(|option| option.unwrap())
.collect_vec();
let mut grid = vec![vec!['.'; grid_size.0]; grid_size.1];
for instrution in instructions {
match instrution {
Instruction::Rect(width, height) => {
for row in 0..=height {
for col in 0..=width {
grid[row as usize][col as usize] = '#';
}
}
}
Instruction::ShiftRight(row, by) => grid[row as usize].rotate_right(by as usize),
Instruction::ShiftDown(col, by) => {
let mut col_items = grid.iter().map(|row| row[col as usize]).collect_vec();
col_items.rotate_right(by as usize);
for (row, pixel) in col_items.iter().enumerate() {
grid[row][col as usize] = *pixel;
}
}
}
for row in grid.clone() {
println!("{}", row.iter().join(""));
}
println!();
}
grid.iter()
.map(|row| {
row.iter()
.map(|pixel| if *pixel == '#' { 1 } else { 0 })
.sum::<i32>()
})
.sum()
}
pub fn process_part2(_input: &str) -> i32 {
0
}
fn parse_instruction(inst: &str) -> Option<Instruction> {
if inst.contains("rect") {
let (_, axb) = inst.split_once(" ").unwrap();
let (a, b) = axb.split_once("x").unwrap();
return Some(Instruction::Rect(
a.parse::<u32>().unwrap() - 1,
b.parse::<u32>().unwrap() - 1,
));
}
if inst.contains("rotate row y") {
let (_, abyb) = inst.split_once("=").unwrap();
let (a, b) = abyb.split_once(" by ").unwrap();
return Some(Instruction::ShiftRight(
a.parse().unwrap(),
b.parse().unwrap(),
));
}
if inst.contains("rotate column x") {
let (_, abyb) = inst.split_once("=").unwrap();
let (a, b) = abyb.split_once(" by ").unwrap();
return Some(Instruction::ShiftDown(
a.parse().unwrap(),
b.parse().unwrap(),
));
}
None
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &str = "rect 3x2
rotate column x=1 by 1
rotate row y=0 by 4
rotate column x=1 by 1";
#[test]
fn part1() {
let result = process_part1(INPUT, (7, 3));
assert_eq!(result, 6);
}
#[test]
fn part2() {
let result = process_part2(INPUT);
assert_eq!(result, 0);
}
}

View File

@@ -7,9 +7,3 @@ pub mod d3;
pub mod d4; pub mod d4;
pub mod d5; pub mod d5;
pub mod d6;
pub mod d7;
pub mod d8;

View File

@@ -4,4 +4,3 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
utils = { workspace = true }

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2022::days::d1; use y2022::days::d1;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2022::days::d2::{process_part1, process_part2}; use y2022::days::d2::{process_part1, process_part2};
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2022::days::d3; use y2022::days::d3;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2022::days::d4; use y2022::days::d4;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2022::days::d5; use y2022::days::d5;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2022::days::d6; use y2022::days::d6;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2022::days::d7; use y2022::days::d7;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2022::days::d8; use y2022::days::d8;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2022::days::d9; use y2022::days::d9;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -6,5 +6,3 @@ edition = "2021"
[dependencies] [dependencies]
regex = "1.11.1" regex = "1.11.1"
utils = { workspace = true } utils = { workspace = true }
itertools = { workspace = true }
rayon = { workspace = true }

View File

@@ -1,41 +0,0 @@
21056789894321015012980123498787601045687
32346543765601156703474544567896012138796
10107632659892349821563678989345643029655
23218101256781015430412101071234754910544
14569870345432016321003012560109867801033
05678963256789127879854303456078105932122
18723450109898038910765210010563254541001
69011201298788945125898998323454569679852
78760345345654876034787677401235378089760
89456896012503876965014586512765432123601
32387987003412965872123298703890101984512
01291876121101234989456107654965278854603
00180145030980325678327890217874369763254
14343232145671013454310691307893454610169
23432165430110302169234582456732108905678
96547078923231231078105673454321097214523
87678432214348940987017894765870986341014
96589541009857654320123765891963475498765
01434630111766789010432143210452560167876
32345721210951999016549054789301001456965
21076890129810878321678945643219812332109
78789001234723765430321238756106734323458
09654160345654210389210109987005125010767
12323271657601345678780125678014056541893
25414987798542343456690034329123987932012
56905677810439652987501145016510345801101
67856298923128721987432156987421256789210
22347107654098910876543087870330107654301
11298231012347654305678898981278798987652
00109545691056763211219767874569678690343
12065456783345894320105656913450569541289
43874321092132101899234541002321256632176
54930010561001234788765432211056746789045
67821123472390545654123101347849839874330
78934010589487698763034567456931028765221
67785697696590101672105698741022210540100
58696788787781234589789789012013307632101
49545459810170301075674654323454458989032
30432365923965432165463210498569567976543
21021876854876523678354112347678678875301
30010966763987014589210001456565589765432

View File

@@ -1 +0,0 @@
5 62914 65 972 0 805922 6521 1639064

View File

@@ -1,140 +0,0 @@
CCCCCCCCCBBBMMGGGGGGGGGGGGGYWWWWWWWWWWWWOOOOOOOOOOOOOOOOHLLHHHHHHHHHHTHUUUULBBBBBBBBBBBBPPPPPPPPPPPKKWWWWCCCWWWWWWWWWWWWWWWWWWWWEEEEYNNNYYLL
CCCCCCCCCBBBBBBGGGGGGGGGGGGGWWWWWWWWWWWWOOOOOOOOOOOOOOOOHHHHHHHHHHHHHHHHUUULBBBBBBBBBBBPPPPPPPPPPPPPPPWWWCCCWWWWWWWWWWWWWWWWWWWBEEEYYYNYYLLL
CCCCCCCBBBBBBBBGGGGGGGGGGGGWWWWWWWWWWWWWOAOOOOOOOOOOOOOOHHHHHHHHHHHHHHHHUUULLLLLBBBBBBBBPSPPPPPPPPPPPMMWWCCCCCCCWWWWWWWWWWWBWWWBBBBYYYYYYYLL
CCCCCCCCBBBBBBBGGGGGGGGAAGWWWWWWWWWWWWWWWWOOOOOOOOOOOIOOHHHHHHHHHHHHHHHHUUULLLLLLLBBBJBJSSPPPPPPPPPPMMMMMCCCCCCCWWWWWWWWWBBBBBWBBBBYYYYYYYYY
CCCCCCCCCBBBBBBGGGGGGGGGAAWPPWWWWWWWWWWWWWOOOOOOOOOIIIOHHHHHHHHHHHHHHHHUULLLLLLLLBBBBJJJSSPPPPPGGGGPEEMCCCCCCCCCCCCCCCBBWWBBBBBBBBBBYYYYYYYY
CCCCCCCCCBBBBBBBGGGGGGGGAAASSWWWWWWWWWWWWWOOOUOOOIIIIIIIYHHHHHHHHHHHHHHHHHNLLLLLLLBBBBJJJJVPPPPGGGGPEEMCCCCCCCCCCCCCCCBBBBBBBBBBBBBYYYYYYYYY
CCCNNNCCBBBBBBBBGEGGGGGAAAAASWWWWWWWWWWWWWXOOOOIIIIIIIYYYHHHHHHHHHHHHHHHGGLLLLLLLLLBBJJJJJJPPPPGGGGPMEMCCCCCCCCCCCCCCCBBBBBBBBBBBBBYYYYYYYYY
CCNNNNNBBBBBBBBBBEBSGGGGGGSSSWWWWWWWWUWXXXXXXOOIVVVIIIIIYHHHYYHHHYYYYHHHGLLLLLLLLLLLLJJJJJPPPPPGGGGPMMMMMMMCCCCCCCCCCBBBBBBBBBBBBYYYYYYYYYYM
NNNNNNNVVVBBBBBBBBBSGGSSSSSSSSWWWWWWWUWWXXXXXXOVVVIIIIIIYYYYYYYYHYYYYYHHGGLLLLLLLLLLLJJJJJJJPPPGGGGPMMMMMMMCCCCCCCCCCBBBBBBBBBBBBBBYYYYYYMMM
NNNNNNNVVVBBBBBBBBBSGGSSSSSSSDDWWWWWWWWXXXXXXXOOIIIIISIIYYYYYYYYYYYYDYYGGGLLLLLLLLLLLJJJJJJJPGGGGGGPPPMMMMMCCCCCCCCCCBBBBBBBBBBBBBBYYYYYYMMM
NNNNFNNNNBNBBBBBBBSSSSSSSSSSSSSSWDWWUUNXXXXXXXXXIIIIISSSSYYYYYYYYYYYYYYGGGLLLLLLLLJJJJJJJJJJGGGGGGGPDMMMMMMCCCCCXWWWWWBBBBBBBBBBBBBYYYYYMMMM
NNNNNNNNBBBBBBBBBBSSSSSSSSSSSSSSSDDDNUNNNXXXXXXXIIXIISSSYYYYYYYYYYYYYYYGGGGGLLLLLLLJJJJJJJJJGGGGGGGPDDMDMMMXXXXXXXXXWWWWWWBBBBBBBBBYYYYMMMMM
NNNNNNNBBBBBBBBBBBSSSSSSSSSSSSSSSSNNNNNNNNXXXXXXXXXXXXSSSQQNYYYYYYYYYYGGGGGGLLLLLLLLJJJJJJJDGGGGGGGDDDDDMMDXXXXXXWWWWWWWWBBBBBBBBBHYYYMMMMMM
NNNNNNAAXXXBBBBXXBBBSSSSSSSSSSSSSENNNNNNNNNNXXXXXXXQXXQQQQQNYYYYYYYYYYYGGGGGGLLLLLLLJJJJJJJDGGGGGGGDDDDDDDDXXXXXWWWWWWWWWWWBBBBBBHHYYYMMMMMM
NNNNNNNNXXXXXXXXBBBSSSYSSSSSSSSSSNNNNNNNNNNZXXXXXXEQQQQQQQQYYYYYYYYYYYYGGGGGLLLLLLLGJJJJJJJJGGGGGGGDDDDDDXXXXXXXXWWWWWWWWWWBBBBBBHHHYYMMMMMM
NNNXXNNNXXXXXXXXXXXYYYYYSSSSSSSSIIINNNNNNNNXXCXXXXEQQQQQQQQQYYYYYYYYYYYGGGGGGGGLGLGGJJJJJJJDGGGGGGGDGDDDGGXXXXXXCWWWWWWWWWWWWABOOHHHYMMMMMMM
SNNSXNNNRXXXXXXXXXXXYYYYYSSSSSSIIIINNNNNNNNXXCCXEEEQQQQQQQQYYYYYYYYYYYYGGGGGGGGGGGGJJJJJJJJUGGGGGGGGGGGGGGGGGGXCCCWCCWWWWWAAAAAOOHHHHMMMMMMM
SSSSXSNNRXXXXXXXYYYYYEYNYSSSMHSIIIIINNNNNNNNCCCCTTEQYYQQQQQQYYYYYUYYYYYGGGGGGGGGGGJJJJJJJJJJGGGGGGGGGGGGGGGGGGXGCCCCCWWWWWAAAAAHOHHHHMMMMMMM
SSSSSSNNSJJJXXXYYYYYYYYYMSMMMMGMIMIINNNNNNNCCCCCTTEYYYQYQQQQQQMYUUYUYYGGGGGGGGIIIJJJJJJJJJJUGGGGGGGGGGGGGGGGGGDGCCCCWWWWWWAAAAAHHHHNMMMMMMMM
SSSSSSSSSSSJXXXYYYYYYYYYMSMMMMMMMMIIINNNNNNCCCCCTTEYYYYYYQQQQBBBUUYYYYYOOOOGGGIIIPJJJJJJJJUUGGGGGGUGGGGGGGGGGGGGCCCCCCAAAAAAAAAHHHHNMMMMMMMM
SSSSSSSSSSSJJJJYYYYYYYYYYMMMMMMMMMIIIINNNCCCCCCTTTTCYYYYQQQBBBBBBUUYYYYOGOOOOGIIIIIIIJJJJUUUGGGGGGGGGGGGGGGGGGGGCCCHHHAAAAAAAAAHHHHNNMMMMMMM
SSSSSSSSSSSSSJJJYYYYYYYMMMMMMMMMMMIIIINNNCSCCTTTTTYYYYYYPPQBBBBBBUUUYGYGGOGGGGIIIIIIIJJIIUUUGGGGGGGGGGGGGGGGGGCGGCCCCCAAAAAAAAAHHHNNAAAMMQMM
SSSSSSSSSSSJJJJJYYYYYYYYMMMMMMMMMIIISISSSSSCCTTTTTYYYYYYPPPPBBBBUUUUUGGGGGGGGGIIIIIIIIJIIUUUGGGGGGGGGGGGGGGGGGCCGCCCCCAAAAAAAAAKKKAKAHAMMQMY
SSSSSSSSSSSSJJDJJJYYYYYMMMMMMMMMMOOSSSSSSSSSCTETTTTYYYPYPPPPPPBBBBUGUGGGGGGGYYIIIIIIIIIIIUUUGGGGGGGGGMMMGGGGGGCCCCCCCAAAAAAAAAAKKKKKHHAAMQMY
SSSSSSSSSSSSJJDJJJYYOOMMMMMMMMMOQOFFFFSSSSSCCCCOOYYYYYPSPPPPBPBBBBGGGGGGGYGGYYIIIIIIIIIIUUUUUUUUUUUUUUMMGGGGGCCCCCCCBAAAAAAAAAAAAKKKHHHHHHYY
SWSSSSSSSSSSJJDJDDYYMOOMMMMMOMOOOOOOSSSSSSSSCCYYYYYYYYPPPPPBBBBBBBIIIIGGGYYYYYYIIIIIIIIIIIIUUUUUUUUUUMMMMMMGKCCKKCCCCAAAAAAAAAAAAKKKHHHHHHYY
SSSSSSSSSSSSJDDDDDDYMMMMMMMMOOOOMOOOOOSSSSSNCCZZZZYYYYPPPPPBBBBBBBBBBBWYGAAAAAAAIIIIIIIIIIUUUUUUUUUUUMMMMMKKKKCKKCCCBAAAAAAAAAAAAKKHHHHHHYYY
SSSSSSSJSSSSJDDDDDDMMMMMMMMMMGGOOLOCSSSSSSSSCCZZZZZYYYEEPPPBBBBBBBBBBBBYWAAAAAAAIIIIIIIIIIUUUUUUUUUUUMMMMKKKKKKKCCBBBAAAAAAAAAAAAKHHHHHHPHHY
SSSSSSSSSYYSDDDDDDDDDDMMMMMMMMMMLLSCCSSSSSSZZZZZZZZZYSPPPPPPBBBBBBBBBBBYYAAAAAAAIIIIIIIIIIUUUUUUUUUUUUUKKKKKKKKKKCCBBAAAAAAAAAAAAHHHHHHHHHHY
YYSYSSYYYYYDJDDDDDDDDDMMMMMMMMLLLLSSSSSSSSSZZZZZZZZVSSPPPMPBBBBBBBBBBBBYYAAAAAAAIIIIIIIIIIUUUUUUUUUUUKKKKKKKKKKKKBBBBAAAAAAAAAAAAHHHHHHHHHHH
YYYYSSYYYYYDDDDDDDDDDMMMMMMMMLLLLLSSSSSSSSSSZZZZZVVVSSPPPPBBBBBBBBBBBBYYYAAAAAAABIIIIJJIIIUUUUUURVKKKKKKKKKKKKKKKBBBBAAAAAAAAAAAAHHHHHHHHHHF
YYYYYYYYYYYDDDDDDDDDMMLMMMMLLLGGLLLLSSSSSSSSZZZZZVVVVSVBPBBBBBBBBAAAAAAAAAAAAAAABIIIIJJJIRRRRRRRRRRRKKKKKKKKKKEKKBBBBAAAAAAAAAAAAHHHHHHHHHHF
YYSSSYYYYYYDDDDDDDDDDMLLLLLLLLGGGGLLSSLLSSSZZZZZZVVVVVVBBBBBBAAAAAAAAAAAAAAAAAAABBIIRRRRRRRRRLRRRRRRKKKKKKKKKKKKWWWBBAAAAAAAAAAAAHHHHHHHHFFF
SSSSSSYAAYYYYDDDDDDDDDDLLLLLGGGGGGGLLLLLLSSZZZZZZVVVVVBBBBBBBAAAAAAAAAAAAAABBYYBBRIIRRRRRRRRRRRRRRRKKKKKKKKKKKKKWWWWWAAAABBBBBBBCHHHHHHAAFFF
SSSSSAAAAYAYYYYDDDDDDDDDDZZZGGGGGGGGGGLLLSSZZZZZZVVVFVBBBBBBBAAAAAAAAAAAAAABBBBBBRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKWWWWAAAAABAABIBHHHHHHHHAAAFF
SSSSSAAAAAAAYYYYDDDDDDDDZZZZGGGGGGGGGGGLLSZZZZZZVVVVVBBBBBBBBAAAAAAAAAAAAAABBBBBBBNRRRRRRRRRRRVRRRRRKKKKKKKKKKKWWWWWAAAAAAABBIIIHHHHHAAAAAAA
SSSAAAAAAAAAAAAZDDDDDDDDZZZZGGGGGGGGGGGLLZZZZZZZZVVVVVBBBBBBBAAAAAAAAAAAAAABBBBBBBBRRRRRRRRRRRVRRRRRRKKRKKKRKKWWWWWWWAAAAAAAIIIIHHHHHMAAAAAA
SSSAAAAAAAAAAADZKKKDDDDZZZZZGGGGGGGGGGGGLZYKKZKUVVVVVVBBBBBBBAAAAAAAAAAAAAABBBBBBRRRRRRRRRRRRVVVRRRRRRRRRRRRRWWWWWWWAAAAAAAAAIIIIISSAAAAAAAA
SSSAAAAAAAAAAKKKKKKKDDZZZZZZZGGGGGGGGGGGGGKKKKKUUVVOODOOBBBBBBBBBJJJJJJBBBBBBBBBBBRRRRRRRRRRRVVVRRRRRRRRRRRRWWWWWWWAAAAAAAAAAIIIISSSSAAAAAAA
SSSAAAAAAAAAAKKKKKKKZZZZZZZZZVGGGGGGGGGGXKKKKKKUVVOOOOOOBBBBBBBJJJJJJJJJJBBBBBBBBBCCRRRRRRRRRVVRRRRRRRRRRRRRWWWWWWWAAAAAAAAAAIIIIIIAAAAAAAAA
SSSAAAAAHHHHHHHHHHHHHHHHHHZZZVGGGGGGGGGKKKKKKKKUVVOOOOOOCBBBBBBBJJJJJJJJJBBBBBBBBCCRRRRRRRRIRRRRRRRRRRRRRRWWWWWWWWWAAAAAAAAAAIIIIIIAAAAAAAAA
SSSSAAAAHHHHHHHHHHHHHHHHHHZZZZQQGQQGGGQKKKKKKKKVVVOOOOOOCCBBBBBBJJJJJJJJJJJJJJBCCCCRRRCCCCCIIIRRRRRRRRRRRRWWWWWWWWAAAAAAAAVVIIIIIIIOAAAAAAAA
SSSSSSAAHHHHHHHHHHHHHHHHHHZZZZZQQQQQQQQQQKKKKKKKOOOOOOOOCCBBBBBJJJJJJJJJJJJJJJBCCCCCCCCCCCIIKKKRRRYRRRRWWWWWWKWWWKKAAAAAAAAIIIIIIIIIHAAAAAAA
SSSSSSSAABBBBKKKHHHHHHHHHHZZZZZQQQQQQQQQQQKKKKKKOOOOOOOOCCCBBBBJJJJJJJJJJJJJJCBCCCCCCCCCCCCCKKKKKRKRRRRWWWWWWKKKKKKWAAAAAAAIIIIIIIIIHAAAAAAA
SSSSSSSSABBBBBZZHHHHHHHHHHZCCEECCCCQQQQQQQKKKKKKOOOOOOOOOCBBBBBJJJJJJJJJJJJSCCCCCCCCCCCCCCCCKKKKKKKKKKKKWWWGGKKKKKKWWWAATTIIIIIIIYHHHHAAAAAA
SSSSSSSSSSSBBBBHHHHHHHHHHHZZCCCCCCCQQCQQQQNKKNOOOOOOOOOOOBBBBBBBBJJJJJJJJJJSSCCCCCCCCCCCCCCCCKKKKKKKKKKMMMGGYYKKKKKWWWWATTIIIINIIYYHYYAAAAAA
SSSSSSSSSSSSBBBHHHHHHHHHHHKKKCCCCCCCCCQQQNNKKNNOOOOOOOOFFBBBBBBBBJJJJJJJJJJJCCCCCCCCCCCCCKCCKKKKKKKKMMMMMMMGGKKKKKKWWWWTTTTITIIIKYYYYYAAAAJA
SSSSSSSSSSSSSSBHHHHHHHHHHHHHKCCCCCCCCCNNNNNNNNNNOOOOOOOFFFFBUBHHHHHJJJJAJQQJQCCCDCCCJCKKCKKKKKKKKKKMMMMMMMGGGKKKKKKTTTTTTTTTTTTIKYYYYYAYAAAU
SSSSSSSSSFFFFBBHHHHHHHHHHHHHHCCCCCCCYCYNNNNNNNNNNNNOOOORRRRRRTZHZZZJJJJJJQQQQCBCCCCCCCKKKKKKKKKKKKKKMMMMKMGGGKKKKKKTTTTTTTTTTTTTTTYYYYYYYAAU
SSSSSSSSFFFFFBBHHHHHHHHHHHHHHCCCCCYCYYYYYNNNNNNNNNNOONARRRRRZZZZZZZJJJJQQQQQQQCCCCCCCDKKKKKKKMMKKKKKKMMMKMGGGKKKKKKTTTTTTTTTTTTTXTYYYYYYYYYY
SMSSSSSSJFFFFFBHHHHHHHHHHHHHHHCCCCYYYYYYYYYNNNNNNNNNNNRRRZZZZZZZZZZZZJJQQQQQQQQQCCCCDDKBKKBKMMMKKKKKKMMKKKJGGGGGKKKTTTTTTTTTTTTTTTTTTYYYYYYY
YJJSSSSJJFGFFFBHHHHHHHHHHHHHHHCCCYYYYYYYYYNNJNNNNNNNNNVRRRRZZZZZZZZZZQQQQQQQQQQQCCCCCGBBBBBBBMAMKKKKKKKKKCGGGGGKKKKTTTTTTTTTTTTTTTTYYYYYYYYW
YGJJSSSJJJFFJJJHHHHHHHHHHHDLHHHCYYYYYYYYYYYYNNNNNNNNNVVVVRRRZZZZZZZZZQQQQQQQQQQQQQCCCGBBBBGBBMMMKKKKKKKKKCCGGGGKKKKKTTTTTTTTTTTTTTTTYYYYYYYY
YGJSSJJJJJJJJJJHHHHHHHHHHHLLLLLLYYYYYYYYYYYYNNNNNNNNNNVVVRRRRRZZZZZZZQQQQQRQQQQQQQQCGGGGGBGMMMMMMMKKCKKCCCCCZGGKKKKKTTTTTTTTTTTXTTTTYMMYYYYY
GGJJJJJJJJJJJJJJJHHHHHHHLLLLLLLLLYYYYYYYYYYYYNNNNNNNNNVVVRRRRRZZZZZZRQQRRQRRQKKQQQQCQGGGGGGMMMMMMKKCCCKCCCCCCGKKKKKKTTTXXXXXTTTXTTMTMMMMMYYY
GGGGJJJJJJJJJJJJJHHHFHHLLLLLLLLLLYYYYYYYYYYYYNNNNNNNNNNVRRRRRZZZZZZZRRRRRRRRRKKKQQQQQQGGGGGGMMMCMCCCCCCCCCCCCCKKKKKKTTTXXXXXXXXXXXMMMMMMAYYY
GGGGGJJJJJJJJJJJJHHHHHHLLLLLLLLLLYYYYYYWYYWYYYNNNNNNNNSSSRRRRAAZZZZRRRRRRRRRRKEKKQQQQGGGGGGOOOMCCCCCCCCCCCCCCNNNNNNNNNNNNNNNNNNMMMMMMMMMMYYA
GGGGGJJGTTTTJJJJJLLLLLLLLLLLLLLLLLLYWYWWWWWYYNNNNNNNNNSSSSRKAAAZZZRRRRRRRRRKKKKKKQQQQQGFGGGOOOICCCCCCCCCCCCCCNNNNNNNNNNNNNNNNNNXMMMMMMMMMMYA
GGGPPGJGTTTTJTJJJLLLLLLLLLLLLLLLLLYYWWWWWWWWYYYNSNNNNSSSSABAAAAZZRRRRRRRRRRKKKKKNNNNQQFFFFGOOOCCCCCCCCCCCCCCCNNNNNNNNNNNNNNNNNNMMMMMMMMMMMAA
GGGGGGGGTTTTTTTLLLLHLLLLLLLLLLDLLLLWWWWWWWWWYYYSSNNSSSSSSAAAAAAAAARRRRRRRRRRKKKKKNNNNQQFFOOOOOOCCCCCCCCCCCCJGNNNNNNNNNNNNNNNNNNMMMMMMMMMMMAN
GGGGGGGGGTTTTTTTTTTHLSLLLLLLLLDLLLXXWWWWWWWWYYYSNNNSSSSSSAAAAAAALLRRRRRRRRRRRKKRNNNNQQRFFOOOOOOCCCCCCCCCCCCJJNNNNNNNNNNNNNNNNNNMMMMMMMMMNDNN
GGGGGWGGGTTTTTTTFFSSSSSSLLLLLLLLLBWWWWWWWWWWYYYSSSSSSSSSSAAAAAAAAARRRRRRRRRRRRRRNNSSRRRRRRROOOOOOCCCCCCCCJJJJNNNNNNNNNNNNNNNNNNXXXMMMNNNNNNN
GGGGWWWGGTTTTTTFFSSSSSSSLLLLLLLLKBWWWWWWWWWWYYYYSSSSSSSSBJJAAAAAAARRRRRRRRRRRRNNNNNNOORRRRRROOOOOCCCCCCCJJJJJNNNNNNNNNNQQQQXXXXXXXXXXNNLNNNN
GGGWWWWTTTTTTTTTTOSSSSSSBLSSHLLLKKJWWWWWWWWWWYYRRSRSRSBBBJJJAAAAAAARRRRRRRRRRRNNNNNNOOOORRRRRRROOOOOOJJJVJJJJJJJNNNQQQQQQQQQXXXXXXXXXNNNNNNQ
GGGWWWTTTTTTTTKSSSSSSSSSSSSSHLLLKKKWMWWWWWWWWWYRRRRRRBBBBBAAAAEEEAARRRRRRRRRRNNNOOOOOOORRRRRRROOOOOGJJJJJJJJJJJJNNNQQQQQQQQQXXXXXXXNNNNNNNNN
WWWWWWTTTTTTTTTJSSSSSSSSSSSSSKKKKKKWMWWWWWWWWWYRRRRRBBBBBBAAAAEEEEEEERRRRRRRRRRROOOOORRRRRRRRRROOOGGJHJJJJJJJJJJNNNQQQQQQQQQXXXXXXXNXNNNNNNN
WWWWWTTTTTTTTTTTSSSSSSSSSSHKKKKKKKUKMWWWWWWWWKKKKRRBBBBBEEEEEEEEEEEEETRRDDRRRRROOOOOORRRRRRRRRROOGGGGJJJJJJJJJJJJJQQQQQQQQQQQQQQXXXXXNNNNNNN
WWWWWWWTTTTTTTTSSSSSSSSSSSKKKKKKKKKKKWWWWWWWKKKKKRRBBBBBBBBEEEEEEEEETTRRDDRRRRRROOOLOORRRRRRROOOGGGGGJJJJJJJJJJJJCQQQQQQQQQQQQQXXXXNNNNNNNNN
WWWIWWWTTTTTTTSSSSSSSSSSSSKKKKKKKKKYYWWWWWWWWKKKKLRBEBEEEEEEEEEEEEETFTTTDDDTTTRBLLLLLLRRRRRRROOHGGGGGGJJJJJJJJJJJJWQQQQQQQQQQQQQXXXNNNRNNNNN
WWIIIWWWTTLTTTSSSSSSSSSSKKKKKKKKKPPYYWWWWWWWWKKKKLLEEEEEEEEVVVVVEEETTTTDDTTTTTTLLLLLLLLRRRRRRHHHGGGGMJJJJJJJJJJJQQQQQQQQQQQQQQQQQQNNNRRNNNNN
WWIIWWWTTKGTTTSSSSSSSSSKKKKKKKKKPPPPMMMMWWWKKKKLLLLEEEEEEVVVVVVEEEETTTTTTTTTTTTLLLLLLLLRRRIRHHHHGGGGGJJJJJJJJJJQQQQQQQQQQQQQQQQQQQQRRRDDDNNN
IIIIIWWWWGGGVVSSSSSSSSSSKKKKKKKKPPPPMMMMWWKKKKKKLLLLELEEEVVVVVVEEEEEETTTTTTTXLLLLLLLLLLLLLLHHHHHGGGGGGJJJJJJJJQQQQQLLLQQQQQQQQQQQQQQRRDDMMDD
IIIIIIWWGGGGGVVVSSSSSSSSKKKKKKKFEPPMMMMMMMKKKKKLLLLLLLEVVVVVVVVEEEEETTTTTTTTLLLLLLLLLLLLLLLHHHHHHHGGGGJJJJJJJJNQQQQQLLQQLLQQQQQQQQQQDDDDDDDD
IIIIIIGGGGGGGGGVSSSSSSSSSSKKKKKFFPPMMMMMMMKKKSSLLLLLLVVVVVVVVVEEEETETTTTTTTTTLLLLLLLLLLLLLLHHHHHHHGGGGGAJJJJJDQQQQQLLLQLLLLQQQQQQQQQDDDDDDDD
IIIIIGGGGGGGGZZZGSSSSSSSSSKKKFFFFHPMMMMMMMKSSSSLLLLLLVVTVVVVVVEEEETTTTTTTTTLLLFFFFFFFFFFLLHHHHHHHHGEEGDDDJDDDDQQQQQLLLQQLQQQQQQQQQQQDDDDDDDD
IIIIIGGGGGGGGZZZTTSSSSSSSSKKKKFFFFPMMMMMMMKKSSSLLLLLLLVVVVVVVEEEEEETTTTTTTTLLLFFFFFFFFFFHHHHHHHHHHGEDDDDDDDDDDQQIQQQQLLLLQQQQQQQQDQQDDDDDDDD
IIIIIICGGGGGGZZZTTNSSSKKKKKKKFFFFFFMMMMMMMKSSSSSLZLLLLVVVVVVVEEEEEETTTTTTTTLLLFFFFFFFFFFHHHHHIIIHHEEDDDDDDDDDDDTDDQLLLLLTTQQQQQQDDDQDDDDDDDD
IIIIIIGGGGGGGZZZNNNNKKKKKKKKKKFFFFFMMMMMMMKSSSSSFZLLLLLVVVVPVLLEETTTTTTTTTTQLLFFFFFFFFFFHHHIIIHHHHEEDDDDDDDDDDDDDDLLLLLTTTTTQQQQQDDDDDDDDDDD
ZZIIIIUGWGGGGZZZNNNNNKKKKKKKKKFFFFBKKKKKKKKSKSSSFZLLLLLLVZVPPLLLETTTTTTTTTTTOOLLLLLLLILIHIIITTTHHHEEDDDDDDDDDDDDDLLLLLLLTTTTTTDQDDDDDDDDDDDX
ZZIIIUUGWWZZZZZZNNNNNKKKKKKFFFFFFFFKKKKKKKKKKKKZZZZLLLLLVVLLLLLLEETTTTTTTTTOOONNNNNLIIIIIIIIIIIHHEEEEEDDDKKDDDDDDDLLLIIIIIIIIIIQDDDDDDDDDDDD
ZIIIIUZGGGZZZZZZNNNNKKLKLFFFFFFFFFFKKKKKKKKKKKKKZZZLLLLLLLLLLLLLEETTTSTTTTSSFNNNNNNNIIIIIIIIIIIHEEEEEEEDDKKDDDDDDLLLLIIIIIIIIIIDDDDDHHHHHHNN
ZIIIZZZZZNZZZZZZNNNNNNLLLLFFFFFFFFFKKKKKKKKKKKKKZZLLLLLLLLLLLLLEEEEETSSTTSSLFNNNNNNNIIIIIIIIIIIHHEEEEEEKKKKDDDDDDLLLLIIIIIIIIIIDDDDDHHHHHHNN
ZZIZZZZZZNZZZZZZNNNNNNLLLLFFFFFFFFFKKKKKKKKKKHKKGGSLLSLLLLLLLLLLEEESSSSSSSLLFFNNNNNNNPIIIIIIIIIIIEEEEEEEKKLLDLLLDLLLLIIIIIIIIIIDDDDDHHHHHHHN
ZZZZZZZZNNZZZZZZNNNNNLLLLLLFDFFFFQQKKKKUKKKKKKKKSGSLLSLSSSSLLLLEEEESSSSSLSLLFFFNNNNKQQQIIIIIIIIJIEEEEELLLLLLLLLLLLLKKIIIIIIIIIIDDDDDHHHHHHHH
ZZZZZZZZZZZZZZZNNNNNNNLLLLLQQQQQQQGKAKKEKKKKEEESSGSSSSSSSSSTLLLJJJESSSSLLLLLLQQQQNNNQQQIIIIIIIIIIEEEEELLLLLLLLLLKKKKKIIIIIIIIIIDDDHHHHHHHHHH
ZZZZCZZZNNZZZZZNNNNNNNLLLLLQQQQQQQQKAAKEEEEEEEESSSSSSSSSSGZTTTLJJJJSSSSSLLLLLQQQQQNNQQQIIIIIIIIIEEEEEELYLLLLLLLLKKKKIIIIIIIIIIIDHHHHHHHHHHHH
CCCCCCZZNNZZZZZNNNNNUNNLLLLQOQQQQQQQQAKEEEEEEEEESSSSSSSSEZZTTTJJJJJFSJNNLLLLLQQQQQQQQQQIIIIIIIEEEEEEEELYYLLFFLLLLPPKIIIIIIIIIIIHHHHHHHHHHHHH
CCCCCCZZNNNNNNNNNNNNLLLLLLLOOOOQQQQQQQKEEEEEEEEESSSSSSSSEZZTTTJJJJJJJJLLLLLLLQQQQQQQQQQIIIIIIIEEEEEEEEYYYLYLLLLLLLLKIIIIIIIIKKHHHHHHHHHHHHHH
LCCCZZZZZZNNNNNNNNNNNLJRRLLLOOOOOQQQQTTEETEEEEEEESSSSSSEEEZZTTJJJJJJJJJJLLLQQQQQQQQQQQQQIIIHIEEEEEEEEEEEYYYYLLLLLKMKIIIIIIIIKKHHHHHHHHHHHHHH
LCLLLZLZLNNNNNNNNNRNNRRROOLOOOOOOQQQQTEEETTTTTEEEESSSEEEEZZTTTTJJJJJJJJJLLLLQQQQQQQQQQQQIIIHHHEEEEEEEYYYYYYYYLLZLKKKIIIIIIIISSHHHHHHHHHHHHHH
LLLLLLLZLNNNNNNNRRRFRRRROOLOOOOQQQQQQTTTTTTTTTEEEEEEEEEEEZZTTTZZJJJJJJJJLLQQQQQQQQQQQQQQQQIHHHHEEYYYYYYYYYJJJJJJJKKKIIIIIIIISSSSHHHHHHHHHHHH
LLLLLLLLLNLLLLLLRRFFRRRROOLOOOOQQQQDQRTTTTTTTTEEEEEEEZZZZZZTZZZJJJJJJJJLLLQQQQQQQQQQQQQQQQHHHHHNNYYNNNNNNNCJJJJJFKKKIIIIIIIISSSGHHHHHHHHHHHH
LLLLLLLLNNLLLLLRRFFFFFRRROOOOOOYFQQQQTTTTTTTTEEEEEEEZZZZZZZZZZZZZJJJJJLLKLQQQQQQQMQQQQQQQNHHHHNNNYYYNNNNNNCJJJJJFKKKIIIIIIIISSSGGHHHHHHHHHHM
LLLLLLLLLLLLLLLFFFFFFFFFFFOOOOOYYAAAATTTTTTTTTEEEEZZOZZZZZZZZZZUZJJJJLLLQQQQQQQQMMQQQNNNNNNNNNNNNYNNNNNNNNCCOCCCFFKKIIIIIIIISSSSSSSSSPXXHMHH
LLLLLLLLLLLLLLLFFFFFFFOFOOOOOOYYYYYAAATTQTTTQTTQEEZZZZZZZZZZZZZZZJJJJJICCCCCCQQQOMQQQDDNNNNNNNNNNNNNNANNNNCCCCCCFFFFKKKKKKSSSSSSSSSSSPGGHHXX
LLLLLLLLLLLLLLLFFFFFFFOOOOOOOOOYYYYAAATTQQTTQQQQEEEEEZZZZZZZZZZZZJJJJJJCCCCCCYQQOMDDDDDNNNNNNNNNNNNNNNNNNCCCCCCFFFFFKKKKKKSSSSSSSSRSPPGGXXXX
SSSLLLLLLLLLLLLFFFFFFFFYOOYYYYYYYYYYAATTQQQQQQQQEEEEEZZZZZZZZZZZZJJJJJCCCCCCCCCCODDBDDDDDNNNNNNNNNNNNNNNNCCCCCCCFFFFFFKKKKKSSSSSSSPPPPGGGNNX
SSLLLLLLLLLLXXLFXFFFXXXYYYYYYYYYYYYAAAQQQQQQQOQQQEEEEZZZZZZZZZZZYJJYGGCCCCCCCCCCOODDVDDDDINNNNNNNNNNNNNNCCCCZQFFFFFSSFFFFKSSSSSSSSAPPPPGPNNN
LLLLLLLLLLLLXXLXXXXXXXXYYYYYYYYYYYYYYQQQQQQQQQQQQQEEEEZZZZZZZZBYYYYYGGCCCCCCCCCDDDDDDDDDDNNNNNNNNNNNNNNNNCCCZQFFFFFSSFFFFKSSSSSSSSSPPPPPPNNN
LLLLLLLLLLLLLXXXXXXXXXXYYYYYYYYYYYYQQQQQQQQQQQQPQQEEEEEFZZLZZZBYYYYYYGCCCCCCCCDDDDDDDDDDDNDNNNNNNNNNNNNNNNCCZQFFFFFSSFFFFSSSSSSSSSSSPPNNPPNN
QQQYLYYYYLLLJXXXXJXXXXYYYYYYYYYYYYYYQQQQQQQQQQQPPPPPPFFFFFLZZZZYYYYYYYCCCCCCCCCAADADDDDDDDDDNNNNNLNNJJJJCCCCZQQFFFSSSFFFSSSSSSSSSSLLPNNNNNNN
QQYYYYYWWLLLJJJJJJJXXXYYYXXXXXXXXXYYQQQQQQQQQQQPPPPNFFFFFFLLZZZYYYYYYYCCCCCCCCZAAAADDDDDDDDDDNNNLLLLJJJJJCCCQQQFQSSSSFKFSSSSSSSSSSSPPPNNNNNN
QQQQYYYYWLLLJJJJJJJJJJSNBXXXNXXXUYYYYIIJJJQQBBBPPPPPFFFFFFFZZDYYYYYYYYZCCZCCZZZAAAADDDDLLLDDDDNLLLLJJJJJJQQQQQQQQSSSSKKKKSSSSSSSHSSHHHNDDNNN
QQQQYYYYWLLLJJJJJJJJJZNNNNNNNJXXUUUYYYJJJJQQQBPPPPPFFFFFFFFKKYYYYYYKYYZZZZTTTTZZAAAAALLLKLLDLDLLLLJJJJJJJQQQQQQQQSSSSKKKKSSSSSSSHHHHHDDDDNNN
QQQYYYYYYYJJJJJJJJZZZZNNNNNNNNUUUUUUYJJJJJJJJBBPPPFFFFFFFFFKKKKKYYYKKZZZZZZZZZZZZAAAAALLLLLLLLLLLLLLLJJJQQQQQQQQQSSSSSKKKKKSSSSSSHHHHDDDDNNN
YYYYYYYYYYYJJJJJJJJZZNNNNNNNNUUJJJJJJJJJJJJJJJJBFFFFFFFFFFFFKKKKKKKKKZZZZZZZZZZZAAAAAAAGLLLLLLLLLLLJJJJJJQQQQQQQQSSSSSSKKKKKSSSSTTTTTTTDNNNN
SYYYYYYYYYYJJJJJJJJZNNNNNNNNNUUUJJJJJJJJJJJJJBBBBBFFFFFGFFFKKKKKKKKKKZZZZZZZZZAAAGGGAGGGLLLLLLLLLLLLJJJQQTQQQQQQQQQSSSKKKKKKKESTTTTTTNNDNNNN
SCYYYYYYYYYJJJJJJUZZZNNNNNNNNNUUUUJJJJJJJJJJJJBBBBFFFFGGFKKKKKKKKKKZZZZZZZZZZZAAAGYGAGGGGLLLLLLLLLLJJJJQQQQQQQQQQQQSSSSSKKKTTTTTTTTTTNNNNNNN
SCCYYYYYYJYJJJJJJUUUZNNNNNNNNUUJUUJJJJJJJJJJJLBBBBBGGGGGGKKKKKKKKKKZZZZZZZZZZZAAAGGGAGGGGLLLLLLLLLLLLLJQQQQQQQQQQQQSSSSSKKKTTTTTTTTTTTNNNNNN
CCCYYYYYJJJJJJJJUUUNZNNNNNNNNNUJJJJJJJJJJJLJJLLLBBBGGGGGGKKKKKKKKKKZZZZZZZZZZAABAGGGGGGGGGGLLLLLLLLLLLQQQQQQQQQQQQQQSSSSKKTTTTTTTTTTTTNNNMNN
CCCYYYYJJJJJJJUUUUUNNNNNNNNJJJJJJJJJJJJJJJLLLLLLLLBBGGGGGKGKKKKKKKKZZZZZZZZZZZABBBBGGGGGGGGLLLLLLLLLLLQQQQQQQQQQQQQQSSSSKKTTTTTTTTTTTTTMMMNN
CCCCCYYCJJJJJUUUUUUUNUUNNNNJJJJJJJJJJJJJJLLLLLLLLLLLGGGGGGGKKKKKKKKZZZZZZZZZZZBBBBGGGGGGGGGGGOOLLLLGGGGQQQQQQQQQQQQQSSSKKTTTTTTTTTMMTTTMMMMM
CCCCZZCCJJJJJUUUUUUUUUUUUUUJJJJJJJJJJJJJZZLLLLLLLLLLFGGGGGGGGGKKKKKZZZZZZZZZZZBBBGGGGGGGGGGGGGLLLGGGGEEEQQQQQQQQQQSQSSSSSTTTTTTTTMMMTTMMMMMM
CCCCZZZCCCJJUUUUUUUUUUUUUUUJJJJUUJJJJDDJJZZLLLLLLLZZGGGGGGGGGGKKKKKZZZZZZZZZZZBBBBGGGGGGGGGGGGLLGGGGETEEEEQQQQSSSSSSSSSXTTTTTTTMTMMMTTTMMMMM
CCCCCCCCCCJUUUUUUUUUUUUUUUUUJJJUUUDDDDDJJZZFFLLLFLZZZGGGGGGGGGGKKKKZZZZZZZZZBBBBBBGGGGGGGGGGGGLLLGGEEEEEEEQQJQSSSSUSSSSMMTMMMTTMMMMMTTTMMMMM
CCCCCCCCCCCUUUUUUUUUUUUUUUUUUJJUUUDDDDDZZZZFFLLLLLLZGGGGGGGGGGGKKKKZZKKKKZZZZBBBBBJBGGGCGGGGGGGLLGGGEEEEEEQQQSSUUUUSSSMMMMMMMMMMMMMMTTMMMMMM
CCCCCCCCCCCUUUUUUUUUUUUUUUUUUUUUUDDDDDDDZZFFFFLPWWLEGGGGGGGGGGKKKKKKKKKLZZZZZZBBBBJBGCCCCGGGGGGGLGGGEBBEEEEQSSUUUUUSUSSMMMMMMMMMMMMMMMMMMMMM
CCCCCCCCCCCCUUUUUUUUUUUUUUUUUUUUUUDDDDDZZFFFFPLPWWWEGGGGGGESSSSSSSSSSSLLLLZZBBBBBBBBGGGCCCGGGGGGGGGGGGEEEEEESSUUUUUUUMMMMMNNNNNNNMMMMMMMMMMM
CCCCCCCCCCCCUUUUUUUUUUUUUUUUUUUUUUDZDDDDZZZZZPPPWWPEEEEEEEESSSSSSSSSSSLLLLLZBBBBBBBBGGCCCXGGGGNNKNGGGAAEEEEEEBBUUUUUMMUMNNNNNNNNNNMMMMMMMMMM
CCCCCCCCCLLUUUUUUUUUUUUUUUUUUUUUUUUZZZZZZZZPPPPPPPPPEEEEEEESSSSSSSSSSSLLLLLLBBBBBIBBGGCCXXGGNNNNNNGGAAAEAAAENBBUUBUUUUUMMNUNNNNNNMMNMMMBMBBS
CCYYCCCCCLLLUUUUUUUUUUUUUUUUUUUUUUUZZZZZZZZPPPPPEPPPPEEEEEESSSSSSSSSSSLLLLLBBBBBBBBIIGCCXCCWWWNNZNVGAAAAAAABBBBCBBBUUUUUUNUNNKNNNNNNNMMBBBBB
YCYYYYYCCLLLUUULUUUUUUUUUUUUUUUUUUUUZZZZZZZPPPPPPPPPPEEEEEKKKSSSSSSSSSLLLLLLBBBBBBIIIIICCCCWWNNNNVVVFAFAAAABBBBBBBBBBBBUUUUUNNNNNNNNNMBBBBBB
YYYYYYYCLLLLLLLLLUWUUUUUUUUUUUUUUUUUZZZZZZZZPPPPPPPPPEEEEEKKKSSSSSSSSSLLLLLLBBBBBIIIIIIUCFCWWNNNVVVVFFFFAAAABBBBBBBBBBUUUUUUNNNNNNNNABBBBBBB
YYYYYYCCLLLLLLLCLCCRUUUUUUUUUUXXUUUUZZZZZZPPPPPPPPPPPEEEKKKKKSSSSSSSSSLLLLLLLBBBBBYIIIIIIFFNNNNNVVVFFFFFFFFABBBBBBBBBBBUUUUUNUUNNNNNANNNBBBN
YYYYYYYYYYPPLLCCCCCCCCUUUUUUUUXXNDNZZZZZZZPPPPPPPPPRREEEEEERASSSSSSSSSLLLLLLLBYBBYYYYYYYIFFNNNNNNVVFFFFFFFFABBBBBBBBBBBBUUUUUUUNNNNNNNNNNNNN
QYYYYYYYYYPLLLLCCCCCCCCCTTUUUUNNNNNZZZZZZZZPPPPPPPPRNNEEEEEESAAAABBBLLLLLLLLLLYBYYYYYYYYFFKKKKKKKKZFFFFFFFFFBBBBBBBBBBBBUUUUUUUUNNNNNNNNNNNN
YYYYYYYYPPPPPLLCCCCCCCCCCCAAUUNNNNNZZNNNZPPPPPPPPPPRRREREMESSQAAALLLLLLLLLALAYYYYYYYYYYYFFKKKKKKKKZZFFFFFFFRRRRBBBBBBBBUUUUUUUUUNNNNNNNNNNNN
EEYYYYYYPPPPPPPCCCCCCCCCCAAAUUNNNNNZZNNNZPPPPPPPPRRRRRRRORRSSQQAAALALLLLLLAAAAYYYYYYYYYNNNKKKKKKKKZZFFFFFFFFRRRBBBBBBBUUUUUUUUUUNNNNNNNNNNNN
EEYMMPPPPPPPPPPCCCCCCCCCCCCNNNNNNNNNNNNXPPPPPPPPPRRRRRRRRRRRQQQAAAAAALLLLLAAAAYYYYYYYYNNNNKKKKKKKKZZFFFFFFFFRRBBBBBBBBUUUUUUUUUUNNNNNNNNNNNN
EEYYPPPPPPPPPPGCCCCCCCCCCCDNNNNNNNNNNNNNPPPPPPPPRRRRRRRRRRRYQQQQQQQQALLLAAAAAAAYYYYYNNNNNNKKKKKKKKFFFFFFFFFFFRRRBBBBBRRRUUUUUUUUNNNNNNNNNNNN
EEENNPPPPPPPPGGCMCCCCCCNNNNNNNNNNNNNNNNNPPPPPPPPRVRVRRRRRRYYYFQQQQQEQQQVAAAAAAAYYYYYYNNNNNKKKKKKKKKKKKFFFFFFFFFBBBCCBRRRRRUUUUUUNNNNNNNNNNNN
EEEPPPPPPPPPPPPCMCCCCCCNNNNNNNNNNNNNNNNNKPPPPPPPPVRVRRRRRYYYYFQQQQQQQQQQQAAAAAAYYYYYYNNNNNKKKKKKKKKKKKFFFFFFFFFFFFFCRRORRRRUUUUUNANNNNNNNNNN
EEEPPPPPPPPPPPMMMMCCCICMMNNNNNNNNNNNZNNNTTPTTPPPVVVVRRRRRYYYYQQQQQQQQQQQQQAAAAAYYYYYNNNNNNNNNKKKKKKKKKFFFFFFTCCCCCCCRRRRRRRUUIUNINNNNNNNNNNN
EEELPPPWWPPPMMMMMMCCCCCCMMMNNNNNNNNNZNNZTTTTTPPTVVVVVRRRYYYYQQQQQQQQQQQQAAAAAAYYYNNNNNNNNNNNNKKKKKKKKKCCCTTTTTCTTRRRRRRRRRTIIIINNNNNNNNNNNNN
UUEEEPPWMPPPPMMMMMCCCCCMMMMNNNNNNNZZZNNZTTTTTYTTVVPPVVRRRYYYYQQQQQQQQQQASAAYYAYNNNNNNNNNNNNNNNYCKKKKKKCSSTTTTTCTTTTRRRRRRTTTIITTNNNNNNNNNNNN
UUUUMMMMMPPPMMMMMMCMMMMMMMMNNNNNNNZZZZZZCTTTTTTTPPPPVVVRRRRYYQQQQQQQQQQAAAYYYYYYNNNNNNNNNNNNCYYCCCCCCCCCCTTTTTTTTTTERRRRRRRTTITTNNNNNNNNNNNN
UUUMMMMMPPMMMMMMMMMMMUUMMNNNNNNNNNZZZZZCTTTTTTTQPPPPVPPPYYYYYYQQQQQQQQQQEAAYYYYYYNNNNNNNNNNCCCCCCCCCCCCCTTTTTTTTTTTRRRRRRRRTTTTTNTNNNNNNNNNN
UUMMMMMMMMMMMMMUMMMMMMUUMMMNNNNNNNZZZZOTTFTTTTTQPPPPPPPPBYYYYQQQQQQQQQQQQYYYYYYYYYNNNNNNNANCCJCCCCCCCCCCTSTTTTTTTTTTTTRRRTTTTTTTNTNTTNNNNNNN
UMMMMMMMMMMMMMMUUUUUMUUUMMMNBNNNNZZZZZZZFFFFTTTTPPPPFPPPBYYYQQQQQQQQQQQQCQYYYYYYYYYNNNNNNCCCCCCCCCCCCCCCCCTTTTTTTTTTTTRRTTTTTTTTTTTTTNNNNNNN
UUMMMMMMMMMMMMMUUUUUUUUUUMMMBNNNZZZZZZZZFFFFUUTPPPPPPPPBBYYYQWQQQQQQQQQQQQQYYYYYYYYNNNNNNCCCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTNNNNNNNNN

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -1,71 +0,0 @@
##################################################
#OOO#..O.O#O#...#.O.OO...............OO.....O....#
#O#O...#...#...O............OO.#...OO..O..OO...O.#
#..O....O#.O..O.O..O#O##.OO..O..........#O....OO.#
#...O#.OOO.O.O.O......O.OO.O..#.O.OO#O.#OO.O.O#..#
#OO..O....O....#....OO#OO..O..OO..O.....#O.O..O.O#
#O.....#.O.O...#..OO.......OO....O.#O.O..#..O..O.#
#..OO.O.#O.O.O..##O..O#OO....#.O..O...O.OO..#OOO##
#....OO...OO..O..O.#.OOO..O..#O....OO#O..O..#.O..#
#....OO.#...O#..O...#.....O......#.....#.....#.O.#
#..O.....O.O.O..O....OO#.O.#.O......#..#O.O..OO..#
#.#..OO....O........O.#....OO...#.O.OO...O.......#
#OO...OO.OO...#.OOO........O#...O.#.OO....OO...OO#
#.O..O..OO.OOOO....#..O.#OO.O..O#.......O.#....###
#O...O.......OO....#......OO.O.#O.O..O.O.O.#..O.O#
#OO#OO....#O...O#....#...OOO.O.O..O..#...O.O#O..O#
#....OOO#OO.......#.OO....#...O..#.O...#.O.......#
#OOOO....O...O.OOOO.....OO.......O#..O.OO.....O.O#
#..#..O.#.O..OO.OOOO...OO#...OOO...O.##.O#.O..OOO#
#O......O..O#...#....O...O.OO....O.O....OO..#....#
#.....OOO..O.O......O...#...O...........#.OO..#O.#
#...#.....O.O..#O#....O.#O#..O#....O..O....#OOO###
####O.....O...O.#.......O.O.O...O.....O.O...O...O#
#O...O...O.OO.O.....O.O......O.##.#O#.O.....O..OO#
#...#..#...#...OO..#OO.O@.O......O............OO.#
#O........OOO.O.O.O..#..#O...O.O..#.OO...#.OO..#.#
#.O.#..O...O...OO...#..OOO......OO.#O#......O.OO.#
#.O...OO#O...O..O......O..#O....O.....O..O..O.O..#
#.O..O...O..#..OO.....O..O.........O#...#O#..OO.##
#.....O..#..##........O.#..#...O..##..OO.....O...#
#.O..O#...#.....O.O#....OOO.#..#.OO..O..OO.OOO...#
#.#OO..O...O.....O.O#.....##..O.O#.O.O....O....#.#
#....#..#.....#O.#..O..#......O..O.....OO#..O#.OO#
#....O.O...#OO...#O.O..O..........OO..#O....O..O##
#O...#..#.....O.......O.O.O....O.O.O..O.O.#...####
#.OO........#.#..........#..O....OO#..#O.O.....O.#
#.#..O.O....OO....#O.......#.O..O.#O.O..OO#......#
#O...O.....O.OO#...#O.O.O.....O..OOO..O##.O...O..#
#O...OO.#O#.O..O..O...O.O......O..##............##
#O.O.#...........OO.....OO...O.O......#O.OO....OO#
#...OO...OO#.O..O.O...O..OO......O.......O.O.OO..#
#.#....O..O..O...O.......#...O.#O..O..O.O.O......#
#O....O......O#.O......##.....#.....O.O.O#O......#
#.OO.OO..O......OOOO..O#.O...O.O......#.....OO..O#
#.O......O.O.OO.O..#..O....O.....#....O.#.OO#...O#
#.O..#....#...O......#.O.....OO.O.....O.....O....#
#.#..OO.....#.....#O.O.#O......O......OO....OOO.O#
#..OO.O....O...O.O......O.O.OO...#.....O.......O.#
#..O..O...#.O.O#........OO....O...O.OO...#.......#
##################################################
^>v<v><>^<>v^<vvv<v>v<><>^^v>^^<<^<v^v>v<>v^<^<^v^v^>>v<><>^<^^^^<v^><v<^^>v>vv>v^><<vv>>^><v<^<^v^v>v>>^><>^^vv^<<<>v>v>>vvvv^<^><v>^^><>v>^v^^<>>^<^<v<v^^<v><v><<>>>v^<<>>^^^<^>><v>>v>^>>v^^v^^^>>^v<vv^>>vvv<<>vv<^>>>^^^v<<<^^<v^^<><v>v<v<vvv^>><><>>>^v>^vv>^><^>>vv^^<^<v^<>>v^^vv^v^^v<v^<v^<><>>>>v><<vv<><^vv^vv><^^^vv><v^<^>><<<v^v<>v><>>v^^<^^>><>^vvv<<><<^v<<^>^v^^v><^<^vvv>v<^^vv^<><vvv<><>>>>v<^^v^<vv<v>^v>vv^v>><<v^><<><<>^v>>><^<^<vv>^^^v><^>vv>>v<^<<v>vv<<>>^>v<>^^<^<><^<>vvv><>><<v^^>>>v^>^<<^^>v^>>>vv<^v><>v<<^>>><<><v^><<<<>^>^^v^<>^>v>v><<<>><<>>vv>v><<^><<><vv>vv<v^v^>vv<<v>v^v^v^v<<^v^v><>v>v<^v^>><>><^<>v^^^^v>^^<^v><v<>^<<>^><^^^><>vvv>>>><<vv^v^<v^>vvv^<^^v>><<<v^v^<vv>v^^^^>v<<^<>v<^>^^>^<<v<^^^^>v>>^^<>v>v<<^<><v^^v<v>v>^<^>><<>v>>v>v>^v<<^<<^<vv<>>>vv>^<>v<v^^v<<vv^v>>^v^v>^>^>^>vv><^<<^<><<^v<v<v<v^^vv<<v^>v>v<^>v<vvv^<>^><vv>^v<^>>vvv>v><v>^<>^<^^>><<^><v^>>^v>>><v<^v^<<<<vvvv>^<<<>^>>>v<><><v<v^v>><<^>><v>v^<vv^^<>>^>><<<<^^>v>^^<<v^^>vvv^><v>v^<<>^<<<^<>>^<><
<<^^^v<v^>^v^>v<^>vv^v<>^<v^<<>>^vv>v><^>^>^<<vv><>v>>v^<^<v<^vvv>>v^><>>>v<>>v<><v>><^^<^^v<<<<v<^^<v^>^^^vv>^v<v<>v<^><v<^^>>v^>v^><^><<>>^vvv>>v<>v<^<^>>v<^<^^<>^v^<^>^^>^v<><^><<>^>v>v>v^vv^^<^v^^<>><<v>v<^>>>>v^v<^>><v<vvv>v>v<<^vvv>>^>>^^>><^>vvv>><^v>>v<<<>v<>v>^<^>vv^^<<<<<<<vv^^^<><^<<vv<<^v><vv>>>><>v<>^>>^^v><^v>v<<vv<^>v>^><^>^v<v>^<v<v^<^^v<^<>>^v^<^<<<^^<<<vv><<<v<^><vv>^>v^<^<>^^^vv><>^^<^v<>vv^>^^^^^<vv<vvv>^^v>^><><v^<^<<><<^v^vvvv>>^v>>^<vv^v^<>^<v<>v<^v>vvvvv>>>vvv<v<<<>v<<><<^^^^v<<vv><<^^>><>>>vv>v<^<v>>v^><v<>^<<<v<<^<^<<^>>^<><^v^v^>^^^^v>v>^v<>^>><^>v><><^<^v>^><<>^^v^v>><><v<^^^>v^vv^v>^^^<>^v<<<^>v^^v>^vv<<vv^^<>vvv<>v><^v>^<><^^>v<<^<>v^^<<>>^v<^>vv^<v<>^v<^v><v>>v^<^v><v^vv>><<v<<vv>><<v^v^^<^>^>>>>>>^<vv><>vvv<<<^>>v<>vv<><>^><<v<v>^<<>^>>^<<><>v<^<^<vv>><vv<^^>^><<v>>^<>><^<^v><<><vv>^><vvvv<v<v<v>>^<v^<<>>^v<><>v^>^^>^>v>vv<^^^>v>^>^vv<^vv^v<<>>>^v^>>>vv^^v<^v^<>v<^<>>v^<^v^^<vv<^<^>>><><<>v<^<<<>>>>><<<>^v<<^^^^^^^>v^^^^^^<^>^>^<>^<>^^v^^<<>>^<><^<^<>^^<
vv^>^><<<<^v^^<>>><^v^vv^^>^<^<v<^>>^><vv><^<><<v>v^>v<v<>>^>v^<><^vv<><>>^^v^<^v<<^>>^^^>v>v>><>>v><<^>v^^v<v^>>v<v><>v<vv<v^^^v^>>>^^<^^<^v<^v>^><^<v^^v>v^^<<<^>^^<v<<^^><v>>^>^<^^^<>^v<v<>^<>>^>vvvv^^^^v>^v<>^<<<<>^>>^^^^>^^v><v>>>v^v>>><^v^vvvv^v>>^^v^^<vv<<^^<^v<<>^<<vv<v^<>^vv>^><<<>v<v>v^<v<>v>^<><v<<^v<^<>v^<v^^^v<<^<<vv<>vv^<v<>^^^<^<>^vv>^v><^<<^^^vvvv^v<^>vv>>^v^vvvv>><^>>^^<v<<^^<vv<v^<>^<><<v>>vv^v<^v<^<v^><>v<<^v<v>v^>>v<v^^<>>>v^vv^<><>vvvv<>v^<^v^>>vv^v^>v<<^vv>^v^^v<<<v><<^vv><<^>>^^v<v>v<>v>^^>>^^><v>>v^<>vvv^>v<^<>v^><><<^<v^^<v^^^^v<v><<v>v>>>v^^<><v^<>^<>>^<>vv>><^><v^^^<v^^>v<^<v<^<v^vv>^<v^v^>>>v<^vvv>><<>^^>^<^v^^>><>v^^>><^><<vv>>v<^>vv>>v>><v<^><vvv^<^^^v>^^<^v><>^v<^vv^^>v><^v>^>><<<<>^v>><><^v^v>><>v>>><>^^^^<^^v^<<v<>v>v<^^^v<^<<>v<><><vv><v><^^>>^>^v>^^><><^v>^<>>^<<v<^v^v^><^^>^><<v^^v<<><^^>vv>vv^<v^<<<vv^<<>^vv<^<<<><vv><<^v^v<<v>>v^v>^<^^>>>>v^^^<>><v^<v^><><<>^v<^<v<^<<<v^v<v<v^v<^<^<v<><^<>^<<>v<<^<v^vvv>><^^^^><<<^^<<vv><^v<^v^^<^>^^<>>>^>><^^>^^>><
<<<<<>v^>^<^vv>^v^>^>^v<v<<<^v^v>vv><>>>><^><>>>^<vvv>v^<>^v^<<v^>>v^v^vvv>^<>v<>>v^<v<^vv><^>>^>v<<v^<^><>^<^>>v<^^vvv^<<<<^vv^vv^>>^><^>v^>><v><v^^>>><v<^<^v^<v^>v>><v>v^<^>vv<<^^^^^<<>vv><^<^<><^<>^<^>^v^^<v<<>vv<^v>vv<<<vvv^<^>vv><v>>><v<>>v>^^v^^<>>^v<>><>v<>^v^>>>>^^^v^^^><v^v>^^<<<^<<^>^><^><<^vv^^v>v><>^<><^>^<<>>^<v^vv^^vv<^<^^>v>v>^vv<^v>>^>>v>><vv><^<<<<vv>vv>>^^^><<v<<<>v<<<>>v^<<^vv>>>^>><<>^^<<<v^<<><<><<<v^^^>><^v<<<v>v^v^<<v<<v<v^vv<<^vv<v><^>^<v<<v^<v<>^^<^^v><>^v<v<^^v^<><^<v<v^<^v>>v<vv<^^^<^^>v>v^^vv<<<^<vv>^<<^<<^<^^v^v>^v^>v<>>>^v^v<<v<^vv>>^^^>>^<<><^^><v^^^<vv^^^v<<<v<^v<>^^>v<^v<^vv<v<>^vv>^^^>^v^^<>v>^^>v^vv^v><<<^<>v>vvvvvv>vv<>^>^^>>^>^<<>^v>v^<^vvv>^^^^^v<>><v><vv<<<^v>>^v<>>>v><>v>^>v<>^>>vvvv<><><v<^>>vv^^<>>><v>^^v<v<<^^^^v<<><v^<^<vv<<<^<v>><<<>v<v<<<<<>^<>><v>^^><v>^>^^^><>v^v<^v^vvvvv<^^<v>v^v>>>>v^^^<>v<>><<><^<^v^v^<v^v<>v>>v>>^vvv>>>^^>>><^v<<<^>^vv>>v>>>^><v<^>>^<<v>>v<<<^vv>^v<>^v<^><^vv>v^v^vv><vv>v<^^>v>v><><><^><v^v^<v<>>^^><<^<v>v^>v^>^v<^v<>
>v>>><>^<^v<<<>^v>v^^v>>^<<^v>><^<v^^^<<<<>^^v<v^>><^^<<<<<v^vv^v<v^^>^>vv^v^<<<^<>v^>^<<<vv^<<<<vv><^v^<^<><v<v^v^<^vv><>^>v<>v>v<<vv<^>^>>v^v<^>v>^^v>v<^^v<<<<^^^<<^<v^<>^>v<vv>><vv<^^<>^>v>v^vv<>^<v^^>vv^>>v^^<>>>><v<>vv^>vv><^^>vv^v^^>^^^^v^v^<v<><^v>v<^^<><>vvvv>>v<v><<<v<<<>^v<^v^v^^>vv^^<v><<^<^vv^^<<<<><^<<>>vv<v>^<^^^<<v^^v^^>><>v^>^>>><<<v>>>>^vv>v>vv>^<<^v^^^^>>^>v<^^>>^v>>^v<>>v<v<>>>v^><>^v<<v>>>^v<>>v>>><<>vvvv^>><><^v>^>>vv<vv^>>^<><^v><^^v><<<<>vv<<^^v<^>vv<^^v<<^><<vv^^<^vv>v<<^v^<^v<<vvv>v<><><^<<>>v^><>^^^vv^>><<vv>^v^^<>v<<vv<^^^^><vv^v>>^^v<v<^<^<v>v<<<v<v<v>>vv^>>>^>v<<vv>>>v^v^v^^v^v>vv>><>vv<<^<^<>vvvv>^^>^<v^<<v<<v^^<^>v<<^^^><^v<^<>^>><^<>vv^>^<<^>>v^<<>v<>^v^v^^<^<>>^><>>^>>^><>v>vv^><^<<^>>><vvv^<^>^^><^^vv^<v<<>v^<^>>v>^<v>v^<v^^<<<v^>>^<<>>>^>v<vv<^vvv>><<><>^v><<^^>^>v^v>vv^vv^<>vvv^<^>^<v^><>v>^>>>v^><<v^>>vv^<v^v<<v<v>v^>^>^v^v^^vv>^v^<v^><<^>v^>v<><vv^^>v<^>^v>^v<><<>^>v^<^vvv><^^>v><^><^>>v>><<v><^^><<<<^^^<^>vv^v>v^<<<>>^v^v<>^<^<v^^^<^>><v^<<v^<^^^<
v>v><>^^^><<^v^>v<<>^<<<<v>><<^>^vvv^><v<^<^<<v^v^vv^v^><>v>^^v^<^<^<v>v^><<>^>><^vvvv^^^^v^vvv^^>>^<vv^<^<v^<>^^<^<<^v>>>>v<vv^>^^>v<^><^v^^><^^^v>><>><vvv>v^<<v^vv>v<^><vv>v>v^<><>>v<^>^^v>v<v>><>v<v^^<>v>v>^v>^>^<<<^^vv<<<v^v<vv<><v>>>>v>v<>v<>>v><<><>^^>v<^v>v<^v<^^^^>^^^^v<>v^v^vv<^^^^>^^<^<<v<v>>>><^^>v<<^^^v^^^v^v>^><vv>^><<<v>^<<>v>v>v<^<>>^<<<v><^^<^^v><>^v>v^>v<v>v<v^><><<^v^v<<>^>v^v^<^v^v>v^v>>^v<^vv<^<v<v>>^vv^^^>^<^^^v^>^>>^vvv^^<vvv>vv^>^v<<<<v<v<v>v^^^vvv>^>^^^>v><vv<<<>>><><v>^>^vv>vv>^<v^>>^^<>v>v<<>^>^^v>><><>^>vv>>v>>v^<<>>^v<>vv<><><<>^v>>>^v><^<^>vv>^>><<>v>^^v>v>^>v>>v<<<^^><^v>v>><<^<<^v^>^>>v>^v>v<<><<^^v>><v<<^>v^^<v^^^^^>>>^v^<v^vvv^<<<>>>v<vv^v<^v^<^v^vvv^^<v>><<vv><<^>v<^<^vv<^>v>^v^^<<>v<<>v^<>v<^>>>vv>^vv>vv><<>^>>v<>v<v<>v<^>^<^^^v>>^>v<v^>^^>^^<>><^>^<v^><v>v<>>v^^^^>>v^v^v>v<vv^v><>v<v<^^^<^<v^^v^>vvvv>v^<>^v<v>v<v<v^>>v>v><>^><vvv>v>^^v><<>v^<<^>v><<<><<^>>v^>v>^>^v^<<<>>v^<<><^^vv>v>v^>v<^^v^<v^v>^>>>><<>v>^<>^vv^^>^>v<^v><>v<>>^v><v<>^<><v^>><>><><<
^^v^<v^><><<vv^v^>><^v<<<><>>^vv><v<^^<>><^>^^<^>>^v^>v><<v<^>>vv>>>^>^^^vv><>><^<>v>><>>^^^>><v^v<><v^^>^v><<^vv>>^v<^v>>^vvv^^<>v>>><>>^^<^vv><<<<^v<^v^<<>^<<<<><vvvv^v<<^v^<><^>>v^>>>v<^v^<>^<<v>>v<^<>v><>>v>vv^^<^<<^>>^vvv><<<^<^^v<>>v><<<<>>>v>v<<>>>>^^v>><>^^v>vvvv<><<vv^<^^^v<vv<<v^^^v<v>^<vv^<vv<<<v>><^vv>>><>^<<v>^^^^^v><vvv<<<v^vvv>^<><^v^>>>>^v<^v><><^<<<v<<vvv<^v^^<v^><v^><^>^^^<vv>>>^<>>>><<^<v>v>^>>><^<<>v<^<>>^<^v<v^><v>vvv^^v^vv><vv<>v^>^>vv>^<<^^><v>^vv>v<<>^>v<^v<^v<>^v>v>^>^<^^<v<>vvvv^<<^<<>vv^^>>><^v^v<^v<v>^v<<v<vv^<^vv>v<^>>>>><<<<<<^>><>^^^^^^<>v>v<^<^<<vv>v^^^<^v<>^v<>><^><>^<v<^<<<>><>v><>>v<><^><^^v<>^>>v>^<><vv^><vv><><^<>>^<^^^><^<^v<^<v<>vv<vv<>^v><^vv^<^><>vvv^<v>>^>vvv<^v<^v<^<^v<>^v><vv^<<>><><<>>v>^v<v>v<^>vv><v^>>v>>>^^^^v<vv<>vv^^>^^<>>^<^<^><>^v<<>^v^^v<v<^<<vvv<vvv>v<vv<<<^<<v^<>><><>^^><v<>^>>^^<><v>>^<<>vv<^v^^<<>^>v^><v^>^^>v>v<^^v<^^v><>^v<vv^>^><v<<<v<>^v>>^^v^^<>vvv^v^>^v^<><>vv^<^>^v>>^^<<^<>v>v<^^v<>v^^^<v<<^^>^>>>v<>^v><v>>vv^vv^v<v<v><^<<
^^<>vvv>v<vvv^<^<><vv<vv^>>^<v>>^>>v<^<v^<^>>v^vv^<^>^^>^vv>v>^^<><<<^^<>>><<<<><v^v><^>v>v^v>v<v^vv>^>vvv>>^>v>><<vv<v^<><v>^v<><^<vv<<>>>v<^<^<v^<v><<<v<<<vvv<<v>^<^>vv<^v<<^>><>v>v^>><v<vvv>>^<^v^>><>v^>v>vvv^>>>vv^v><<v<>><v<<^v>>^vv^<><<<<>^><^v<>^v^<^>^vv^vv<^><^<<^^>v<v^><>^>><^^<<^>>>v<>><>^<^^>vv^>^>vvv>v<<>>^v<vv>vv<<<^>v^^vv>>^<>vv^vv<<v^^<<<^<<<<>^>v<<v>>>v<>^<>>>^>v^^<<v^v<^^v^><<<<^vv<^<^<^>^>^>>v<^v^<<>>>^<vv<^>^v^><v^<<>><<><v^<^^<<vvvv>v^v^>>^vvv<<<><<<^<<^<^v^<v<v<>v><<vv^<v<v<<<><>>^^v>^<<^<>v<^<v>>^>v><><^<<<>vvv<v^v><<^<<^^>^<>^>v<<^v<v>v<<^^v<v><v^v>>vv>vv<>>>^v>^v<^^>v^><^<v^<<^<>>^v>>^<v<<>>><<^<>v<^^^>^^^v^^^vv>^<><^v<<<vvv<^>v^v^v^^>v^<>vvv<^<<vv<v<^vv^v<<<vvv^>><>^v<<>>>><<^>vv^v^<><^>><>^>>v<>v>^>>v>><vv^v><^<^>>v<<><>v>^<<>>vvvv>><<^^v<vv>v^<^<>v^v<>^><><<<^vv><v>v>^^><<^<^^>>^vv<^>>v^>>vv<>>>^>>^<<<>v<>v^<>^vv><<^>^^>><<^^v^v^>v>>>>><^v>v^^<vvv^><^>>>>^v>^>^<<^^v^<v<>^^<^v>^vvv<^^<<>^><^<^^^<>v^>^<^^<v><v>^><<v<^>^>>v<<v>>^v^>^<<vv><>^>^vv><<v><<>^<>vvv^>^
vv^^<v><<v>>v<>>^v^v>^^><<<<><>>><>>v^>>>>v^^<<<v>>^v>v^v<>><^v<>^^><>^<<^v>>>^^<^><^<<<<v^^>^<^vv<v<v>v^>>v<v<>v^^vvv<^>>>>vv>^vv>^v>>^^^^v^>^><^^v>v^>v<<<^^><^>v^<^v>>^<^vvv^<><^^v>><v<^<v^<<^vvv^^<>^<>>v^>v^<v^><<<>^^>vv^>>v^v^>^^v^<^^>>v>v><><><<v<^^v<^^<^^^>v<v^v><^><^v<v><^v^^<>^^v<vv^vv<<^>^^^>vvvvvv>^^><v>^v>>>>>v<v^>>vv>^^^<<<<>^><<<v^vv><^>v<^>><<v><>vv>^<v<^<<<><><v^<^<>^<<^>^^^v^vv<v>^^><><>vv>>v<<><>vv^^^>>>^>>>v>>vvv^<^^^<v^>vv>>^>>v^>v<v<>^vv^v>>^<v><vv^>>^<v>^><>><><<v<^v<v^<v><v>^<><><v^v>^<>v^><^^<^vv<v^v^^v><>vv<>v<^^v<<^<v^>^<^<>v^>vvv<<^v<>v^><^<>v^<>^<v<<<<v^>vvv>^v^<^^^^>^v<v^>^v>v>><v^v<><><<<v^<<<v^<>^>><><vv<>v>^vv<vv<^>>><v^vv>^vvv>^^<^v^<>v><vv<v^^v<>v>^v>>^v><vv^v<>><<<<>>v>^<vv>v^<<>><<^><><^v>><<^>v<v<^^vv<<>>v^<^>vv^^<^^>^><^><<v>v>^>>><v>^<>^<v>v^>^^<><v<^<^^^^><>><vv<>^><<<>>v<<v<<v^^v<<<^>vv><<>>>^<<v<<v^<v^<v<^<^^>>v<<<<>vv>^^^><<vv<^^v>^<^v^vv>>^^v>^>^>^^>^v><^><>^v^<<^<v<>vv<<v>v<>^<<^^^<<<v<>>^>^v><>v<^<<<<^>>^<<v<<>^^^^v<vvvvv<<^<<^>>v^<^v^><<^^>
<^v^^<<>vvv^<^v<<><v<v^^^v^^>>v^^^^<v<>vv<^^vv>^^<v><<v^^^v^^v^<<>>v^^<<^v^<<^<<>><^>>^^>><^><^>vvvv<^>>>>v<v^^<v<<<vv^><v^^v><<>>vvvvv^v><>>^<^<^vv><v<^vvvv<<v<v^<<^v<^<v^v^><<>vvvv<^>^<^><^v^vv^v<^^>>vvv^v><>^>v^<v<^^<<v<<><^><^>^v^v^<^>>vv<^vv^><v>v>>><v<<>^<^^>^>>^<>^v<>^^v^^>>^^^^><>>^>>vv>^<^^<v<v<^<^^<<<^<^^><v^<>^><v>^v^<<>^^vv<v^^>v^v^^v<<<<<>^>v<<^<<vvv>>v>>v<vvvvvvv<>>v^>>>>v<v>^v^<^^><>v><vv<>v^>v^^<>vvv<v>^>^^^^<^<>^vv><^v<^>v^<v>^v^<<<^v><vv^>><^^>^><<v>>>vvvvvv>vv<>><^<^>^v><<>>v>>v><^>><<<^<v<<<<<v^v>><><^vv^vv<<<vv<<>>v>><^vvv^v>^>^v^^^vv><><^><^<<v<<^<>><>^<><vvv><^^><<<><^vv<<<>v<<^vv>^v^v<<^^^^>>^^>>>v<v>^>v<>^^<^>^>^v^v<^<v><^<v^<<<v<<^^^>>^<>v><^v>><v^>>^<v<vv<v><><<<v><^><v<v<<<<vv^<^><^^^v><v^v>v>^vv>^^v^>v<><vv^>v<v<<v>^<vvv<v^v<<<>v<>^>^>v<<v>v^vv^^^>v^<<v>>^<vv^^<^<^^v><^^vv><vv<<^>>v><><^v^vv<v^>vv><<vv<^>>v>^vv^^<>vv>v<<>v<v>^v^v^v><v><>><<^^<>>^^<v<>v<v<<v<><<><v^>v<^><v<<vv^^v>><v^<>v>>^>>>vv^><><<v<>^v><>^><^>vv^^>>v<v<<^^<<><<><>>><^>>><><v^v>v<vvv<v>v^
v>^<^<>^>>^^>^^v<^>^vv^v>v>v<^v>^<v<v^<v^v>>>^^><vv^<^<>vv<>><v^<<>>^<^^v>>>v^<<<^v^<v^<v><<^^^v>^v^<v^v<^v<vvvvv>^<^v^<<<^>^<<v>^<>><<^^<^vvv>v>^^^>><v<><<<<v^>v^^<<^^<<><>^^>^<vv>^^>^>><<vv^v^<><>^>v><^<^<^^v<>^>v><^^v<v>^<vv^<vv^>^<<<><^<>vv^<^<<v>v<<<<>><<^^^v><>v>^>^<<vv^<<><^>v<<<<vv<v>v><<v<<<>^^v>>><<<vv<<<<v>>vv>><v<>><^<>>v^>^v^v<>v<^<>v><<^<^^v>>><>^^^vvvvvv>v<>><<^v<v>><^v><>v<^v><<>v<^^<<v^^>vv^<v<^>>^^^v><<<^<^^vvv^<><<^v^v^<>^^<<<>v<^vv^^^<vv^v>^^<<v>^v^^^^^vvv<<<v^^<<<v^>>v^><^^^v<v>v^>v<vv><vvvv<>v>^vv^v<<v>v>>^v>^vvv^>>>>^>v>>^^vv>>v^v>v^^<<^<^^><^^v^<<>^vvv<^<><^<v>v^><>>vv><v<<>v^^<>vv^<><<<v<<>vv<><<<><<v<>><^>^<^<>>v<<v>vv<>vvv>>^v^v<<>^<^>^v<<^>>>^^>v^<v^v^v>^^<<v^>v<>^v^vvv<<>>>^vv<v><^<><^<<^<><<^vvv>>><v^v>><>>^<<><^<v>><vv<<^<^>v<>>^><>v<<v^><>^>^^>v<^<vv>^v<<<^<^>v^<<v<>^vv^<^^^v^<v<vv<vv<^>^v<^v>><^>vvv^^<<<^^<<<><>^vv^>^<^^^>v^v<>^>^><v>v^>>>><<>^>>>^<><vv<<^<>v>v^v<<<<<^v<^<<^v<v<>>vvvv<<<<<v<<v^^vv^>^<>v>^v^>^^>^><<v<^^><>><<^^^>vv<<^<^^<<>^<>^v>^v<v^v<<
<vv>^<v>>>>><v^^>><<v>v^><^v^><<>^^><vv^^^><^^<^<>>^<v>vvv<>v<<><<^>vv^v^^vvv>v>>v<<<><>>v<<>v^^^<v>v>>v^<^^<>vv^<>v><v><^><><<v<^^<<>v<v^<vv<^v^>^^><^>^<v^^vv><<v<<<^^>^>^v<<v>><>^v>v><<<v>^>v^<><<<>^^><><v^v^v^v<v<^vv<<v<<>^<<v>vv<^<<^>>>v<v^>^^<^<v><^v><^v<<^^>>vvvv^v>>><^>>v^^^<>>>^^>>>>>^<>v>^v>vv><^><^v<<<v^^<<^>v^^v>><v<v^><>>^>^>^^>^vv<<>>>^^^v^^v^<vv^>>vv<vv^<><>v<>^^vv>^<vv^><<><<<<><>v>v>>>>^><>>>>vv><<^^>v^><^>v^^>>v><v^>v<>^<<^>>v<^<>^<><>><<>><vv>^<<^^^>v>^>>v<^v>^vv<<><v<>v><v<vvvv>vv<v>>v>^^>>v<v<v^<v<v>><>^v^<v><>>>^<^<^><v<>v>^<^<^<^^<<^^<^^^^^v>v^>^>^<^><^vv>vv><^<><<<<><><^^^^^><^><<>v><vv^>vv<^^<^vv>><^^v<<v^>^^<v<v<<<v^^v<^^v^v<^vv<v>^^<vv<<vv<vv<v>^<>^<v^v><vv<vvvv>^<<<<<><v>v>^v^v<^^v>v>v<<>>>>v<v<<><<^<>v>><^<^^>>><^v^^v^>>^vv>>^v^v^^<>^><v<><<<^>^>^><>^>>^v^^vv^^^^^<^vv^^^^v>>^<<^^<<^<v<>^v^^vv^^v<v<^<>v^<v<^<><<>>v>vv<><^>^v<<^^^^<<^vv^v^><>^v>v><v><v<<><^<<^<<v>v><>^v>>^><vvv<>vv><<>^>^^<>vv<>vv<><v<^<<^^>vv>vv^^<^v^v><<<<v^>v^>v^^<v^^>^>^>>>^><v^^><<<>^>vv<
>><>><<^^v>v<v^><<<<^v><^^vv>^<>v^>>vvv^<^>vv<<^v<v^>v^<>^<v<v^v^<^<>>vvv<<<>v^vv^^><v><^^>^^vv^^^><v^>^>v<<vvvv>v^<<vv^><^v^^<<>^<v^<>>^vv^v^^<^^vv<v>v>^<^>>^^^v<>v^v>>^>^^^^><<<<^>>v<<><><>><^^<vv^v<>^<v<><v^<^^^v<<vvv<^^>>v>v<<v<<<<<v^>v<vv><<<vv><v^^<^<><>v^vv<^<<<^<^>>^>^<^<^vvv^v<<v<^<<<vv^>^^v^^<^^v>>v<^<>>v^^^v^>^<^v>>v^>><>vv^^<<v>>v>>v^vv^<>>^<^>^vv<^v^>v><^^^>^v<>^>>v<^<<>^vv>>>><>^<>>>^^vv>v^^^^<v<v>v^^^>>v^<>^><>v^^<v^>^>>>>^^<v>^^>v^><^>^v<v>^>>>>>v<^><v<^v^>>v<<<^^^>^>^>>^>>v^^>v<><<v<>><<><>v^><v^vv<><^v^><^v<>v^^<>^>>><v>>^><<v>^vv><<^v^vv>^<><^^vv^>><v>>v<v>^<>^v><><<^>v<^<>><^vv<v><v<>>><>v<<<^>>>^v<>><>^><>>^^<>^>^<^><v^<^^<^><>>v>>><<<^^<^<^><^>v>><^<v>><v>^>vvv>^^<>v<<v^>v>^^>v>^vv><<<^^^v^vv<v>>><<>>^v^v^^><>>>>v<v^v><v<v<<v<>>^v^^v^^^v^v^^^^>>^>v^^v>>>>>><<>v^v^>^>>^<^><^<^<>v><<<>^vv^^>^<v^<v^<><v<^<v<<<^v<>v<>^v^<v^><^>>vvv^<^<^v<^>>^>v<^^>>v^^vv>v<<v<>vv^<<<<v>><<>^><<^v<>><>v>v^<v<<<^^v<>><><^^<^v^^^<<^^^>v^>>vv<^^v<<<<<^><^v^<v^>^^vv>v<^v<vv>v>v><^<^^v>>><^
<v^v^v<v^<>>>^v>><><>^><^v>vv<^^^>^vv<v<<>^v>^>>^>>v>^>^^^^^v<<vv>^^^<^<>^>>v^>>^>v<<>^v>^<<v^v<^^v<v>>^v<v^v>v>>^>><><vvv<^^v>^<v>>><<><v^^>^>^>^^^^^><<<>>>vv>v<^v^v^^>v>^><<vvv<^<^><^^v^^^^>^^v<^^>>^v^v^^v<><<^v<^^v^><v>>v<<^^v<<>>^v<>^<>v^>^>^>v>>^v>v^v^<><vvv<>v>v<><>v^^v>>>v<^<<v<<v^^<v>>v><^<<<<<^<<v<^<^>v^v<^^>^v>>^v>vvv>>>>^^v<v^v<>><<>vv>^<><^vv^^>>>v^<v^>^v^^v<<v^<v^<v>^v^<<^vvvv<^v^<^>^<>vv>^^>vvvvvv^>><v><^v^^<v<<^<vvv<><^>^^<^<^<vvvv<^^vv>vv^>v^><<vv<<v^v^>v<v<<v>v>v^vv^v^<^^>v^<<<>v^>^><><<^v<<>v>>^<><^<^v^^>v^^^v^<<^<>>^^>^<<<^>v<>^^^vv>^>^vv^>^vv^><<^>^v^^v^>>^v<^v<>v<>^>v^<^<v><<<v>>v>^^v<^v<^^v^>v^>v<<^^<<^^vv^>>^<^v>^>>v^^v^v^^<<v>^vvv>^<vvv^^^>><v^>>>>v^^>v<v>vv^^v<v^^><^>>v<<<v^v>^v><^>>v^^^vvvv^<^><<^^<>^>>v<vv><^vv>>><v>^<>^v^^v<^>>v<><><>>v>v<^^<vv<<v^>>vv^<<^v>^v>^^v<>>><<vv><^<v<<vv<<>><><<>vvvvvv^<^v<vv<<<v><>vv<<<>^v<^<v<v^^>>vv>^<<v^<^vv<^>v^^^>^vv><<<v^^>^<>^vv^>^<v<<^>>^>^><^>v^v<<^<v<^v>>^<<>v<^^^^>^>^^>v>v<<v>^vv<vv<^^>^<>v<v<<<^<<<v>^><>><<<>>v>^v^v>v>
>>>^vv<<^^>^>v>>>v>v>>^^><>v^><<>^<v^<^>^<><^vv^<>^<^^v>^<>^^^<><v^<^v^v>>v^v^<<<v<v<vvv^<>>^^^vv>>><<^<><<<^^^^<><v<<>>>^>^v^^^<>^>>^^>v>v>^<>><^^^<^^>v^v<^<>>><<v^vv^>^<>v^^<v^v^^^^><vv^<v<^<>v^><>vv<v>v<>^^><v>^^v^v^v><>>v>v<^>^><v<>^>>^v>>>>>v^^v>^>>v<<^vvv<^v>^^v<^>v>^v><<vv><v<<<^>^<>^v<v^<vvvv^^^^^^v>v<>>^v^^^^^^<^v^>^^^><><<<<v^^>v^^^<>>vvv<<<>v<>^^v<^<<>^^>^^v^<><^^<<v<>vv^>>^>>^>v^>>><v^vv<^^><>v>><<^<<v<>>^v^><^>v>>v^v<>>><v^>>v<><^>^^v><^^<>>>v<v<><>^^<>^><^>><v<<v<<v>^v<>^vv^>^<<><>>^v<>v<v^<>>v^v><^^<>^>v<>>><^>vv<^>vv<v^^<<^v^<v^v>^><v^^v><^v^<<<>^>v>><>v^v<^<>v<^^><>v><v>vv<v<<v<v^>v^<vv^>v^vv<><>^>^v^^<v<v<^v^<^<<^v^<><vv><>v>v^^<<>vv>><v><<vv<<^^>^<^^<>^^><>>v>>v<v<^>^<<<v<^<vv^<<vv^v<>v^><^><v^<vvv><vvvv<>>><v>>><<^v<^vv>v^<v>^<<<<^^>^>vv>^>>^<vv><>>^<v<vv^><<<<<^v<<^v^^v<^<^vv>^><^<<^><^^>><<>v<>v>^>v>>^<v^>v<<<>v<>>v<v<^><^^^^v<v><>v^v<<v>><^<><^<>^>^^>>>><>^<<>>^<v><>><^^<^^<<vvv^<<<<v>>^^v<<>^v>^<^^>v^vv>vv>><^<^>^^<<>>>v<<<>^>>^v<>^>v><vv^^v^<^>^<v>v><>^v^><<v^<
^>v>>>>>vv^^>^^^v>^^v<>v>v><^^v><><v<>v>><<v>>^>^>^^>><^>^>v><v>>v^>^>>>>v>^v>>^<<^<<>>><>><^^^>^v<v>>^>>>>vv>^><>>vv^<<<>^>^^><v><>^><<<<^v>>><v>v^<v^^>>vv<>>^v^<v^vv>v^<vv<>^>^<><>^<^<>v>>vv^v<^v^>v<>>v>><v^>^^>^^^v<><^>><vv^<<^>^^^^^>>^<<^v^^<>><^>^v<<^^>v<>^<^vvv<^^vv^v>vv>v>v<>v>^<v>>^vv<^>>^<><^^<>v^><^v<^^<^v>vv^v^>^^v><v^^v<^<v<^^^<>v^<><v<<<><^vv><^vvvv>v>>>^v>^<>^^^v^^>v^>v>>vv<<v<^v^v<vv><^^>><^v^>^>^<^><v^v>^^>^v^v<>>vv<vvv>><>^v>vvv><v<<>>vv<>>v>^<>vv>^v^^>>>>>><<v^^><><v^>><^>v>^^vv<<v<^<><>^v^>^<v>^vv^<^v^^>v^<vv^<v><>^>><>><vv^<v>>v^<>^>^v^v<>v>v<v^<^vv><<^v>>><>>^<^>>v^v^v^<^^<<^v<^<>^^>>^^vv<<<>^vvv<v^^<<v<>^^^<vvv<vv>vv>v<v><v^<<<vvv^<v^><>>v^>vv><<>>v^vv><^^>v^>v>v<^vvv<^v^>>>>>^>>>><v>><vv><v>^>>^v><^v^>><v><<^>>><>>vv<^>>^v^<>>^<<^<<v^<^<vv>vv<<vvvvv><^^<^>>v>vvv>^v>^<<v<^>^>>^>v<<vv<^<^>vv>>vvv^>v>><^>v^v>^vvv^v>><<<v^^^>^><>^><<^<^<><v^<v^>v^^<v^v>v>v^v<>><v<vv>^^<<><>v>v<<^>><v^<vvvvv<^>><v><vv><<<>^v^vv<>^<><<^^v<>><>>^<<>v<<<v^<>>v^>v<><^^v^<^v<v^v^<><<>^v>v>
^<vv><>^>vv^>vv^><^<<>^v<<v^v>v^^^v<>>v>>>><<<<v^<<v<^>^>v>v^>><<<v<<>^><v^<<<vv^<^^><><^^>^^><v<^v>^^v^>^<>vv<<<>>>^v^v>>v<^^>v^vv><^v>v><v^v<><^><^^v><^^>^>>^^>>^<<^^>v^<<<^<vvv^^vvv<>v^v^v>>>^><v>^<v^>^v>^v>v<><v^^<<^v^^<v<<<>>^<>^^^>>^^>vvv><>>^<><<<<v>v^^<^<<>v^v<^^><<^^<>^>v^<<<v>>>^>>^^>^<<<>vv^>^v<vv^<vv^<>vv<^>v^v^v>>^^^v<^>>v<>><>v><v<v>^v>^v<>^^<>>vvv><<<^^<>>v<<^v^<>^^v^^>^vv>^v^<<vvv^<<<>>^vv^^^v<<^^vv>^^v><^^^<v><<^^v>^<^<^^>v^v<^>v>><v>><>><v>>><^><vvv<v^v>v<v>^^v^^^v^^v>vv>^<><>^^<<^<vv><><v^<^<vvv^^<vv>^>vvv<v>>>>>>^>>>>><><<v^^^<^^^>><v^^>>^<^^<>vvvv><>^vv<><>><<>>v^<><>v^>>^<^>v<^><v^<>^>>v><<>><>>^^vvv><>vv>>^>^>>>v^^<<<>>v^v>^^v<>^v^<vvv><<<^^v<>>>>^v<v>^>^^v^v<>v>^v<><>v<v<>>vv<>^^^>^<v<vvv>^v<>^v^<<>v<<^v^^v><^>v>>>>v>^<<vvv><<^<v<<v^v^vv^v<<>><^v^v>>>v>^^^^v^^>^v^<<<^vv^<v<^v^>><^>v<<v><><>><vvvv<<vv^^<v<^v>^<>><v><v^>v<^v^v^^v^>^vvv^^<v<>>v^^vv<v^>><^<^>^<><<^<>>vv><>^><^v<<<<^^^v>><^>>^>><>v<>^v<vv^^><<><<v>v>^><vvv><vv><^>v>><vv>v<<<>>>>v<>vv><v<^<v<>>vvv^<vv
<<^<<<^>^>>^^^>><^<^^<>v^>^<^vv<^<>vv<><><v^<>^>vvv^<<<v>^<><^<>><v<>^>^v^>v^^<<<<>^<<^v^<>vv^^v<>>v^<>^v^^^<^v^vvvv>vvvvv<^^^^v><>>^>^v^vv>>>^^<><^<>^v<<<>v<^v^v>><>><><>vv^>v^^^<v<v>^<^v^<>^<v<>vv>^^<^v><v<^<v>v<^^^>^><vv^<<v><<^>>v^^>><>v^vv><^<<><^><<^v><><v^<><v<>v>v>^>v<vvv>>>v<<><^^>^v<v>^<><>^>vv<<^>v>v^>v><^<v<<<<^^v>^v>^>>v^<v^<<<^<<^^^>^v<<v<^vv>>^><<>>><<<v>>>vv>>v><v>v>^^>>^>><>v>>^v<>>><><<<<>^>^>v<^<v>>v<v>v^<^<><<^<>>^^<^^v^vvv>>^v>v<^^>^v><<^v>^^^^^<v<>>v<v^^><^vvv^<>v>>^^>v^^v>v^^<<>vv^v>^^v<vvvv<>vvv>>vv>v>>^>>^^>v<>v^<<^>v^^><>v<><^>>^^v>^<^<>^<<v><>^^^^^v^>^<^^vv^v>>>>vvv^>v>vv^^^vv><v>vv<^^>v<>^v>>^^^v>^^^<>>v<^>^<<^>^>><>><^<>^^^vv^<^<^<<^>^<>><^vv<^<<><<<><^<>><^v^>>^v<^^><>v<^^^v^^>>^^vv>^<<vv>>>v>>>v^vvv>^^v^^>^>^^<>>>^<><>^^>^^v>^><^><v<>^>>^>>^<^>^<^<^vv>^>v><v^^>^>v<>>vv><<>><<><<>v<>>v><v>^v<^<<><^v<^^^><>v>>vv<^<<<^v^<vvvv^v<^<>^^^^vvv^<^^<>v<^^^>><^<v^><v^v<<^^><>^^^>^>^vv^^>>v>>^vv<<<v^v<vv><>vv^><<^v<v>^<v<>^^^<v<v^v<^>v^vv>v^vv><vv^v>>^^vvvvv>^<^vv><^
>^<v^v>v>>vv^^>v>^^^^<>v><<vv><<^^v<><<v^^^^>vv>>^>v^v<<^>vvv<<^v<>v><>^v<^vv>>^^>>v<>v>^^^<v<^>>><<^v^^<v^vv<<<^^>>>vv<vv<v>><>^>^<v<<><<vv<vv>vvv><v>^<vv<><^v><>v>^^v>v<vv><v^^v^<^<v<>vv>><<<><<^v><>^>^v>v^^>vv>vv<>v<<^<v^^^>^>>^^v<^^^><v><<v^<>><><vvvv^v^^v^^<^v^>><^>v^><^^<>v<^v<<>>><^<<<^^<^v>v^^<><v<^^<>vvv^><v^v<<><v><v>^<^<^<v<^><<<>>vv<^<vv<<v>vv^^<v^^<<>v^vvv><>v>>^<^v<v><<v<<v<^^vvv>>^<^<^>>^vv>^<>^^<^>v<v>^>v^><><>vv<<>v<^^<>^^><^^^v^vv><v^^^^><^>vv<^><^^v^>>>vv^^>>v>^vv<<<<v^<v^>>>vv^v>^><><>>>^^vv^v^>v<^v>^<<^>>vvvv<<v<^v<^<>^<^>><>>^>^>^>^<<v>v^>>v>^<v>^vv<^><^^v^<<><^v^^^>v^<<>v<vv<vv>v>><>v<^<v^>v<^v>^<<vv^>vvv<><<<^<>>v>^vv<^v>^v><>^<v^v<vvvv^<<^v^v<<^^v^^^>^<v^><^^<>^^<vvv^^^^>><^>>v<>^>v>^v^v^<^^^v<vv<v<><vv<<<vv>v>^><<>vv<<>v>^vv<><^<^^^>^>v^v>^v^<v>^v>^^<^^<>>^<>>><><<<^<<<vvv>^<^<<<^vvv^v<<>><v^v<>^>>^v<^v^v^vvv<v<><v>^<^v<<<^<>>^^>^>>^^>^>v^^<<vv<vv>><^vvv^<<<v>^<><v><<v><<^^<<>><<v^vvv>vv><>><<^<v><<^>>^^vv<vvvv>^>>>>vv<^<<<>v<<<>>>>vv>^^^>^<>>^^<v>v><><^><^>>>
v><vv^><>>v<v^>^^vv<vv^^<vvvv^^^v^^^vv^><>>^^vv^>v^<>vvv>vv<>^v>>v<^<>>^v><^<<v<v>>v>v^<<>^<v>v>^^><^^>>vv<v>^v^<><^<>v<^><^v>vv<^vv^<<vv<<<<v<>v<>v^v^>>^>^<^>>^v<^v<v^<<<<>vv>><>vv>^<vvvv<<<<<^<^v<>v<^v<^><^^^>v^^>>><<<>><<v<<>>^vv^<>^<><v<^<v>^^v^^<<>^<^><v>v^^>v<v^vvv>v<<><<^<<<v<<^^><<v<>v<^v^<>v<>vvv<^^vv><<>><>v><>>^>>v<^vv^v<<^v^^>v>v><v^v>vv^^v>><<<^vvvv>^^^<v<<<<>^<<<><^<^>^v^<^v<<vv<<v<<>^<v^^>v^^><^<<^<v>^>v^vv<><^>^vv^v<<<>^vvv<<>>^vv^vvv<vv<^<^v>^^>><>v^^<^v^^^>^>v^<><><>>><v>^v>v^<>>>vv<><^>v>^v<<<^>v^<>><^v<>^><^^v><v^<vv><^^><>^^>vv^vv<<^<v^v<<v<>^v<^<v>^><>v^>v^<^^<^v>^^^>v^vv>^>v^<^^><^<<<>v>^><^>>vvv^^>>>>^>^<^><>^^v<<><v>v^>^<v^>^^<><vv>><>vv^^^v>>v^^v<v<v^<<><^v<<^^<<>v>v>>v<><>^>^^<v>^>vvv<><<>><<v<<<^>^<^v<<<^<>^^>>v^><v<<<<><<>>^^^^^^vvv<><<v<vvv>^^>^v>>>^^>>>^<<<>^vv<^><<<<>^v^>>>v<>>v>><<^<vv><^^<><><v><>^^<vv^<<vvvvvv>vv^^v^v<>>^v<<^v^^>^vv^v>vv<><vv^<v^^>v^^<<<>>vvv^><>v^<v>^<^><><>>v>^><v><^<^^>v>vv<^v^^>^>^v^^>v<vv>v><v^v>>>>vvv^^v^>v>>^^<<<v><<v>v>v<<>^^v

View File

@@ -1,141 +0,0 @@
#############################################################################################################################################
#.#...................#.........#...............#...#...........#...........#.....#.............#...............................#.#........E#
#.#.#.###############.###.#####.###.###.#######.#.#.#####.#####.#######.#.#.#.###.#############.#.#####.#.#####.#####.#.#######.#.#.#.#######
#...#.........#...#...#...#...#...#.#...#...#...#.#.....#.#...#...#.......#.#...#...#.........#.....#.#...#.....#...#.#...#.#...#...#...#...#
#.###########.###.#.###.###.#####.###.###.#.#.###.###.#.#.#.#####.#.###.###.###.###.#.#######.#####.#.#####.#######.#.###.#.#.#########.#.#.#
#...#.#.....#...#...#...#.#...........#...#.#.#...#.......#.....#.#.#.......#...#.....#.#...#...#.#...#...#.......#.#...#.#...#...#...#.#.#.#
###.#.#.#.#####.#.#####.#.#.#########.#.###.#.###.#.#.#####.#.###.#.#######.#.#########.#.#.###.#.###.#.#.#######.#.###.#.#.###.#.#.#.#.#.#.#
#.#.#.#.#.......................#.....#...#.#.#...#.#...#.#.#.....#.#.....#...#...#.......#.....#.....#.#...............#.#...#.#.#.#...#.#.#
#.#.#.#.#.#.#.#.###.#.###.###.#.###.#.###.#.#.#.###.#.#.#.#.#######.#.###.#####.#.#####.###########.#####.#.#####.###.#.#.###.#.#.#.#####.#.#
#.#.#...#...#.#...#...#...#...#...#.#.....#.#.#...#.#...............#.#.#.......#.....#.#.#.......#.......#.#.....#...#.#...#...#.#.......#.#
#.#.#########.###.#####.###.#####.###.#####.#.###.#.#.#.#####.#.###.#.#.#############.#.#.#.###.#.###########.#####.#.#.#.#.#####.#######.#.#
#.#.......#.....#...#...#...#...#.....#.#...#...#.#.#.#.....#.#...#.#...#...#.......#.#.#...#...#.............#.....#.#.#.#.#...#...#...#.#.#
#.#######.#.###.###.###.#.#####.#####.#.#.#####.#.###.#####.#.###.#####.#.#.#.#####.#.#.#####.#.#####.#########.#######.###.#.#.###.#.#.###.#
#.....#.#...#.#...#...#.#.#.......#.....#.#.#...#...............................#...............#...#.#...#.....#.......#...#.#.....#.#.....#
#.#.#.#.#####.###.###.###.###.###.#.#.###.#.#.#######.###.#.###.#.#.#.###.#.#####.###.#####.#.###.#.###.#.#.#.###.###.###.#######.###.#####.#
#.#.#...........#...#.....#...#.....#.....#...#.............#.#.#...#.#.....#...#.#...#.......#...#.....#.#.#.#...#...#...#.....#.....#...#.#
###.#############.#.#######.#.#####.#.#######.#.#############.#.#.###.#.#####.#.#.#.###########.#########.#.###.###.#.###.#.###.#######.###.#
#...#.......#.....#.#.......#.#...#.#.......#.#.#.......#.....#...#...#.......#.#.#.#.....#.....#.........#.#...#...#...#.....#...#.....#...#
#.###.#####.#.#.###.#.###.#####.#.#########.#.#.###.#.###.#.#.###.#############.#.#.#.#.#.#.#####.#########.#.#####.###.#.#######.#.#####.###
#...#...#.#...#.......#...#.....#.#...#.....#.#...#.#.#...#.......#...........#.#.#...#...#.....#.#.........#...#...#.#.#.#.....#.#.........#
#.#.###.#.###############.#.#####.#.#.#.#####.###.###.#.###########.###.#####.#.#.#####.#.#####.#.#######.#.###.#.###.#.#.#.###.#.#.###.#.#.#
#.#...#...........#.....#.#.#...#.#.#...#...#...#...#.#.#.....#...#.#.#.#.....#.....#...#.#.#...#...#...#.....#...#.#...#.#.#.#...#.#...#.#.#
#.#.#.#.#######.###.###.###.#.#.#.#.#####.#####.#.#.#.#.#.###.###.#.#.#.#####.#####.#.###.#.#.#####.#.#.#####.#####.#.#####.#.#####.#.###.#.#
#.#.#.........#.#...#.#.....#.....#...#.#.......#.#.#.#.#...#...#.#...#.....#.#.....#.#...#.#.#...#.....#.......#...#.#.....#...#...#.....#.#
#.#.#.#########.#.###.#######.#######.#.#.#.#######.#.#.#.#.###.#.#.#.#####.###.#####.#.###.#.#.#.#####.#.#####.###.#.#.#######.#.#########.#
#.#...#.........#.#...#.....#.........#.#...#.......#.#...#...#.#...#.#...#.....#...#.#.#...#.#.#...#...#.#.........#...#.......#...#.....#.#
#.###.#.###.#####.#.#.#.#.#####.#.#####.###.#.#######.#####.#.#.#.###.#.#########.#.#.#.###.#.#.#####.###.#########.#######.#######.###.#.#.#
#...#...#...#...#.#.#.#.#...#...#.#.#.....#.#.#...........#.#...#.#...#.....#...#.#.#.#.....#.#...#.....#...#.....#.#.......#.....#...#.#...#
###.#.###.#.#.#.#.###.#.###.#.###.#.#.#.###.#.###.#.#####.#.#####.#.###.#.#.#.#.#.###.#####.#.###.#.###.#.#.#.###.#.###.###.#.###.###.#.###.#
#...#.....#...#.#...#.......#.....#...#.#.....#...#.#...#.#.#...#.#...#.#.#...#.#...#.....#.#.#.....#.....#...#...#...#.#...#.............#.#
#.###.#####.###.###.#.#.###.#.#######.#.#.#####.#.###.#.#.#.#.#.#.###.#.#.#####.###.#####.#.#.#.###.#.#.#######.#####.#.#.#####.#.#.###.#.#.#
#...#.....#...#.#...#...#...#.#.......#...#...#.#.#...#.#.#...#.....#.#.#.#.#...#...#...#.#.#.#...#.#.........#.#...#...#.#.#...#...#...#...#
###.#.###.#.#.###.#######.###.#.#####.#####.#.#.###.###.###.#.#####.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#########.#.#.#.#####.#.#.#######.#.###.#
#.#.......#.#.....#.....#.#...#.....#.......#.#...#.#.#.......#.....#.....#.#...#.#...#.#.#.#.#.#.#...#.#...#.#...#.........#.....#...#.....#
#.###.#.###.#####.#.###.#.#.###.###.#########.#.#.#.#.#########.###########.###.#.#####.#.#.#.#.#.#.#.#.#.#.#.#######.#####.#####.###.#.#.#.#
#.......#...#...#.#.#.#.#.#.#.#...#.....#.....#.#.#.#.......#.......#...........#.....#.#.#.#.#.#.#...#.#.#...#...#...#...#.....#...#.......#
#.#.#.#.#.#.#.#.###.#.#.#.#.#.###.#.###.#.#######.#.#.#.###.#########.#########.#####.###.#.#.###.#.###.#.#######.#.###.#.#####.###.###.###.#
#...#.#.#.....#.#...#.#.#.....#...#.#...#.#.#.........#.#.#.......#...#.......#.....#.#...#.#.....#...#...#.......#...#.#.........#.........#
#.###.#.###.#.#.#.###.#.#.###.#.#####.#.#.#.#.#.#####.#.#.#.#.###.#.###.#####.#####.#.#.#######.#####.#.#.###.###.###.#.#####.###.#####.###.#
#.#...#.#.....#...#...#.#.....#.#.....#.#.#...#.#.....#...#...#.#...#.#...#.#...#.....#.#.....#.......#.......#.....#.......#.#.......#.....#
#.#.###.###.#.#####.#.#.#####.#.#.#####.#.###.#.#.#######.#####.#####.###.#.###.#####.#.#.###.#.#.###########.#####.#######.#.#########.###.#
#.#...#.....#.....#.#.#.........#.#...#.#...#.#.#.......#.#.....#...........#.#.....#.#...#.#...#.......#...#.#.......#.....#...............#
#####.###.#.#.###.###.#####.#.###.#.#.#.###.###.###.#####.#.###.#####.#.###.#.#####.#.#####.#.#######.#.#.#.###.#####.#################.#####
#.......#...#.....#.....#.#.#...#.#.#.#...#...#.....#.....#...........#...#.#.....#.#...#...#.......#.#...#.#.......#.......#.......#.......#
#.#######.#.#.#####.###.#.#.###.#.#.#####.###.#.#####.#####.#############.#.#.###.#.###.###.#.#####.#######.#.#########.#.#.#.#####.#.#.###.#
#.........#...#.....#...#.#...#...#.....#.#.#.#...#.#.#.......#.....#.....#.#...#...........#...#...#.......#...#.......#.#.#...#.#.......#.#
#.#######.###.#.#####.###.###.#######.###.#.#.###.#.#.###.###.#.###.###.#.#.###.#.#.#.#######.###.###.###.#####.#.#.#####.#.###.#.#########.#
#.......#.#.....#...#.....#.#.........#...#.#...#...#...#...#.#...#...#...#.#...#.#.#.#.....#.#...#...#...#.....#.#.#.....#...#.#.....#...#.#
#.###.#.#.#.#.#.#.#.#.###.#.#####.#.###.###.###.#######.#.#.#.#.#####.#####.###.#.#.###.###.#.#.#####.###.#.#####.###.#####.###.#.###.#.#.#.#
#.....#.#.#.#.#.#.#.....#.#...#...#.#...#.....#...........#...#.#...#.#...#...#.#.......#.#...#.#...#...#...#...#.....#...#.......#...#.#...#
#######.#.#.#.#.#.#####.#.#.#.#.#####.###.#.#############.#####.#.#.#.#.#.###.#.#.#######.#####.#.#.###.###.#.#.#########.#############.###.#
#.#.....#.....#.#.#...#.#...#.#.......#...#.#.......#...........#.#...#.#.....................#...#...#...#...#.......#.....#...#...#...#.#.#
#.#.#####.#####.#.###.#.#####.#########.#####.#####.#.###########.###.#.#########.#############.#####.###.###########.#.#.#.#.###.#.#.###.#.#
#...#...........#.#...#.#.....#.#.....#.......#...#...#...#.....#.#.#.#...#...#...#...........#...#...#.....#.......#.#.#...#.#...#...#.....#
#.###.###########.#.#.#.#.#####.#.#.###.#.#.###.#.#####.#.#.###.#.#.#.###.#.#.#.###.#########.#####.###.#####.#.#####.#.#.###.#.#############
#.....#.......#.....#.#.#...#...#.#...#.#.......#.#.....#.#.....#.#...#...#.#.#...#.#.#.....#.....#.#.........#...#.....#...#.#.....#.......#
#######.#######.#####.#.###.#.#.#.###.#.#######.#.#.#####.#.#.#.#.#####.###.#.###.#.#.#.###.#####.#.#.#.#########.#.#.#.###.#.#####.#.#####.#
#.......#...#...#...#.#...#.#.#.#...#.....#.....#.#...#.#.#.#.#...#.....#.#.#...#.#.#...#...#.....#.#.........#...#.#...#.........#.....#...#
###.#.#.#.#.#.###.#.###.#.#.###.#.#########.#####.###.#.#.###.#.###.#####.#.###.#.#.#.###.#.#.#####.#########.#.###.#.###.###.#####.#####.###
#...#.#...#.....#.#.....#.#...#...#...#.....#...#.#...#.......#.#...#.....#.#.#.#.#.#.#...#.#.#.......#...#...#...#...#.#.#...#...#...#...#.#
#.###.#########.#.#######.###.#####.#.#.#####.#.#.#.#############.###.#.#.#.#.#.###.###.###.#.#.#####.#.###.#####.#####.#.###.#.#.###.#.###.#
#.....#.#...#...#.....#.....#.......#...#.....#.....#.............#.....#.#.#...#...#...#...#.#...#.#.#.....#...#.#...#...#...#.#...#.#...#.#
#.#####.#.#.#####.###.#.###.#############.#.###.###.#.#############.#.#.###.#.###.###.#####.#.###.#.#.#.#####.###.#.#.#.###.#.#.###.#.#.#.#.#
#.......#.#.....#...#.#.....#.....#.....#.#.#...#...#...#...............#...#.....#.........#.#.....#.#.......#...#.#...#...#.#.#.#.#...#.#.#
#########.#####.###.#.###.#####.#.###.#.#.#.#.###.#.###.###.###.#######.#.#########.#######.#.###.###.#######.#.###.#####.###.#.#.#.#.###.#.#
#.....#...#.....#...#...#...#...#.....#.#.#.#...#.....#.....#.#.....#...#...#.#.......#.....#.......#.....#...........#...#...#.#.#.#.#...#.#
#.###.#.#.#####.#.#.###.###.#.#.#####.###.#.#.#.#####.#######.#####.#.#####.#.#.#####.#.###########.#####.###########.###.#.###.#.#.###.###.#
#.#.....#.#...#...#...#.......#.#.....#...#.#.#.....#.#.......#.....#.#...#.#.........#...........#.....#...........#.#...#...#.#.......#...#
#.#######.#.#.#######.#.#####.###.#.###.###.###.#.###.###.###.#.#####.#.#.#.###.#####.#####.###########.#######.###.#.#.#.###.#.#########.#.#
#...#.#...#.#.#.....#.#...#...#...#...#...#.....#.........#...#.#.....#.#...#...#.....#.....#.........#.....#...#...#.#.#.#...#.....#...#.#.#
###.#.#.###.#.#.###.#.###.###.#.#####.#.#.#.#######.#####.#####.#.#.###.###.#.#.#######.#####.#####.#######.#.#.#.###.#.#.#.#######.###.#.#.#
#...#...#...#.#...#.#...#...#.#.....#.#...#...#...#.#...#.#.....#.#...#.#.#...#.......#...#...#...#.......#...#...#.#...#...#...#...#...#.#.#
#.###.###.###.###.#.###.###.#.#####.#.#.###.###.#.###.#.###.#########.###.#.#.#######.###.#.###.#####.#.#.#########.#.#######.#.#.###.###.#.#
#...#.#...#.#...#.#...#.#...#.#.#...#.#.#...#...#...........#.........#.....#...#.........#.#.......#...#.........#.#.#.......#.............#
###.#.#.###.###.###.###.#.###.#.#.###.#.###.#.###############.###.#####.#######.#.#####.#.#.#####.#.#.#.#.#######.#.#.#.###########.###.###.#
#...#.#...........#.....#.#.....#...#...#...#.....#.....#...........#...#...#...#.....#.#.#.....#.#.#.#.#.#...#...#...#...........#...#...#.#
#.#####.#.###.###.#.#####.#####.###.#####.#.#.#.#.###.#.#####.#####.#.###.#.#.#######.#.#######.#.#.#.#.###.#.###.###.###.#######.#.#.###.#.#
#...#...#...#.#...#.#...........#.#.#.....#.#...#.#...#.....#.#...#...#...#.#.#.....#.#.......#.#.#.#.#.....#...#...#.....................#.#
###.#.###.###.#.###.#####.###.#.#.#.#####.#####.#.#.#######.###.#.#.###.###.#.#####.#.#######.#.#.#.#.#########.###.#######.#.#.###.#######.#
#...#.#.#.#.......#.....#.........#.....#.......#...#.....#.....#.#.#...#.#...#.....#.#.....#...#.#.........#...#...#.....#.#.#...#.....#...#
#.###.#.#.#.#####.#####.#.#######.#####.#.#.###.#####.#.#.#######.###.###.#####.###.#.#.#.#.###.#.#####.#####.###.###.###.#.#.###.#.#.###.###
#.#...#...#.#...#.#.....#.#.#.........#.#.#.#...#.....#.#...#...#.....#.......#...#.#...#.#...#...#.....#...#.#.......#.#.#...#...#.#...#...#
#.#.#######.#.#.#.#####.#.#.#.#########.#.#.#####.#####.#####.#.#######.#####.#.#.#######.###.###.#######.#.#.#.#######.#.#####.#####.#.#.#.#
#...#.......#.#.#.#...#...#.....#.......#.#.........#.#.....#.#.......#.#...#...#.#.........#.#...#.....#.#...#.........#.......#.....#.....#
#.###.#.#####.#.#.#.#.###.#####.#.#.#.###.#########.#.#.#.#.#.#.#####.#.#.#.###.#.#.#######.#.#####.###.#.#####.#.###############.###.#.#.###
#.#...#.#...#.#.#...#.#...#...#...#.......#.......#...#...#.#.#.#...#...#.#.....#.......#.#.#...#...#.#.#.#.#...#.............#.......#.#...#
#.#.#.#.#.#.#.#.#.###.#.###.#.#.#########.#.#####.#######.#.#.#.#.#.#######.#.#########.#.#.###.#.###.#.#.#.#.#########.#######.#####.#.#.#.#
#.#.#.#.#.#.#.#...#...#.#.#.#...#.......#.#.#...#.#.....#.#.#.#.#.#.........#.......#.....#...#...#...#...#...#.......#...........#...#.#.#.#
#.###.#.#.#.#.###.#.###.#.#.#####.#.###.#.#.#.###.#.###.###.#.#.#.#####.#.###.#####.#.#####.#.#####.#.#########.#####.###.#########.#.###.#.#
#.....#.#.#...#.....#.#.#.#.#...#.#.#...#.#.#.....#.#.....#...#.#.....#.#.#.........#.#...#.#.........#.....#...#...#...#.#.#...#...#.....#.#
#######.#.###########.#.#.#.#.###.#.#.#####.#.#####.#####.#####.#######.#.#.###########.#.#####.#####.###.#.#.#####.###.#.#.#.#.#.###.#.#.#.#
#...#...#.......#.....#...#.#.....#.#.#.....#.....#...#.....#...#.......#.#.#...#.......#.......#...#.#...#...#.....#.#.#.#.#.#...#.....#...#
#.#.#.#########.###.#.###.#.#####.#.#.###.#######.#.#.###.#.#.###.#########.#.###.#.#.#############.#.#.#.#######.#.#.#.#.#.#.#####.#.#.#.#.#
#.#.#.....#...#...#.#...#.#.....#.#.#.....#.......#.#.....#...#.#.......#...#.....#.#.....#.#.......#...#...#.....#.#.#.#...#.....#.#.#...#.#
#.#.#####.###.###.#.#.###.#####.###.#########.###########.#####.#.#####.#.#####.###.#.###.#.#.###.#########.#.#.###.#.#.###.#####.#.#.#.#.#.#
#.#.....#.........#.#...#.....#...#.........#.#...........#.....#.#.#...#.#...#.#.#.#.#.....#...#...........#.#.#.#...#.#.#.#...#.....#...#.#
#.#####.#####.#.#######.#####.###.#.#######.#.#.###.###########.#.#.#.###.#.#.#.#.#.#.#####.###.#####.#######.#.#.#.###.#.#.#.#.###.#.#.#.#.#
#.#...#.....#.#.#.......#.....#...#.....#.#.#.#.#...#.#.......#.....#...#...#.....#.#...#.#.#.#.#...#...#.....#.#...#...#...#.#.#...#.....#.#
#.#.#.#####.#.#.###.#####.#####.#######.#.#.#.###.###.#.###.#.#####.###.#####.#####.#.#.#.#.#.#.#.#.###.#.#####.#####.###.###.#.#.#.#.#.###.#
#.#.#.....#.#.#...#.......#...#...#.....#.#.#.....#...#...#.#.......#.......#...#...#.#.#.....#...#...#.#...#...#...#.#.........#.#.........#
#.#####.#.#.#.###.#########.#.###.#.#.###.#.#######.#.###.#.#######.#.###.#.###.#.###.#.#########.#####.#.###.###.#.#.###########.#.#.#.#.###
#...#...#.#.#.#.#...#.....#.#...#...#.....#.#.......#.#...#...#.......#...#...#.#...#.#.#...#.....#.....#.#...#...#.#...........#.#...#.....#
###.#.#####.#.#.###.#.###.#.###.###.#####.#.###.###.###.#####.#########.#####.#.###.#.#.#.#.#.#####.###.#.#.###.###.###########.#.#########.#
#...#.......#.....#...#.#...#.#...#.#.....#...#...#.....#...#.#.......#.#.....#.......#.....#.#...#.#...#.#...#.#.#.....#.....#.#...........#
#.#####.#########.#####.#####.###.#.#########.###.#.#####.###.#.#####.#.#.#.#.#########.#.#.#.#.###.###.#.###.#.#.#####.#.#.###.#.#.###.#.###
#.....#.....#...#...#.........#...#...........#.#.....#.....#...#.....#.#.#.............#.#...#...#...#.#.#.#.#.......#.#.#.....#...#...#.#.#
#.###.#.#.###.#.###.#.#.###.#.#.###.#.#########.#####.#.###.#####.#####.#.#.#############.#######.###.#.#.#.#.###.#####.#.#########.#.###.#.#
#.#...#...#...#.....#.#...#...#.#...#...#.........#...#...#.....#.......#.#.#.....#.....#...#.....#.#.....#.#...#.#.....#.........#...#.#.#.#
#.#.###.###.#############.#.#.#.#.#####.#.#.#####.#.###########.###.#####.###.###.#.###.###.###.#.#.#.###.#.###.#.#.###.#########.###.#.#.#.#
#.#.......#...#...........#...#.#.......#.#...#...#.#.........#.........#...#...#.#...#.....#...#...#.#...#...#...#.#.......#.....#...#.....#
#.#####.#.###.#.#######.###.#.#.#######.#.###.###.#.#.#######.#.#######.#.#.#.#.#.###.#######.#####.#.#.###.#.#####.#######.#.#####.###.###.#
#.#.....#...#.......#...#...#.#.....#...#.........#.#.#.....#.#.......#.#...#...#.#...#...#.......#.#.#.#.......#.........#.#...#...#.....#.#
#.#.###.###.#####.#.#.###.#.#.#####.#.#.###.###.###.#.#.###.#.#.#####.#.#.#####.#.#.#####.#.#####.#.#.#.###.###.#.#######.#.###.#.###.#.#.###
#.#.#.#...#.......#.#.#...#.#.......#.#...#.#.#.....#.#...#...#.....#.#.#...#...#.#.#...#.....#.#.#.#.#.....#.#.#.......#.#.#.#.#.#.....#...#
#.#.#.#.#.###.###.###.#.###.###.#.#.#.###.#.#.###.###.###.###.#####.#.#####.#.###.#.#.#.#####.#.#.#.#.#######.#.#####.#.#.#.#.#.#.#.###.#.#.#
#.#...#.....#.#...#...#.#.#.#.#.#.#.#.#.#...#.....#...#.#.....#.....#.....#...#.#...#.#.....#...#.#...........#.......#.#.#...#.#.#.#.#.....#
#.#####.#.###.#####.#.#.#.#.#.#.#.#.#.#.#####.###.#.###.#####.#####.#####.#####.#####.#####.#####.#.###########.#######.#.###.#.#.#.#.#.#.#.#
#.#.....#.#...#...#...#.#.#.#...#.#.#...#.....#...#.#.....#.#.....#.....#...#.........#...#...#...#.......#.........#...#.#...#.#.....#.#.#.#
#.#.#####.#.###.#.#.#.#.#.#.###.#.#####.###.###.###.###.#.#.###.#.#.#####.#.#.#.#####.#.#.###.#.#.#######.#.#.#.#####.###.###.#.#######.#.#.#
#...#.....#.....#...#...#.....#.#.#...#.....#.#.....#...#.#.#.....#.#...#.#...#.........#...#.#.#...#...#...#.#.#...#...#...#.#.#.......#...#
#######.###########.#.#######.###.#.#.#######.#######.###.#.#.#######.#.#.#.###.#.###########.#.###.#.#.#####.###.#.###.###.#.#.#.#####.#.###
#.....#.......#...#.#...#...#.....#.#...........#.....#.....#.........#...#.....#.........#...#...#.#.#.....#.....#.........#.#.#.#...#.....#
#.###.#####.#.#.#.#.###.#.#.#####.#.#.#######.#.#.###.#.###.#############.###############.#.###.#.#.#####.#.#############.#.###.#.#.#.#.#.#.#
#...#.#.....#.#.#.#...#...#.#.....#.#...............#.#.............#.....................#...#.#.....#...#.........#...#.#.#...#...#...#.#.#
#.#.#.#.#.#.#.#.#.#######.#.#######.###############.#.#.###########.#######.#.###########.###.#.#.###.#.#.#####.###.###.#.###.###.#####.#.#.#
#.#.#.#.#.....#.#...........#.......#.#.....#.....#.#.#.......#...........#.#.#.....#.......#.#.#.#...#.#...#...#.......#.#...#...........#.#
###.#.#.###.###.###.#.#######.#######.#.###.#.###.###.#.#.#.#.###.#######.#.#.#.###.#######.#.#.#.#.###.###.#.#.#.#######.#.###.#####.#####.#
#...#.#.#.......#...#.........#.......#.#...#...#...#...#.#.#...#.#...#...#.#.#...#.......#...................#.#.#.......#...#.#...#.#...#.#
#.###.###.#.###.#####.###########.#.###.#.###.#.###.###.#.#.###.###.#.#.###.#####.#######.###.###.#.#####.#####.#.#.#####.#.#.###.#.###.#.#.#
#...#...#.....#.#.....#.........#.#.#...#.#...#...#.......#...#.....#.#...#.....#.....#.#...#...#.#...#...........#.....#.#.#...#.#.....#.#.#
#.#.###.#.#.#.###.###.#.#######.#.###.###.#.#####.#####.#####.#######.###.###.#.#####.#.###.###.#.#.#.#############.###.#.#.###.#.#######.#.#
#.#...#.#...#...#.#.#.........#.#.#...#...#.#.....#...#.#.....#...#...#...#...#...#...#...#.#...#...#.#...........#.#...#.....#.#.#.........#
#.###.#.###.###.#.#.#.#####.#.#.#.#.###.#####.#####.#.###.#####.#.#.###.###.###.#.#.###.#.#.#.#####.#.#.#########.###.###.#.###.#.###########
#...#.#.#.......#.#.#...#...#.#.#.#...#.......#...#.#...#.......#.#.#.......#...#.....................#...#.....#.#...#...#.....#...........#
###.#.#.#.#.#####.#.#.#.#.###.#.#.###.###.#####.#.#.###.#####.#####.#.#######.#.#.###.#.#.#.#.###.#.#.###.#####.#.#.#######.###########.###.#
#.#.#.#...#.......#.....#.#...#.#...#...#.#.....#.#.#...#.....#.....#...#.......#.#...#.#.#.#...#.#...#.#.#...#.....#.....#...#.......#.#...#
#.#.#.#####.#########.###.#.#.#.#.#####.###.#####.#.#.###.#####.#########.#####.#.#.###.#.#.###.#.#.###.#.#.#.#######.###.#.#.#.#####.###.###
#...#.#.....#...#...#.#.....................#...#.#.#.#...#.......................................#.#...#...#.#...#...#.#.....#.#...#...#...#
#.###.#.#####.#.#.#.#.#.###.#######.#.###.#.#.#.#.#.#.#.###.#####.#####.#.#.#.#.###.#.###.#######.#.#.#.#####.#.#.#.###.#####.#.#.#####.###.#
#S..#.........#...#.....#...........#...#.....#.#...#.....#...........#.....#.#.......#...........#...#.....#...#...............#...........#
#############################################################################################################################################

View File

@@ -1,5 +0,0 @@
Register A: 55593699
Register B: 0
Register C: 0
Program: 2,4,1,3,7,5,0,3,1,5,4,4,5,5,3,0

File diff suppressed because it is too large Load Diff

View File

@@ -1,402 +0,0 @@
rbrr, gbgrgrg, rgurwgb, grb, ggg, grbugw, brwggrw, rbbrub, grguuu, uuub, uw, urug, bru, wwrrb, rbwbb, urw, uwuw, ubg, uugug, wbub, guubr, rru, gwb, wggrg, gubbwww, wrr, wbw, grug, brrr, rgw, urg, gugg, rugwuwb, rwu, rgu, bbu, ubb, gr, wwwggw, ub, uggrb, bbwrru, wuwrww, gbrbwru, uubu, bub, uguub, b, uwgu, brggrr, rruuggrr, buuu, brbgw, wbugb, rbwru, wrgu, bbg, uwbg, ruwg, bgugub, urwrrb, bggugw, bg, rgrrb, guwwu, gbbr, rwb, urrgu, brw, gbrwg, gbgwwrb, grgb, ggug, ugw, wbwwbug, wrbru, uwww, wwuw, wubg, burubw, gwr, wwubu, ubggrr, uru, www, wwr, uwbw, ww, rbbrwbr, rrwgru, gwuwgug, wubwww, gwbbwwb, bwu, ubr, rrguwr, bu, g, wrwbr, ggwb, wbr, uubwbrrg, gubrurwu, ugbg, wrurwbwr, buu, wuwbgrbw, ruw, wwgrw, bbbr, wbg, grrrrbu, wguuggwb, wrrwr, rbrru, bur, wurgwbgw, wgr, burggw, grugug, uugbrg, bgurgrr, urbw, gurur, wggb, rrub, uwgwg, grrug, uuu, gurg, ugugg, rurb, bbb, rrggwwb, brwbb, rrbub, ugb, wwbgg, gbguw, wgwgbb, wgw, brrw, ugbwrg, wgub, uub, bwgrugwb, guwgg, gurw, rrruwr, wgg, bgw, wrub, bubrw, uwrbb, uubugbwg, bwr, ugg, gwrbg, gbg, rbuwr, gububbu, bbw, wggw, rwrww, bbggbr, urgburg, rwbgr, rgr, wbugu, uug, uwg, ubgruurb, r, uu, rrw, uuwgu, gbu, urb, ugwg, bgrgrrg, rub, wubgwbg, brgubr, uuuburb, rbrwgr, wgwur, wbu, buurrgw, uwu, wbgb, rgru, wgggg, gubbr, uubwwg, uurbbggg, bgrwg, wggburr, ubwrg, wu, urbu, wbwrur, urgu, bggub, gbuwbb, uruu, gwwggwu, wugubrbr, bgrb, rgrbrb, guw, brr, rbguu, bgb, rug, gbur, gbb, rbrwbbb, ruuw, wrug, bbrwbgu, wwuwwbr, bgugur, rgg, brbw, wru, burrg, gu, ggwuww, wuw, uurg, wuwwbrwr, bbgbr, wb, ug, rrru, gwbg, ubwrug, rgur, rwg, ggrr, rgbub, uwubub, rwugg, wgbw, wburr, rgbu, ugr, ggwwb, gg, bbrbwgrw, gwu, brgwrwb, bguw, bbwwurr, ruu, ggbbu, ggr, bgwbgr, gru, gguuw, rbg, urbb, grw, wrwubbg, wbuu, ubwuw, gug, rbbr, wwb, buw, gw, buuw, wurgbuu, u, uuw, rwbw, wbbguw, bww, urguuwr, buwb, rugguggb, wwub, wrgubb, wrbr, gubbrw, guugr, ubbu, rwwbrb, bw, uwur, uugugw, bb, grr, wwuu, grrggg, rur, burugrr, ggb, rr, grg, brgw, wbwgu, uruwb, wuu, bwwgwrb, urgg, rrwuru, wurbur, uwb, bwrb, wur, ruwbwug, gb, bbr, uuwguu, ggwgwggw, bgurbb, wrw, rrbu, ubu, wbrgr, ruug, rbrg, rbr, bubwb, wbwgbwb, urugww, wrgbw, wgb, grub, gwrbuu, rbb, rrb, wbb, gguw, ggurrwg, bgwg, uuurw, wrwuww, brg, gbuub, uuur, rwrwu, wgu, rrrw, rbw, bwrbr, gwrgwu, ubbruu, rurrbrg, wwbwb, ubrg, wbbb, brb, rgwgr, gwg, brrgb, rwub, guwburb, buwgbru, ugbug, bwb, wgbwuu, wrbg, rrwugb, guuub, burw, brgwbwb, ubrub, ggbb, wggww, buwwwwuw, gur, ugu, guu, gwrbbrug, wbggu, gbgbuu, gbr, ggub, bbwg, ugwuur, grgr, ubguu, urgw, ru, bgg, wwu, buggg, gbuu, uuwu, rrww, ugrw, urr, rbu, bbugb, rgb, uwrbbu, wrwguu, rw, wwwu, gbbbuguw, wbrwwg, gbbrwrwr, wugw, rrbb, wurg, wgbubg, wug, wwwwg, br, rwbg, ur, rrrggg, gbw, ggu, bwrwb, rrr, rguuww, wuwbgww, bug, wgwru, wgbggw, uww, bwg, ggw, ubw, rrg, wg, uur, uwr, wrb, bwurbg, ugur, rb, gww, ubuu, burr, ggwg, rwr, gwuww, bgbwu, gub, bgu, wwgr, wwgb, bbrug
wwugguwgrwwbrwubrwrwburubgrwubbbrugbggwrbwrwwrgggg
brwwgggrrubuwubbgbgruwgwguguwgwwugrgbwbgrbbwwuwwruug
gruurgurbugwgwbwuwubrggrgbgguurgrugbuubwgwrguwggwburrrgu
ugbrrgrwgbuggrrwuwwwbwugwwgbbrbuugbwbwbrrggwgruurrguuguw
grgggbwuuggwbbugrburbbbbbbbgwubbruuggubbgrggurg
wrggrurwbubuwwbrbrrurgrrrbuggwgbbgbbwgbwbbrgugruug
ugrrrrwggbbuuubrbggrgurggruurgrburbrgubrwrwgbwwwuugbwwuw
ggwrrwwrbbrrbwrgrwuurrbbwubgugruurbrggrrbr
rrurruguurburuwubwugurrrwgwgubbbwuurbggrwruuwg
gwbgrrggwbgbwrgwurbubgrwubwrgbugurbrbbrbrb
rwburrrbrwggbgwbruuwrwrrurwwuwwbugguwwrurwbwrrbu
uwruuuuwrwrwrrgurrubuwgwgrwbwuubgrwrbugubbbbuwbr
rwwggwwurwwrrrbwrwwwugbrggruwgruggwbwwgguuuuwurbrgbu
rwgbgwbgburuwubrbgrwrwubrrbrgubbwrgwbrbrugbbubbwurgu
ugbbbubgbbuwbwrwgbgbggurbggrwbgubbwuwbbrwgrubbg
wwbwbrggbrburubwgrwgbgrgwuruwrwwrgubwgurrbwrrwurwuurgggwgg
wuwgbwrbbgguwgwurgwbrgbwguwrbwuugubuubuuwgbwrr
ruuwuugwuuggbbwbuurguuwwgbwbgbgwbwwgwwuugugbbwwwruwuubrrgw
wwbgrburbbwurgruwugbrgggrgwwggbbgwgurbbgubugbgwubwg
wrggbbruuwrrbgrbwbuuubrruwgrwrrrgrwgwbbw
rgbugwrgwwurbgwubwruwwbrwggbwruubwbbrrwubrgwurrrrugbgg
buurwgrwgwbbugwgbuwbwurbwbggrugbbbwwbwrbwgrwurwubrgbrbbgu
rwwururugbgubrwubrrggbwwbgbrgrrbbuurbugwbgwuurgbuubrgu
bwgwruwwrbwgrgggrgwbruguwrubbrrgugbrbruwbug
bwwrurburbbwbuubrrwwuwubwrburrwuggrbbuwwggb
gbwuuuruuwguuwwbuwguuuuwgwuuugubbggrbuuuwb
uuwrwrwwbrubgbrrwbrbuuuwrrggbrrgwuugbuurrbbu
wubggwugrugbubgrbwwgbburbuuuwwbbwuuguggruugbuwwwbwrwbww
gggwbuwrugwruurgubrugrrrubbwwguwurbwbrgbwgwwgug
wrgguwwbbgbggubbuugbgrrbrurwuguwguuggwbwwrggww
ubrruwrbuuggwuuwbrwgbguurbwbbgrrwurbbbgrwbubgwubgbrwgbbrb
ugrgrwbrgwgwrrwbrwwugrruwrgrgwrurbbgurrbwwrruruwbbbrbrugu
wbrgrubuugggruwwrwbuwgwgurugurbbgwwuggbwgrugwubr
uugwugbububwrrgwwrrguruwwgwgbgugwgbrrwgrubbrwrrrbgwr
rgwuugbwbwurggurrbrbuwggwwbbgwrbbrugwbggwggwuurg
wgrrrurwgrgbwuwrggrbbgwgurugruwwugbuuruurub
buwgubbgbwwgbwwrrggwwrrbwgwwgrugbbguwwwwgbwuwuuuururgur
rburrbgwwwwgrrurbruwwbwbbwrwgubguwbbubwbgguruggruuugubbwu
grbgurbbgguubrrwbrwwgrwrwwubbubbbugwwgurwgwgrbwww
wrgbggrgrwggwuuwbrgwurgurrbwbbwrbgwuurwgrgw
gbwwubwgrwuguwggbgrgrwwgugbuuwbuuwruwwgbbb
ugrwwrrgwrguwgbbrbguugbbgbgbbbggbrubbbbrbguwwgu
guggrgugguuubwwgruwwuggbugwbwwwururgbwwwrggrgbugubgubg
rrgwrbggggbgwgggubrugrrbgrwwwuggbwwrgurwwuubgwrww
bgbuuwgwgrgwwggrggrbwurguuururwrbbwuuwbwgugbbgwr
bgbbrbgbrugrggrbwgurbgwwbbrurguwrbrwwwwwbbggrwbgrwwwbw
ruwbbgburgrbrbwrrbwwwuwggguruubbbrugbgbbrurbugrubgwgur
ubrgguggrwgrbrgrrbwrrrgrgbrruwgwrurugbgubb
wuggrwwgrgwwwbgwwuubrggwuuwbubgbrgbuwurubbwbuwwbw
grwbwruuggubgurrbrrwguggbwrubwwuuubbbgggwururw
guurbugubbwbgrruggubbgrurgggwugugrrubgbruububgubgubu
uubwwbgrurgrrurwbgwgwurguuuwguuwbwbuurbrgrgbuubgwbwbbgbbw
wrggguwwwwrgbbgrwrbwbgbbuguurrgbbubwbbwrbgwuwwruubrwrrgbgu
wgwugwwrrurbgwwrgbggbgbwgbbgrgrbuwgwrwrrurw
bbbwbbgwgurrgbuugwbbrubrgrrggurwgguwruwruggrwwrgrrgbugrub
bbwbrbrwrwbgurgrrwrrwbbrwrwgruugwbwrwurbwbwug
wwgwrrrgbbgguwguuggwbrruubgwrwuuuwrgbrburbu
urgwwgwbwbgrguwguubggwuwrbuugggbwuburubbuburrgbuwb
wrgbbwuruubwuuguubwuguwwgbuurgrgwguwbrbwwrgrggugbbbb
uuuubuuguubugbruwwwbrbrbgrrwwurwrruwwbuuwwrbbgrurbubbubrb
bgwurgbwrbwurgwbgwburgubuuubbbwbwwwuuwrgwugg
wrggwubugrugugubbguwgwbrwruurrggwuwwrbbgbbbrgbb
wruwwgbbrrgwrgrggbrugrwwwbrbwubuggugwbwuggbrwgburbwbbwubbg
ugwuuugbwwwrurrgubbbwguurbwgwbrgrwbwugugubbug
wrgrubuuwrgrbwbuuubgrbubbrbgrurbuuwggbgrwwgwwbwr
uururwwbrgwwrwggwbwrrrrgbbbuugbguwuwwggrgug
ugrwbwwrgbrbwwuuwuuurbgruwgrugbrrrbguuwubbub
wwwbrruggbuwwgbubwggrrgugruuurrurrwgwrguwwwrrgubugww
wrgrrgbrbggbwbubrwbrwrwbbgbwuwgbbwggwrrubgurbugguwuwuw
grrwbggrwbuugrggwubrbguuwrurbuuwbggbgugburbrrbuwwrrggggwwu
uubrruwgwuwbggbbuurwubwgburbuuwugbwuwurrwbrbgrbbr
rubuubuwuuburbbbwgbrrguwgrbbrwwgbugrubbruwgrgbgrbw
rwwwbwwguwrurbubwrurrbuurbwrubuwruggbguubgwrbugguuubrgrg
buwuwruubbrrrwbbuwbbugrwbguuwrubwrbwwrrgugwuur
wrrbuwuwwgwrgwgrruwrwbbwbwwruuwwuugbgrggubbbwwgb
guwbwrwuruwrgwuguguwbuwurruwbuggwuwrwwubugb
bgbuwwgrrwwuwrbgrgbwbrggubwwbggwwbbwwurgbuubrrwwrburwgrbb
wwwgbrbwrwrurrgrbgwbbgrbuwwbbugwwwuwwrurbu
wrgbrurguwgrruuggrrugurwuurrubuuguwgugurwgbrruburuu
wuwurubwugubrbrbwgrwbuugwbbbrwggrbwwguwwrbrbr
wrgwrggbwbwbwubrbgruurbbgggububbbgbburgurrgruwb
bggwbbrwbgugbgrwwgbbrruuguuuruuuwgrrrrgwbr
wrgwwrgrgbwugbgwgbgbbgrgbuwwwwuwwbubbbwg
gggbrrgwbwbuwbrbbbrbbwuubrrwuuggurwggwrwbwbu
rbugwwuwrbwbguwbgbgrwbwbbggwruwbuwrwwubrgbbrwurwwwb
bwwwbuggbuurbbuwrwwrbgubwbuurbrbubwgwgugrwuwgburwbbwwbrg
wrggrgwgbgrwubgbwgrugwbuggggurrrwbrgwwwgwwggwgu
ggburrrgubrrgwgwgbrwugwgwgrwbbbuguwbgbrwbuuurwrbr
urrgbwwuubwwubuurrbwwgubuuggrguwwwgbwwuguwgbugb
buugbwgwrurbbugbrugggwrbrwwruurgurwrburgrguur
bwugruuggubrbuuwurbbwbbruggrwwbrruugrwrguw
wrgwubgubbuwubwruuruuuwwrurrbgrrbruuurgrbrwugbbuggww
ugubburbrggubgrwgwguburwwburbubbrubrwrbuwb
wrgguwubbrrwbrwuwwbrwruubwgwwwrwwgbrrwguubbwwwugugwr
wgwuwwgrwrubrgwrgubrggggwuwrgrwwbwwbggrgbuwu
grwbwgubgwrggwrbgrwbuugrgrburbuubbgrwwwbwgb
bwwwbbrbwwurruuwwggrwbggrgguwrubbwbgbbgugubwbbuug
bbggwubbgwwrbburwwwgwrbwrbgrbubbwrrrgbgbruu
wrgwurrubgguggwgrrbugbbwbrbuurgbbrwrwrwgugwubbbubu
wrggggwrbbrugbrubguwuggubwggugrbuurwubgbuwubwgwgugugwubwbrwu
bwwugbwbgrrbgrrbbrbgggbwwwwggbbrbwwbbbuwgguugubrububgwwu
ugurgbgruurwbwgrruuwwbgbrrbbbggggurruruwrubbbuu
uwrugrrgrwbrgubrwwuwwgwgrbbgrbgbrwwuwubuwr
ggbgwbrwuwgruwrwgrrrrwugwgbrbbuwuwwbuubwgw
wrrrgguurbgubbgbguwruugwrbrgwbgwrrbbuwugbbrwgrbbugrgbbgwuu
urguruuggubbwurrubuurgbgbrbgugwwrrggwwwugugg
gugbggubuwubrgubwuwrwbgbrgbguggwrbrrgwguugu
buwurubbbwurgrubgwgggrruwrrbbrbugggggwbwwgwwb
wrwbbuburwrrwwururbrwgbbrbgwbbrrrbubbgrgbuggwrw
ugubruguuwrgwububrbgrbwgbwburwgurwbuwwubuwu
gwrgugrbgbubbwubgbrwbuwggugwurrburgwrwrugubwggwuu
rgbrgrbggwbwuubburrurggwggguurwuwwwrwuwurbrggrgbuwrgbgwbgb
wrggrwwbrrurbbuuwburubgruurbrgwrwgrrgrbguguuubwug
rguwwuuwgwwubwbggbugwgrrwgbrgbgurbwgrgugurrgguggrrbuuu
ruwubrwugurgrbruruggwbugbgrurwuuwbwrwugwgrr
wrgbrrbgubgbgwrbwgwubuggurguburgwrruruur
uburbrrbgbrrruwruwgwrrgrgurgrruugrruwuuugbuwburwubbrbbgw
wrbwuggbuuwwwuuwbwuuwgwbuubuwgrggrrbgbuwgubrruuggrrruuuwub
rwwgbrrurubuwrgwgrbgbrrbbbwbbbwrugwbubugwuwgwugwwurwgrbr
wrrgwrggrbuuruggggwrguwbwgrubgwbguuggbgrwrgubrurwuggrwgwrb
wwrggguurbuwbwurwwbbwwbrggwggbrbbrgugurbrbwwwrbrrggbbb
ubbrrbbwwrugugwrggwuwwuruwuwbwguwgggwwbwrbgbwuugruw
rggbrwgbbgwrwwrrbgwbuwwbrbrbururwgbugwwbrguuruwrbbbbwrwgu
rguwbuwgwrrbgwbwwwuwrrbrwwwburrbbwbruwggugubbu
rgwbgwwbugbgwruugwwrugwrrbuwgrbbwbuwubguubwbugugrwu
ubwwgrurugbrbrgwrbgrbwruwrbwwbugrwgwrwubrgbwwrurb
rurugbugrwuwbgrbwgbbrguwgbgugwgurbbrbuuurbwuuwwgbgg
rruubwwwuwrrwgwugwrbgwbuugbrbwugrwwuwurguw
wrgwwrgugrbrruurwuwgbwguwurrubwbbwurwwrgruwbgbwwrwu
bgruuwgwrgwugrrguwugwbrbgbbbgguurwrbubgwrr
gwrgrwurbruwgburrruuggbuwbgbwggwgurubwgurrbwuwb
bwbugugubgubrwubrbgruwrubbrurggbgrrgubrrbuurwrrubbwurbbb
bggwwgrbburbbubbuuburuguwubrubgbrubrrrgwwbgrrggrgggwrrgrg
rrrgbgwbgrwuwgubbwbwgubbrgwwbwburbwguuruwwwrbrb
wrgwbbugggruwgbwrggbbburbrgbwuuwurbugggbuggrwrbw
wgurbubuuwrwubrrgrrbrbwrwurwbrbgrggguggwubgrgbr
rubgwgbwbrubrbbrwwbbrrugrbbrrwuugggggwrwugbbbrb
wrwwubrbguubrggurwrburgggruwubggwgwbrgrggrggwuubwggubgggww
wrgwbgbrgugggburuguuwgrrrbrgrwbgubruwrwugbggubuwbbbbwwwbw
wrgrwggbwwrgbwubrubbwbbuuggrbbugrrrbguwbrub
grbrwgbugbgwgwbwubbuurgrgbbggwgbgbwwwrurguuubgbrwugb
urwbbbuggwugrgggurbuwgrrwwbuubwubugbgburgwgbubwuurwuwbuw
wwgubbuwubrgrgwguwbgrurbgwwuwbgwwgbuuuwwwwggwgrrwwwwrbrbuw
wurwrbgrubrrbguwwwgrggwwgrgbbbbuburgruwugwrbr
gbwgbrbrrrggrurrbrrwwrrbwwgubgwwuruwurgrrbbrwb
gubuwgggwgwwwwuwgggwgwwugrwbggbbwbwrrwugrwuurggwbgbgrwruug
uwrugrgbburwwbugrbwwwbbgurruwbburgrwwwgrwrwrggg
brbgrggwububuugrwgubwubbbwwgggrgurrwwggbburgbuugw
ggwwbgugwwggrrububbgrrrrwwbwwuuurbuuubbgwbwu
bgruubgwurbuwrrggugwwbwrbwbgwrwugugbrwwwbburugbbguur
bbbrggbgrrbrubugbrguwrrrruwbuwbgugwubgrugrwruugwgbuw
wuurgrrwurwggwwguguwwurwwugguuguubbuuruwubg
bbuuwrbwwwgggrgrrrrbgwwbwurrurubgubwburgbggrwrubgwbrw
rwuwwbrguggwuwrruwurubguubgwburrwgugrwubwwbwgwwbbbrgrbb
gguuggrrggbwbubgrbrrwbbubuwbrwrwgbuggbbbuuuuuwrgrrgw
bubbrwwgbwrwwggubgwwwubgbrwubuuruuwuwgwwgruggbw
wubburwgbbgruuubwggwurwrubwuwbrgbuuwbbguwwgrwbugbwrrgubrg
rbwrruguuuwwbrwwwbwrwrbubwuggwurrbugwubuggrbubwrubwbwu
uggubuwbuurrbgrugwwubwubrrburubbbgbugubrwwbuwrbu
ubbgbbgrbuguwwbgrwwwgwubuguubruugbguuuwbrrg
rugbbrguuruuruwgbuwrwbbubgrrbrwwbwugrwugbwuuwbwwbbwuwrg
gbubbuubburgrbbrgubggrbbwwuwwbbrurguubgwubbubbbuu
uggwrwuubrrwrrwurbrwrguurrugwwgruwrgwrrrbbuubgrruruwr
wrgrwburgbugwgruburwguurbgggbgubrurwurguwwurwwrbrubbwbwr
bbrubwwbubwuwgwgbrbwuurwrrbgguwbwbgbwuwurbbwbrgrrgwbbgw
bwurwgwgguubrgwbguugrubbrgwrugubbgwwubruguwbrbwb
wrgrwggurrrgwwggbgwrgrrubuubwbwrrrwggbbgbgrbwgwbgb
wubrrwbbugrrrrbbgrbwuwwggggrrbbbwurrbuurwbuwrwgrbggu
gwgurwruwwbbgbrurrrbrurrrgrrggbgubwbggugrwrrbuw
wrgwwwurubgbrgwbuguubwuwurbuurwrruuggrwrrburuuur
gubwbwuggbbguwwbgbgrgggbwggbrrrrwubwrrrruuwbgrrwguww
wrgguwubgwwwrwwbrbgrruwbrurrrugwrrbbrgbgbw
guwwwgrrurrwuwbwrgububgwurrbrrbgbrrwguwrrggguuugbrbbwrgw
rwwbggrrugburbbrbguwbgwwrubwrrwwbbgurruurbggruubrgggg
uwbgbugwrguuwurgrrgrbrwwubrrbuuwggwwwurgurgwrgrwbr
wwgrggwgwbgrugwrggbbruurbgbbwrgruuwbbrurwb
urbwbgwbbugbuwwrgwwwwgbbwbruwbwgwwrrrrbubrbbgurbgwuru
wgrgrrwububgruwubgwuuwbubbgurruruwrubgrgwg
wbbbgbbbguuuubruurugwbruwbbrbwubrgrburrrrwrrb
wrggrugrubgrwrwgugugrrgguuwrubwwugrrbuwbw
uwbbggrrburubbgwwrwgggwgwggwgbuwbwgburbgrrwr
wubbgrggwrrbrbrgwrbubbruugbrwbbbugbrgguubgrgwggu
ruuuuurgrrrrrugbbrgburubbwuugwwgbgubgubwubguuururgrwb
bwgrugbbwbbrrwuuuruwubgwuwbrwurrrbwgurwbur
ubgwubrburgrgrwwrrurrgguwbbwbrbwbuuuuwwwugbrwgrwguubwbrrrg
wbrbwruwbbubbgbbgurbuurbwrggbwbgrugugwwgwwwbrburbgbbwr
ubgbbbbgwrwgrgrguubrrgugbgugubrwbruguwbwrugwuburwwbb
ubrwbuubwuubrrbbrurgbwubuwwbrbrruwwrgrguwrrbwgrugwbubw
gwwruuuwurbwrwrubrwwrrbwrrggrburbgwgruwubrrwgubbbuw
rwggugubbwgwrwbwrwrwrgwgugugguruwgwbbrwbwrggwurb
ugubuwurgrrgugbugrrwrguwwrrurubrbrbrurbrbbwbbuuwugrg
uuurwubugubbggwwwurbwgrgruubrwbwgguwrwwrbubbgrgrbbgubb
wggruwbwbrwgrwrwbrbuwbrbbwrwwrbubwggrbuwuggbbrgwrgbggwwb
wrgbgrbrgwbggbgbrwgrbbwgrgbgrubbwgbrwrwwgbbbwurgwbgwbwbrug
urgwwbwbbrwugruuruuubgbwubgwbuwbbggwrbrggwurgrrrgbububwg
wguubbbbgwuuuwrrguurgugrrubrguurwggburbgrwbgwuu
uurrbwuwwuwugbgrbgwbggwbwgwbwugbbwgurubwgrrbb
wrwrbuggbbrrwrgugrububuwggbwrbrrbbruuuggwb
wgwwurrwuuuubuuggrgwwuurrugruwbuwgwrrrwrwbwrubugrwwuwurbgw
wrgruubububrbwggggbbrrgrbuuuuwrgwggruwurgggwgwggwuwwwgrwgb
ruuggwgbrwwbubuggwwugrrubuwurbgrugrwgwubgbggrbbgbwgrurwggg
bggbrgwrwruuuuuwbbrgbrgwubbubugbguugggwwrrugrbu
wuuwguubwwguubbwggwwwurbgbugbwwwugwwguuugrwgrwrbwbrbubbgbg
ggrgwbwrubrwugwrgbrwurwggrguurgurwrwrrgubbbwrwg
wrgguwwrbubgrurgwbbuwguwuwgwbwugruruwwuuuwrbrubwrgr
bgwrrbwugrbuggrwbuwrrbrrggggruuugbrrguwubur
wrgwbgwruwggbwuubrugbgrrwubrgbburwwrbrwrwwrbguwgur
buwbrgrbubgubgugwrrbwbgguuwbbwuubrgrrwwgubbbgwgggugbru
gurbrrwbbwgubrrwbwuubbuuruubbruwrwwwrrbrwrwwbrbrubb
wrgbbwbrrwwrrwggbbwrrurgurbgwgguggubwbbbruurwrwuggg
wrggrugrrwwbgwwwwbugbbbbrwwgggrgggwbuguurgu
wwugrwwbbggrgwurgrrbbuwgwgurrrbgruwrwugwrr
bwrwubrgugguububbuggubbgggugrwuburuwrwrrrgbrwbrgr
grgggugwbuburgbggguubwbrrgrguuwwbrgggwwwrgbgugw
ubgbbugugbrugrwuguugwbggugbbwrgrbuurwbgrbrbgubbgwuwuwgbgw
gurbubbwgwuwwgwbrbuwugguggbgrwgggrwuwwbgbgwbg
rbuuugbburuuubgrubrbbrwgggwbbuugrugrrbbwggwr
wrgrwrwbwggwrwuguwrurbugwbruwbggbggrrwurruwuuruwru
uwguwwgbgggrubggwugwbwrbrbbwbgguuwrbgggwugrbwuwrwwgrur
rgrwrgwuwbbbrgwrrwuubgrgbwwrrgburbgbbubbgubwrburbbwuuur
wgruurgwubgubgbwbwbgggurbgbrggrbbgwgrrwggrwwgg
wgwbwuwwwgwrbubwbuuuwwuuuuubuwbuurrgbgbubbbuuguburwbgru
wrgbuurwbwbwguwrrugbrrwuuububbrgwbgugubbwgugrwgwwggwuwgrgrr
guggbbgugbwgurrwbuwruggbbubbwguuuruuwwggwrbbgruburgrrbug
wrgwuggurgbwgrgrggwwwgbbrwwgguwgguggbbgbbugwbrruwubrrrbrwuu
bwgbuubgrwbugwbrwuugurwgbrggbgrwrggwbrgguwbr
rbwwgrbgwwuwbrwgurbguwwgwrgwburwbbbwgrrgubugwurrggrwuww
ggrwruugwguuwrbgbrgbrggrwugwggbrgwgurbwgbbrbgwubuggbbrgugw
uuwwrwrrurgbrwrgbbuguruwwuwrwrugwrgrrbburgu
grbbgurubwbwbgrwwgruurwbbuubrwwrrbwubwuwbbbrwu
brrwwbbuwbwrbbgrbgbbuwwbbwrwwgubuwruwbgbwrwwwggug
wrwbgbgggruurugwbrwwgbuguuwguurbgrgrguuwwwrgu
wbwgbubrgbuwwwwbwbuuggugggggrwbwrwgrgguwrggrbwrgrburwbubb
ubgwwrbbwbuwrguwrrwrrwggruwbgbrwuwbubububuggbggbrwbu
urrbwuwwwrugbugwwgwbbubgrgbburuuwgbgguguugb
uwbugbgubgrwgbruubbrrbrwgwuubuwbwbbuwrgbwugbr
wrgwrrrbugbgwuwbwrubwgbbbuguwrrgrrwgbbgurwwbrbbggggrrbrruwu
rwrrwbwwggubbguuubrwrurgrbwurguuuruuwgubwgbwbrbbgbgb
grrbrgwrwbwbbgguwgguugrwurrbwwgwgbuubgrbuwbbbgbbbuw
rgwubwwubrrgbrwwubuguugwbbwuwgbgubgruuruubgurrgwguuggwrw
ruwuwuwbuwrgggwgrruguwwbrbuwwgugbuuwruwbwrbgwubwu
ubgrgrguguwwbwrwwbgwurwurrrbggrrggubgrrbuuggbgg
wrggwgrbugwwgruwwubrubgrgggwgubbbwwwwrwurubrwrggrwwbrgwgw
gwbggrggwbgwgbrwwuuuwbbwrwgbguwruguuugwrbgrbbrrwrurrggbb
brrbuwguwgrbbburrubrbwburbrwbgwbbwgrrgwugrg
wgruguruwwgbrurbugrrrwrgwbrwuuruurrwrrgwuuwgwg
buuwrbwbubggrwugwwbuwgubbbrbbgbubrrwrbbwwrrrrrwgugurrrbbb
rbrrburuubrwurwgguggggubgbbruwwggburwwbwrb
ubgruruwbrgbrbugrbburuwugrurugrwbwwguwuuwuwgubgbrgwrbbggbg
gguuuwwrgggwgurrrubggubruubbugbbuuwgrruuwguguu
uwbwggbrbrrbuggbwwwubwwuuggwrwwrurrwbgbwuwgw
rwwwbuurburrrwubguwgrguguubrbgwbggbwurgwug
gbgugwbuuwuwguwugwruwwbwurguubuurbbgggbgggrrwgwbgu
gbrrbwwbuugurwbgrrwwwwgruurgbbgwwwgrguuuwgbgbgwwrbgwr
gbwubwugbgwwugwgguruwubwggwuruwrbbwwbggggrgurwg
wrgwbggbrgbuwrgrggwrwbbwwuwruuwuwrgrwwuwg
wbrwgrgbrrrwuuuuuugwwrwbrbwbuubgggrrrbwuwruggwbwwubwbrgbwb
uurbbgrrwrbwubwwwgbrrrrugbrbrbgbubrgrwbruuwggbbwbrg
wrgbrrugrwrugbbrbwgrwbubruuguggwuwugrgbruurbbuubwbwur
ggrwgwgwugbggwrbwbrwwrrrbgwrbwuwgwbuuurbwwuwbgubuurwb
wrgrrbuwgurbgubwwwwguuwggwbrbwbwwwwuuwggb
bbrurwwuwbgggrbgwrbrbgwurrrbbggrguwuwgggbbuuwggruwwgbw
ugggggbwgrwubrrwurwgrwwurwrrgbrurbuguwbgwwrrbgwwwwrgwrrw
rurbgbbwgrrgwuuwugwgbubwrwruugubgruwbwwrrg
wrgrrwggbwruuugrwurbuwwgrgururgugwuwubbgbbgrwururwrgr
wgrrbwrwrrbgwgwwrwubgrrurbgrwruguurrruwbwbrwugwr
gbrwwbbbuwbwwuwubwggwrrbubuwrrwbrrrbuwbbbbugwbgu
gurwruwurbgrurgbuwwgrrrwrbrrgwrbggwwrwruggurg
bgururwbrguubbwbwbubbbrrbrbwrbgrubgwbruwbbwwruurruurrgurru
bgugrwbbbgrbwuwrbubwbwubggwrwrwgrrbrubggwgwruwwuwwgrbwwb
rbguwuwrrbwbbgrrururugbwwruwwrrwbugwguggubruuuuburrguugbu
gurbggwbggwwurggbrgbgugrbgubrgrwrrgwguubwrurrrgrbwwbugwrw
wrgbuwbugrgwrugguggbrrrgurruuuwgbguwgburb
gurburbuuubuwrbwrubwuugwgwbuurrbwuurbrruuburwggw
wgguwuuwguubuwrbwwwbbguwuugwrbubwugugrwwgwwwwggurwrbru
wggbwgwwrggruuwbrubrrgbggrgwrwrgubbwuugwwuwrggrg
bbwbgggubbwwuwrbggwbrgguugbuuwubguuwwrgbwuruwgruwr
wuububrwurrgwubbgrbrrgubbbubgwbrbwrwrbwurwgg
bgbbrbwwgubwbwbgggrwbrgbbuurgwbrrwgwgruwwrguuggubrbrurwr
rbuuwrwbuubwrwrgrggurgwrurrgubbuwuugwbgwrrw
wrggbwurgrrubgbgwrrgbruuuuwrruruubbbgrgubbggrwbbuugg
buggwggrgbwbgwwbguwuwrbgwrbbwwrguwwuwggurbwgurbggubrrwgg
guuggrbbuwbrwgrurrwwwuugwbwugbuwrbgrwguuwbgubgrbbg
uuwwwbgugguuwuggrburwwubgurwwbuugrrwgugwuu
buurwugwrrrgggubgwwwggwwgwugurbgrgwwuuubwuggurwrrbggbguwgr
uuwwbgggubuubgurgwurbwguwrrwgwugubruuugwuguuuwwwgwgb
rwbgrbwrwugbbwgwrwrgubbbbwwrrguwwubbugrbbwgbg
ugrurggwgbgwgwrruugrwugwrgggbuurwbbubuugrbgbru
uuugugurgbwwwwrbrgbrbggrbrurrgbbbrubburbbbbrrrbbbgww
brbburruuwuwwbgwugrrrrggbwgrbrgwugrwbwggrr
rbbbgburbwbwgbubbrugbgwgugwgrbubggwgwwuwbuurbuurgwrugrrg
wuuuubrgwrwwwwugugrgwbrubbbbbgwbbgbubrrbbwgwwrgg
ubrwubuurrrwugruubggwuwbbbuuwgbuubwrrrwbrwwwwbubwgwbrwwu
brrurgrwwrruwrrubbwuwguuuggurbwgruuurbggggguwurrg
uuggbrwgbugguwbgrrwgwwuuwuururwwbgbgrbgbuu
grbbbrrgwrurugbwugbwgrgbgbgubugbrurruubgrugguubrwwugwuu
ruwbwbugbbbgggbrugrgbbwbbgrguwrwuurrrbugbugbwwgbbugb
ruwwrrwugwwbubggrubwbbgwrbgwggbwgguuubgbgubg
uuwwugrbbwbbbbwwwwgrbbggurubwrrbbuuubrrggbgb
wrgrgwuruwwugubrbrruggwrbbgrrubbggrbrwbruwubgbbrrwwgrgbgubgg
urwuuwgugwwubuwrgwbwbgbbrwrwrrrrrbuburwbrurwuuruuugbrbb
ggrurrwubwuwbugguuruuwggwwrgrgwwbbrwubgrbggbbur
rwuggbgubrwuuwrwrbbbgbrgwwuwrbbuwrubguuugbbgwww
wbrwgbrubgrrwbrwrwrwwrgrrbbrwggwbrguwwbrbbwggubbrruuwgrb
bruwgrwrrgwrbugruuubwbruuurgbwgguwwruuurwbgr
wubrurubrubrrwbuurgrgubgwbgrrurugguggbrguurbugr
gbrggggugguugrrrwrgrrurggwwrgubuubwurugrbbrrrgg
gwrbugwubbuuwrggubrrubbgggggbgbggwrbrgrwgwruwbwggubug
gwrrgubggrurrgbbugruwgbwbrrbwuwuwbggwgrrrwgrggubbgurbg
wrggwgwgwuwbrwwbwwgrurubugubgrgubuubbgwgbggwwwg
wwrwbbrwwrwubwwwgbwrgguwuwrguwwggurgwgbburuuwwgwrggg
wwrbwwbbgbgbuwbwuggrbrggurbugbrwuwugrrurwbruw
wrbgrrggbwwgwwwgbwgbbrurwugwgugurguwbrgubr
gwrbgbgugubgbgrugbrbgrgguwggwgubugwurwbwrgwbrugwwwb
wbgugubwwwrurggwuwuwrrwwrwgbbbuwbbbrgrrgwurw
uuuguubwbbwwgbbwwggguubgububgrguguubwwuugwwrwbr
rwbgrwwgwrrruwugruuubbwrbrgubgrgwgbbbwwgburbubgrg
wgbuugbgwbgwuwwgbwgwwguwrbuwurbuwrbwwrbbrwrrrubwrgbbug
ubuwggbwubbgrwbbbwwrrbuwwuwwwwbbubbwrwbubwgrr
uurwrurwrbbbgwrbggbwwruguwbwgwururgugrugruggggbgwwrrurggg
wrggurbbwgrurggubgbggbrbgbgrwbgwrwbububgrwrwgrwwubuububu
wrbwrgggggbuwubugurguuuugbwuwuuruburgwrwuwr
bggbgwgrrrbwbwurgwwrggbwrwgbwuwwugwbwgbrrrbgrwwgwrwgbr
ubuguruwbrrrgbwwgrgggrruwgggrgrbgrgwubggbrbuubw
grurrbguuubuggbbguurbwwbrrurguwurubrbgwggrguwbrrgburruugb
wrgbgrugrwwgwbgubbwbbrwubruggruuguuwubwgwurubggrbgwurrrrr
wrgrwuguggwwurbwubgwrbrugbruruwuurgurbbgrgr
wbbrguggbrbgwgwrugbuwrgbrgbuurrggggbrwgwwwuubbub
grrgwbwwbruugggburwbwgrbrggwgwwwwuwwbrwrbwr
guuwuuuwrgwwgbruugwwwrwuggrrgwbwwruuuuubububrwrbgurbw
rrwrrurggwurggguurrrrurwugwwrruwrruubwrbbguubww
grrwgrrrwbubggrrwbbgggbgwbbwubrbwwugugggwbg
wrgrrggwurbwbrguwrurwbwrbrbrggggrguwbwgwgwrbggbgrbgrb
bwrbwbwurbrugggwbgbrguwrugugrruubrggbwuurrubub
wbgwwubuurwwubbwwgurgugbbbgrgwuwbbwrbgwbwguugurubr
bbbbruwuwgwbuuugrrbgugrwgrrwwggugrggugbbgrrbw
wrggrwwubwruwbugubgurrwrbrrwbgrgbgrruguuubgbbwuwbub
wgurrgubgrgbgggurgubbugbbbruruggrbggrgrwwrw
rurbwwuuugurguwgwguwurrruubuguwwrbbburrbrwwugrruuw
wwubwbggrurbwubbrwbuuruwbgugbwgwgrugubbwbub
ruwbrbuguwuuuwwbrbwguuwgrwuruugbrgbbwugubrrrgrgb
rwrbrwrbwuwbuubrugwrubwbuuwbubrwbrgurgwgbgrurwrruuwu
rugwbruruguuuwgrbwruggggwbgruwrwuggubgruurbubwug
wgruguuruwbrrbwubuwgbrwugrgubgrwgggbwwuggbwbb
gubuwrgurwrbrbrugrruuwgbbwubwwbgbgguwuuwwgrbrwuwr
grrrgwguwrgbrbbwbbrwbgugwbrgggggbbrrurbbgbggwbuugwugb
gbrbggrbgrrbbggggubbbwuugubgggbgbrurburugwwwurwwuuw
wrgguubrrwbrrugwuuruurwbuuwgwbuugubgbrbbrrbgrbgwrrrwrgguww
uwwburbrrururbrwgrwrgrbuwubgugwwwgwgwrrurggu
rgubgrwgruwwwgrrruwrububgrrwuubbwrguuwwrrubururguwgbrg
gguwbrrrrgwbbgrrbubugrgwwbbgwrgrguwuwwrwbwwgubbgubbuwuwgw
rwgrwrbuwbwrrwrrbrrbbbuubgrgbrgugbuuuwbuuw
rgguwggrbrurwrrgbruwbguwwwrubwurbrbrwwbwwggrrrwbwg
rwruubwuwguwrurrubwuubbburwubbwwguguurggbbwuwb
wgwubbbrrbgbwrgubrgguurrrbuurwubbbguubguuuurguwwr
grwwbgggrbbrbwgrwbuuuruwwgbbuguurgburbrgugurwb
rgugwuuubgubwwwwbbuurwwwburrrgurbwbgbuwwruuugu
gurrwwgrgwrbrbbgurbwrrbubrbuwbuurrrguugggrrbwugbb
wgwburbwwbubrgurgbbugwrbbrwggwgbwbrbgwburbbugbrrbggbwwwwg
uwubgbbubwrbbbubgbbgwbuguububruubbbwuwrububbg
ubgbbuwgwrbrggrbrwrgubbubrbbuurrgwbrggbuuwwwrgwubwrbbwb
wgrbrwwwgrbgruwbbwgbggwuugggwggbrwrwbburgubgburrwrrwrwbw
wrgrbgrbugubrwwwwuubbrbrbrwgwuwbbrgwrbwwrbwbrrubbrr
wrgbburuubwbrrggwurbwwbrwuwwugrwrbwwbwgrwwwrbrurubrgrbw
rwwbwgwbgggwuuwwbrwgwgrubwwwrrbgruubwrgguwrwr
rurbrwwruuuuugwgbbwgwrgrbbwbrwwruuuwwgrbgwbbbuurururwww
uwguwbuggubwuubururgbgurrbbugbwuwrgwwrbwwuuwruwuubgb
rwubrrrubgwubbgbubrrrrwbbbgbgrbbbuuwrwuggwgugr
buwrgbggrburwwrrwrrgbrwbwurwgwubgwbwgrrgwbwrrbrbrgrbgububb
wuuurwgbuwwwwuwbbugbrwurrgguwbbbbuuggwbrrwbgrbrgwrgrubug
bbuwbrubrwbgurwbwbguugwwgwrwbgbwruurwuwbuuruuggr
rbbrwwbbwuuwwuuurburrrgwgrwbbrrbuggwrwrgruugbu
gbrgubuurgbgguwwwwubbgrbwrrurburugbwgbubbwruuuuruuwbbgwguw
wurwggrggwwrwugbwgrwuuwrugbuuggbgrwrgwggrgugrgrwrrwbb
rgwrwuwuwrgubuwbgurwrgurwuuuwgwwrgwgrgruwuwwggwurwrbbuw
wrwwrgwbwgbugggrguuurwwuwrbrwrrruwwbrrrgrruubg
wbwrrruuurgrrrwrbuwbggbguwugrbwbggbuburgruwgbbruubrwbrgrur
uuubuguurruuwwurbuwbgwrrrbrbwrwbuwubugrrruwuggrrwb
rrbggbubgrruubbgubuwubbgwuubgbrruwuugggbrbuubgugg
buwugbwbbrugbwbgwurguwbwwbbgbbbuguwgrwburrgggbgbguruww
wrgbgwurgrbrggrburguuubugbwgugrwbwwwwbbuubw
gwruuubuubbbwurbgurrrbwwbburguugbwbrrgbubrwwrrwwgbbgbu
wgubuugggrugrwrrggugguwgbwwwruuuwwurwbwgwbbwgr
buwwwgrruuuwrwgggbbggbguuwwugwwguuuuuruubrruubbuwubggbgwrg
gwrgbgubrwuruwuruguubbuwrbggwwrguugrrgwwbbwgwrbbwbgguuw
wrgrbwuburwgwggggrrbrgrbbguuwuwbgrbwbubbbbb
wuuurbguuwrurgggrwbgwrbgggrgrggrwuwguwrrugugrugwbuwbrug
ugbubbugwbwgugbwuurwbuugbgwbgwgbrurgruuruubgugbwugwubu
rgguwubwruubugbrrguruugrrwbrgggurrgbugwbrggu
ggwrgrrrrwrggbbwwuwgbrrrugrrubwwwrgrruugurwgrbgwbg
gugwrgwbugugrruubbbgugrwuurbruubwrrbbuuubbb
gbuuggruguburwbrrbrggrguwguubugbwggbgwuwrwgrgub
urbwrguguuwrugrbwgrrgbwrwrwwuuwgbgwbururggwurgrw
wuwurrubrwubugbgwgwwuguugbgbuwrwbuwrgbggrurgruwuwuuu
grrugwbrrbbwbrgguuwbubbgrugrwbwrurwggbwwwr
rwbggurbrwubrbgwuwruwbrgwwgrubuuuurbbggbwrrrwur
wwbugrgrgruwrgbugrwrgwgrbruuuuubbubrwbwrgrb
wbbbrgwwrrrwwbrrwwwuwugwbrwgrbwuwuggbuwruuugubgbg
wrgbuggbbrbrubgubbbuwrubbuwwgbggbbwgrwrruwgguwguwruubw
guggwbwbgrrubbrwrrwgugguuuwrgbwgbbguwbbubw

View File

@@ -1,141 +0,0 @@
#############################################################################################################################################
#...###.....#...#...#...#...#...#...###...#.....#.........#...#.......#...#.....#...#.........###...#.....#.............#...#...#.......#...#
#.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.###.#.#######.#.#.#.#####.#.#.#.###.#.#.#.#######.###.#.#.###.#.###########.#.#.#.#.#.#####.#.#.#
#.#.#...#...#.#...#...#...#...#...#...#.#...#...#.#.......#.#.#.#.....#.#.#...#...#.#.#.......#...#...#...#.#.....#.....#.#.#.#.#.#.....#.#.#
#.#.#.###.###.#######################.#.#####.###.#.#######.#.#.#.#####.#.###.#####.#.#.#######.#######.###.#.###.#.#####.#.#.#.#.#.#####.#.#
#.#.#...#.###.....#.............#...#.#.#...#.#...#.#...###.#...#.......#.#...#...#.#.#.###.....#.....#.....#.###...#.....#.#.#...#.......#.#
#.#.###.#.#######.#.###########.#.#.#.#.#.#.#.#.###.#.#.###.#############.#.###.#.#.#.#.###.#####.###.#######.#######.#####.#.#############.#
#.#.....#.#...#...#...#.....###...#.#.#.#.#...#...#...#...#.#...#.........#.....#.#...#...#.......#...#...#...#...###.....#.#.#.............#
#.#######.#.#.#.#####.#.###.#######.#.#.#.#######.#######.#.#.#.#.###############.#######.#########.###.#.#.###.#.#######.#.#.#.#############
#.......#.#.#.#.......#...#...#.....#.#.#.#...###.#.......#...#.#.#.......#...#...#.......#.....###.#...#...###.#...#.....#...#...#.........#
#######.#.#.#.###########.###.#.#####.#.#.#.#.###.#.###########.#.#.#####.#.#.#.###.#######.###.###.#.#########.###.#.###########.#.#######.#
#...#...#.#.#.#...###...#...#.#.....#.#.#...#.#...#.#...###.....#...#.....#.#.#.#...###...#...#.#...#.#...#...#...#...#...........#.#.......#
#.#.#.###.#.#.#.#.###.#.###.#.#####.#.#.#####.#.###.#.#.###.#########.#####.#.#.#.#####.#.###.#.#.###.#.#.#.#.###.#####.###########.#.#######
#.#.#...#.#.#.#.#...#.#...#.#.#...#.#.#.#.....#.#...#.#...#.....#.....###...#...#.#...#.#.#...#.#...#.#.#...#...#...#...#...#.....#.#.......#
#.#.###.#.#.#.#.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.###.#####.#.#######.#######.#.#.#.#.#.###.###.#.#.#######.###.#.###.#.#.###.#.#######.#
#.#.....#.#.#.#.#...#...#...#...#...#...#.......#.....#...#...#.#.......#.....#...#.#.#.#.#...#.###.#.#.....#...#...#.....#...#...#.#.......#
#.#######.#.#.#.#.#####.###############################.###.#.#.#######.#####.#.###.#.#.#.###.#.###.#.#####.#.###.#############.###.#.#######
#.......#...#.#.#...###...#...#.....#...#.............#.#...#.#.#.......#.....#.....#.#.#.#...#...#.#.###...#.###.#.............#...#.......#
#######.#####.#.###.#####.#.#.#.###.#.#.#.###########.#.#.###.#.#.#######.###########.#.#.#.#####.#.#.###.###.###.#.#############.#########.#
#.....#.....#.#.#...#...#...#.#.#...#.#.#.#.....#...#...#...#...#.....#...#...........#.#.#.....#...#.#...#...#...#.......###...#.#.........#
#.###.#####.#.#.#.###.#.#####.#.#.###.#.#.#.###.#.#.#######.#########.#.###.###########.#.#####.#####.#.###.###.#########.###.#.#.#.#########
#...#.......#...#...#.#.#...#...#.....#.#.#.#...#.#...###...#.........#...#...#.....#...#.#.....#...#.#...#.#...#...#.....#...#.#.#.#.......#
###.###############.#.#.#.#.###########.#.#.#.###.###.###.###.###########.###.#.###.#.###.#.#####.#.#.###.#.#.###.#.#.#####.###.#.#.#.#####.#
###.#.....#.......#...#.#.#.....#.......#...#.....#...#...#...#.....#...#.#...#...#.#.#...#...#...#...#...#...#...#.#...###...#...#...#...#.#
###.#.###.#.#####.#####.#.#####.#.#################.###.###.###.###.#.#.#.#.#####.#.#.#.#####.#.#######.#######.###.###.#####.#########.#.#.#
#...#.###...###...#...#...#.....#.........#...#.....###...#...#.#...#.#.#.#.###...#.#.#...#...#.#...###.....#...###...#...###.#.....#...#.#.#
#.###.#########.###.#.#####.#############.#.#.#.#########.###.#.#.###.#.#.#.###.###.#.###.#.###.#.#.#######.#.#######.###.###.#.###.#.###.#.#
#...#.#...#.....#...#.....#.#...###.......#.#...###...#...#...#.#.#...#.#.#...#...#.#.#...#.#...#.#...#...#.#.....###...#.....#...#...###...#
###.#.#.#.#.#####.#######.#.#.#.###.#######.#######.#.#.###.###.#.#.###.#.###.###.#.#.#.###.#.###.###.#.#.#.#####.#####.#########.###########
###...#.#.#...#...#.......#...#...#.......#...#...#.#...#...###.#.#...#.#...#.#...#.#.#...#.#.###.#...#.#.#.#.....#...#.#...#...#...#...#...#
#######.#.###.#.###.#############.#######.###.#.#.#.#####.#####.#.###.#.###.#.#.###.#.###.#.#.###.#.###.#.#.#.#####.#.#.#.#.#.#.###.#.#.#.#.#
#.......#.....#...#.........#...#.#...#...#...#.#.#.....#.#...#.#.#...#.#...#.#.#...#.#...#.#...#.#...#.#.#.#.....#.#.#...#...#.....#.#...#.#
#.###############.#########.#.#.#.#.#.#.###.###.#.#####.#.#.#.#.#.#.###.#.###.#.#.###.#.###.###.#.###.#.#.#.#####.#.#.###############.#####.#
#.......#...#.....#...#...#...#.#...#.#.#...###.#.#...#.#.#.#.#.#.#...#.#.#...#.#.###.#.###.#...#...#.#.#...#...#...#...###...#...#...#...#.#
#######.#.#.#.#####.#.#.#.#####.#####.#.#.#####.#.#.#.#.#.#.#.#.#.###.#.#.#.###.#.###.#.###.#.#####.#.#.#####.#.#######.###.#.#.#.#.###.#.#.#
#...###...#...#.....#...#.....#.....#...#.#...#.#.#.#...#...#.#.#...#.#.#.#.#...#...#.#...#.#...#...#.#.#.....#.........#...#...#...#...#...#
#.#.###########.#############.#####.#####.#.#.#.#.#.#########.#.###.#.#.#.#.#.#####.#.###.#.###.#.###.#.#.###############.###########.#######
#.#.#...###...#.............#.#...#.....#...#.#.#.#...#.......#...#...#.#.#.#.#.....#...#.#.#...#...#.#.#.............###.#.......#...#...###
#.#.#.#.###.#.#############.#.#.#.#####.#####.#.#.###.#.#########.#####.#.#.#.#.#######.#.#.#.#####.#.#.#############.###.#.#####.#.###.#.###
#.#...#.....#.#...#...#.....#...#.......#.....#.#.#...#.....#...#...#...#.#.#.#.#...#...#...#.#...#.#.#.#.......#...#.....#.....#.#.....#...#
#.###########.#.#.#.#.#.#################.#####.#.#.#######.#.#.###.#.###.#.#.#.#.#.#.#######.#.#.#.#.#.#.#####.#.#.###########.#.#########.#
#.#.....#...#...#...#...#...#...#...#...#.....#.#.#.......#...#.#...#...#.#...#...#.#.....#...#.#...#...#.....#...#...#...#.....#...........#
#.#.###.#.#.#############.#.#.#.#.#.#.#.#####.#.#.#######.#####.#.#####.#.#########.#####.#.###.#############.#######.#.#.#.#################
#.#.#...#.#.........#...#.#.#.#.#.#...#.....#...#.#.....#.#.....#...###.#.#.........#...#.#.....#...........#.......#.#.#.#...#...#...#...###
#.#.#.###.#########.#.#.#.#.#.#.#.#########.#####.#.###.#.#.#######.###.#.#.#########.#.#.#######.#########.#######.#.#.#.###.#.#.#.#.#.#.###
#.#.#.....#.......#.#.#...#.#.#.#.#.......#.#.....#.###.#.#...#...#...#...#.....#...#.#...###...#.........#.#...#...#...#...#...#...#.#.#...#
#.#.#######.#####.#.#.#####.#.#.#.#.#####.#.#.#####.###.#.###.#.#.###.#########.#.#.#.#######.#.#########.#.#.#.#.#########.#########.#.###.#
#...###...#.....#.#...#.....#.#...#.....#.#.#.....#...#.#...#...#...#...#.......#.#.#...###...#...........#...#...#...#####...........#...#.#
#######.#.#####.#.#####.#####.#########.#.#.#####.###.#.###.#######.###.#.#######.#.###.###.#######################.#.###################.#.#
#...#...#.#.....#.#...#.......#.........#...###...#...#.#...#.......#...#.#.....#.#...#...#.#...#...#.....#...#...#.#...###...#...#...#...#.#
#.#.#.###.#.#####.#.#.#########.###############.###.###.#.###.#######.###.#.###.#.###.###.#.#.#.#.#.#.###.#.#.#.#.#.###.###.#.#.#.#.#.#.###.#
#.#.#...#.#.....#.#.#.#...###...#.............#.#...###.#.#...#...#...###.#.#...#...#.#...#...#...#.#.#...#.#.#.#...#...#...#...#...#...#...#
#.#.###.#.#####.#.#.#.#.#.###.###.###########.#.#.#####.#.#.###.#.#.#####.#.#.#####.#.#.###########.#.#.###.#.#.#####.###.###############.###
#.#.....#.......#...#...#...#...#.#...#.......#...#...#...#...#.#.#.....#...#.#...#.#.#.#...........#.#.....#...#.....#...#...#.....#...#...#
#.#########################.###.#.#.#.#.###########.#.#######.#.#.#####.#####.#.#.#.#.#.#.###########.###########.#####.###.#.#.###.#.#.###.#
#.....#...#.............#...###...#.#...#...#####...#.......#...#.#.....###...#.#.#.#...#...........#.###.....#...###...#...#...###...#.....#
#####.#.#.#.###########.#.#########.#####.#.#####.#########.#####.#.#######.###.#.#.###############.#.###.###.#.#####.###.###################
#...#...#.#.#...........#...#.......#...#.#...#...#.........###...#.......#...#.#.#.#.............#.#.#...#...#.......#...#...#...#.........#
#.#.#####.#.#.#############.#.#######.#.#.###.#.###.###########.#########.###.#.#.#.#.###########.#.#.#.###.###########.###.#.#.#.#.#######.#
#.#.....#...#.............#.#...#.....#...#...#...#.#...###...#...#.......###.#.#...#...........#.#...#...#...........#...#.#.#.#.#.....#...#
#.#####.#################.#.###.#.#########.#####.#.#.#.###.#.###.#.#########.#.###############.#.#######.###########.###.#.#.#.#.#####.#.###
#.#...#...###...#.........#...#...#...#...#.......#...#.#...#...#.#.....#.....#.....#.....#.....#.#...###...........#.....#.#...#.###...#...#
#.#.#.###.###.#.#.###########.#####.#.#.#.#############.#.#####.#.#####.#.#########.#.###.#.#####.#.#.#############.#######.#####.###.#####.#
#.#.#...#.....#...#.....#...#...#...#...#.#...#...#...#...#...#.#.#.....#.......#...#...#.#.....#.#.#...............#.......#.....#...#.....#
#.#.###.###########.###.#.#.###.#.#######.#.#.#.#.#.#.#####.#.#.#.#.###########.#.#####.#.#####.#.#.#################.#######.#####.###.#####
#.#.###.....#...#...###...#...#.#...#...#...#...#...#.#.....#.#.#.#.....#.......#.#.....#.#.....#...#...............#...#.....#...#...#.#...#
#.#.#######.#.#.#.###########.#.###.#.#.#############.#.#####.#.#.#####.#.#######.#.#####.#.#########.#############.###.#.#####.#.###.#.#.#.#
#.#.#.......#.#.#.#.......###.#.###...#.#...#.......#.#.....#...#.#...#.#...#...#.#.....#.#...........#.........#...###.#.......#.....#...#.#
#.#.#.#######.#.#.#.#####.###.#.#######.#.#.#.#####.#.#####.#####.#.#.#.###.#.#.#.#####.#.#############.#######.#.#####.###################.#
#...#.#...#...#...#.....#.....#.......#...#...#...#.#...#...#.....#.#.#.###.#.#...#.....#.....#.......#.......#.#.#.....#.........#...#...#.#
#####.#.#.#.###########.#############.#########.#.#.###.#.###.#####.#.#.###.#.#####.#########.#.#####.#######.#.#.#.#####.#######.#.#.#.#.#.#
#...#...#...#.......###...#.........#.#.....#...#...#...#...#.......#.#.#...#...###...#.....#...#...#.........#...#.#.....#.....#.#.#.#.#...#
#.#.#########.#####.#####.#.#######.#.#.###.#.#######.#####.#########.#.#.#####.#####.#.###.#####.#.###############.#.#####.###.#.#.#.#.#####
#.#...........#...#.......#...#.....#...###.#.....###.......#...#.....#.#...#...#.....#.###.......#.......#...#...#.#.......#...#...#...#...#
#.#############.#.###########.#.###########.#####.###########.#.#.#####.###.#.###.#####.#################.#.#.#.#.#.#########.###########.#.#
#.#.............#.........#...#...........#.#...#.............#.#.#.....###.#...#.#.....#...........#...#...#.#.#.#.#.....#...#...........#.#
#.#.#####################.#.#############.#.#.#.###############.#.#.#######.###.#.#.#####.#########.#.#.#####.#.#.#.#.###.#.###.###########.#
#...#...#.................#.###...#...#...#...#.#.......#.......#...#.......#...#...#.....#.......#...#.......#.#...#...#...###.#.......#...#
#####.#.#.#################.###.#.#.#.#.#######.#.#####.#.###########.#######.#######.#####.#####.#############.#######.#######.#.#####.#.###
#.....#...#...#.....#.....#.#...#...#...#...###.#.....#.#.....###...#.........#.......#...#.#...#.....#...#.....#.....#.........#.....#...###
#.#########.#.#.###.#.###.#.#.###########.#.###.#####.#.#####.###.#.###########.#######.#.#.#.#.#####.#.#.#.#####.###.###############.#######
#.#.....#...#...###...###...#.............#...#...#...#.......#...#...#...#...#.........#...#.#.#...#...#...#.....###.#.......#.......#...###
#.#.###.#.###################################.###.#.###########.#####.#.#.#.#.###############.#.#.#.#########.#######.#.#####.#.#######.#.###
#...###...#.......###...#...#.........#.......###...###...###...#.....#.#.#.#.#############...#...#.#...#...#.......#.#.....#...#.......#...#
###########.#####.###.#.#.#.#.#######.#.###############.#.###.###.#####.#.#.#.#############.#######.#.#.#.#.#######.#.#####.#####.#########.#
#...........#...#.#...#...#...#.....#.#...#...#...#...#.#.#...#...#...#.#.#.#S#############.......#...#...#...#...#.#.#...#...###.#.........#
#.###########.#.#.#.###########.###.#.###.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.#####################.###########.#.#.#.#.#.#.###.###.#.#########
#.....#.......#.#...#...#.......#...#.#...#.#.#.#...#.#.#.#...#.#...#.#.#.#.........#########...#.#.........#...#...#...#...#.....#.........#
#####.#.#######.#####.#.#.#######.###.#.###.#.#.#####.#.#.###.#.#.###.#.#.#########.#########.#.#.#.#######.###############.###############.#
#.....#.#.......#.....#...#...###...#...###.#.#.....#...#...#.#.#.#...#.#.#...#...#.#########.#...#.#.......#.............#...#.............#
#.#####.#.#######.#########.#.#####.#######.#.#####.#######.#.#.#.#.###.#.#.#.#.#.#.#########.#####.#.#######.###########.###.#.#############
#.#...#.#.........#.........#.......#.......#.....#...#.....#.#...#.....#.#.#.#.#.#.#########.....#.#.....#...#.......#...###.#.........#...#
#.#.#.#.###########.#################.###########.###.#.#####.###########.#.#.#.#.#.#############.#.#####.#.###.#####.#.#####.#########.#.#.#
#...#...#...........#...#...#.........#...........###.#.....#.........#...#.#.#.#...#############...#...#...#...#...#.#.#...#.#...#.....#.#.#
#########.###########.#.#.#.#.#########.#############.#####.#########.#.###.#.#.#####################.#.#####.###.#.#.#.#.#.#.#.#.#.#####.#.#
#.......#...#...#.....#...#.#.#.......#...........#...#.....#...#...#.#.#...#.#.....#####......E#.....#.......###.#.#...#.#.#.#.#.#.......#.#
#.#####.###.#.#.#.#########.#.#.#####.###########.#.###.#####.#.#.#.#.#.#.###.#####.#####.#######.###############.#.#####.#.#.#.#.#########.#
#.....#.###...#...#...###...#.#.#...#...#...#...#.#...#.#...#.#...#...#.#...#.#...#.#.....#.....#.................#.....#.#.#.#.#.#.....#...#
#####.#.###########.#.###.###.#.#.#.###.#.#.#.#.#.###.#.#.#.#.#########.###.#.#.#.#.#.#####.###.#######################.#.#.#.#.#.#.###.#.###
###...#...#.........#.....#...#...#...#...#...#...#...#...#.#.....#.....#...#.#.#...#.......#...#...#...#...#.....#.....#.#.#...#.#.#...#.###
###.#####.#.###############.#########.#############.#######.#####.#.#####.###.#.#############.###.#.#.#.#.#.#.###.#.#####.#.#####.#.#.###.###
#...#.....#.......#.........#.........#.....#.....#.....#...###...#.#...#...#.#.#.............#...#.#.#.#.#...###...#.....#.#...#...#...#...#
#.###.###########.#.#########.#########.###.#.###.#####.#.#####.###.#.#.###.#.#.#.#############.###.#.#.#.###########.#####.#.#.#######.###.#
#...#...#.........#.###...###.......###.#...#.#...#...#.#.#...#.#...#.#.###.#.#.#.###...###...#.#...#.#.#...#...#...#.#.....#.#.#.....#.#...#
###.###.#.#########.###.#.#########.###.#.###.#.###.#.#.#.#.#.#.#.###.#.###.#.#.#.###.#.###.#.#.#.###.#.###.#.#.#.#.#.#.#####.#.#.###.#.#.###
###...#.#.........#.#...#...#.......#...#.#...#.#...#...#.#.#.#.#...#.#.....#.#.#.....#.#...#.#.#.#...#...#...#...#...#.......#...#...#.#...#
#####.#.#########.#.#.#####.#.#######.###.#.###.#.#######.#.#.#.###.#.#######.#.#######.#.###.#.#.#.#####.#########################.###.###.#
#.....#.........#...#.....#...#...#...#...#.#...#...#.....#.#.#...#...###.....#.....#...#.###...#.#.###...#...#...#...#.............###...#.#
#.#############.#########.#####.#.#.###.###.#.#####.#.#####.#.###.#######.#########.#.###.#######.#.###.###.#.#.#.#.#.#.#################.#.#
#.....#...#...#.......###.#.....#.#.###...#.#...#...#.....#.#.#...#.......#...#...#.#...#.....###.#.#...#...#...#.#.#.#.............#.....#.#
#####.#.#.#.#.#######.###.#.#####.#.#####.#.###.#.#######.#.#.#.###.#######.#.#.#.#.###.#####.###.#.#.###.#######.#.#.#############.#.#####.#
#.....#.#...#.......#.....#.#.....#...###...#...#.......#...#.#.###.#.....#.#.#.#.#.#...#...#...#...#...#.###...#.#.#.#...#...#.....#.#...#.#
#.#####.###########.#######.#.#######.#######.#########.#####.#.###.#.###.#.#.#.#.#.#.###.#.###.#######.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.#
#.....#.#...........#...#...#.....#...#.......#...#.....#.....#...#...#...#.#.#.#.#.#.#...#.#...#.......#.....#.#...#...#...#.#.....#...#.#.#
#####.#.#.###########.#.#.#######.#.###.#######.#.#.#####.#######.#####.###.#.#.#.#.#.#.###.#.###.#############.#############.#####.#####.#.#
#.....#.#...........#.#.#...###...#...#...#...#.#.#.....#...#...#.###...#...#.#.#.#.#.#.#...#.#...#.....#.....#.............#.#...#.....#.#.#
#.#####.###########.#.#.###.###.#####.###.#.#.#.#.#####.###.#.#.#.###.###.###.#.#.#.#.#.#.###.#.###.###.#.###.#############.#.#.#.#####.#.#.#
#...#...#...........#.#...#.#...#...#...#...#...#.#.....###.#.#.#.#...#...###.#.#...#...#...#.#.#...###.#...#.#...#.....#...#...#.......#...#
###.#.###.###########.###.#.#.###.#.###.#########.#.#######.#.#.#.#.###.#####.#.###########.#.#.#.#####.###.#.#.#.#.###.#.###################
###.#...#...........#.#...#.#...#.#...#.#.........#.###.....#.#.#.#...#.....#.#...#.......#.#.#.#...#...#...#.#.#.#...#.#...###.............#
###.###.###########.#.#.###.###.#.###.#.#.#########.###.#####.#.#.###.#####.#.###.#.#####.#.#.#.###.#.###.###.#.#.###.#.###.###.###########.#
#...#...###.........#.#.....#...#...#...#.........#...#.#.....#.#.###...#...#.....#.....#...#.#.#...#...#...#.#.#.#...#...#.....#...#...#...#
#.###.#####.#########.#######.#####.#############.###.#.#.#####.#.#####.#.#############.#####.#.#.#####.###.#.#.#.#.#####.#######.#.#.#.#.###
#.....#.....#.....#...#.......#.....#...#.........#...#.#...###.#.#.....#.#...###.......#...#.#.#.#.....#...#...#.#.....#.#.......#.#.#.#...#
#######.#####.###.#.###.#######.#####.#.#.#########.###.###.###.#.#.#####.#.#.###.#######.#.#.#.#.#.#####.#######.#####.#.#.#######.#.#.###.#
#.......#...#.#...#.###...#...#.....#.#.#.......#...###...#.#...#.#.....#...#...#...#...#.#.#.#.#.#.....#.....#...#.....#.#.......#...#...#.#
#.#######.#.#.#.###.#####.#.#.#####.#.#.#######.#.#######.#.#.###.#####.#######.###.#.#.#.#.#.#.#.#####.#####.#.###.#####.#######.#######.#.#
#...#...#.#.#.#...#...#...#.#.....#...#.#.......#.....#...#.#.#...#.....#.......###.#.#.#.#...#.#.#...#.#.....#...#.....#...#.....#.....#.#.#
###.#.#.#.#.#.###.###.#.###.#####.#####.#.###########.#.###.#.#.###.#####.#########.#.#.#.#####.#.#.#.#.#.#######.#####.###.#.#####.###.#.#.#
#...#.#.#.#.#.#...#...#.....#.....#.....#.#.....#.....#.#...#.#...#.#...#.......#...#.#.#.....#.#.#.#...#...#...#.#.....#...#.......#...#...#
#.###.#.#.#.#.#.###.#########.#####.#####.#.###.#.#####.#.###.###.#.#.#.#######.#.###.#.#####.#.#.#.#######.#.#.#.#.#####.###########.#######
#...#.#.#.#.#.#...#.#.......#.....#.....#.#.#...#.....#.#.###...#.#.#.#.#.....#.#.#...#...#...#.#.#...#.....#.#...#.....#.#...#.......#...###
###.#.#.#.#.#.###.#.#.#####.#####.#####.#.#.#.#######.#.#.#####.#.#.#.#.#.###.#.#.#.#####.#.###.#.###.#.#####.#########.#.#.#.#.#######.#.###
#...#.#.#.#.#.#...#.#.#...#.......#...#.#.#.#...#...#.#.#.#...#...#...#.#.###.#.#.#.....#.#.#...#...#.#.....#.#...#...#.#.#.#.#...#.....#...#
#.###.#.#.#.#.#.###.#.#.#.#########.#.#.#.#.###.#.#.#.#.#.#.#.#########.#.###.#.#.#####.#.#.#.#####.#.#####.#.#.#.#.#.#.#.#.#.###.#.#######.#
#.#...#...#.#.#.#...#...#...#...#...#.#.#.#...#.#.#.#.#.#...#...#.......#...#.#.#...#...#.#.#.#.....#.#.....#.#.#...#.#.#.#.#...#...#...#...#
#.#.#######.#.#.#.#########.#.#.#.###.#.#.###.#.#.#.#.#.#######.#.#########.#.#.###.#.###.#.#.#.#####.#.#####.#.#####.#.#.#.###.#####.#.#.###
#.#...#.....#.#.#.#.........#.#.#...#.#.#.#...#.#.#.#.#.#...#...#...#...#...#.#.#...#.#...#.#.#.#.....#.....#.#.....#.#.#.#...#...#...#.#...#
#.###.#.#####.#.#.#.#########.#.###.#.#.#.#.###.#.#.#.#.#.#.#.#####.#.#.#.###.#.#.###.#.###.#.#.#.#########.#.#####.#.#.#.###.###.#.###.###.#
#.....#.......#...#...........#.....#...#...###...#...#...#...#####...#...###...#.....#.....#...#...........#.......#...#.....###...###.....#
#############################################################################################################################################

View File

@@ -1,5 +0,0 @@
340A
149A
582A
780A
463A

View File

@@ -1,50 +0,0 @@
....K..........................8.................z
.....n..............r...........z.................
.......................w....8.............3...E...
.....Q.....U..4.........8.........................
...............rc...w........i....................
...........K.........i..2.........................
..................4.....i.........................
K.....n....................w...........z..........
..U......Q........................I...............
..........i.....I.....Q....g....................5E
..Q......................................5........
..........c............8......w...g..........5....
.............................I.O..................
.Z.............4....b.....................k.......
..n........4......r..g..6..c.............3........
....Z............c................................
...................................x..............
.......................................O..........
...............U...................E..........5...
.....f..........................OI3......k........
..m.......o......F.......R........x...............
m...........o..v6..3...............X..............
..............H6v.....F.g.....................W...
...........o....Fb....v...............E...........
...Z.............a................................
......U6.............V............................
.9.............b..............pTk.................
.......m........V.........H1....x.................
...m.................H....................MX......
............t.a............H......................
........Z...a............v.....1..T..p.W..X.......
.............................9...x.......p........
.....J.....................V..1................0..
...........r..j..........a............pT..........
.G..................J...N......f..................
...........G......T....B........W.e...........M...
..........j.............Rk.............M..........
.........q.............MB......R.F..1..P....X...f.
............................V....o...........h....
...........................................W......
......b......u............................e.......
.............................................0....
..CA....Gt..O........................7.....e....0.
C.u......A..9J..N........................h.....e..
uj....q..........N.2..................7...........
G....N.....uJ...............................0.....
.................B................P.......h.......
...C....q...........R.........P...................
.....q..tC....2.9.....B............P....f.........
...............2.................................7

File diff suppressed because one or more lines are too long

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2024::days::d1; use y2024::days::d1;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d10;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/10_input.txt")).unwrap();
println!("{}", d10::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/10_input.txt")).unwrap();
println!("{}", d10::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d11;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/11_input.txt")).unwrap();
println!("{}", d11::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/11_input.txt")).unwrap();
println!("{}", d11::process_part2(&content, 75));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d12;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/12_input.txt")).unwrap();
println!("{}", d12::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/12_input.txt")).unwrap();
println!("{}", d12::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d13;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/13_input.txt")).unwrap();
println!("{}", d13::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/13_input.txt")).unwrap();
println!("{}", d13::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d14;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/14_input.txt")).unwrap();
println!("{}", d14::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/14_input.txt")).unwrap();
d14::process_part2(&content);
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d15;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/15_input.txt")).unwrap();
println!("{}", d15::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/15_input.txt")).unwrap();
println!("{}", d15::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d16;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/16_input.txt")).unwrap();
println!("{}", d16::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/16_input.txt")).unwrap();
println!("{}", d16::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d17;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/17_input.txt")).unwrap();
println!("{}", d17::process_part1(&content).0);
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/17_input.txt")).unwrap();
println!("{}", d17::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d18;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/18_input.txt")).unwrap();
println!("{}", d18::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/18_input.txt")).unwrap();
println!("{}", d18::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d19;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/19_input.txt")).unwrap();
println!("{}", d19::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/19_input.txt")).unwrap();
println!("{}", d19::process_part2(&content));
}

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2024::days::d2; use y2024::days::d2;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d20;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/20_input.txt")).unwrap();
println!("{}", d20::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/20_input.txt")).unwrap();
println!("{}", d20::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d21;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/21_input.txt")).unwrap();
println!("{}", d21::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/21_input.txt")).unwrap();
println!("{}", d21::process_part2(&content));
}

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2024::days::d3; use y2024::days::d3;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2024::days::d4; use y2024::days::d4;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2024::days::d5; use y2024::days::d5;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2024::days::d6; use y2024::days::d6;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,17 +1,10 @@
use std::{fs, time::Instant}; use std::fs;
use utils::time::get_elapsed_string;
use y2024::days::d7; use y2024::days::d7;
fn main() { fn main() {
let now = Instant::now();
println!("Part 1:");
part1(); part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2(); part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
} }
fn part1() { fn part1() {

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d8;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/8_input.txt")).unwrap();
println!("{}", d8::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/8_input.txt")).unwrap();
println!("{}", d8::process_part2(&content));
}

View File

@@ -1,27 +0,0 @@
use std::{fs, time::Instant};
use utils::time::get_elapsed_string;
use y2024::days::d9;
fn main() {
let now = Instant::now();
println!("Part 1:");
part1();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
let now = Instant::now();
println!("Part 2:");
part2();
println!("Ran in {}", get_elapsed_string(now.elapsed()));
}
fn part1() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/9_input.txt")).unwrap();
println!("{}", d9::process_part1(&content));
}
fn part2() {
let root = env!("CARGO_MANIFEST_DIR");
let content = fs::read_to_string(format!("{root}/resources/9_input.txt")).unwrap();
println!("{}", d9::process_part2(&content));
}

View File

@@ -1,332 +0,0 @@
use itertools::Itertools;
#[derive(Debug, Clone, Copy, Default, Hash, PartialEq, Eq)]
struct TrailTile {
coords: (i32, i32),
height: u8,
up: Option<bool>,
down: Option<bool>,
left: Option<bool>,
right: Option<bool>,
}
impl TrailTile {
fn get_neighbors(&self, map: &[Vec<TrailTile>]) -> Vec<TrailTile> {
let mut neighbors = Vec::new();
if let Some(up) = self.up {
if up {
let neighbor = map[self.coords.1 as usize - 1][self.coords.0 as usize];
if neighbor.height == self.height + 1 {
neighbors.push(neighbor);
}
}
}
if let Some(down) = self.down {
if down {
let neighbor = map[self.coords.1 as usize + 1][self.coords.0 as usize];
if neighbor.height == self.height + 1 {
neighbors.push(neighbor);
}
}
}
if let Some(left) = self.left {
if left {
let neighbor = map[self.coords.1 as usize][self.coords.0 as usize - 1];
if neighbor.height == self.height + 1 {
neighbors.push(neighbor);
}
}
}
if let Some(right) = self.right {
if right {
let neighbor = map[self.coords.1 as usize][self.coords.0 as usize + 1];
if neighbor.height == self.height + 1 {
neighbors.push(neighbor);
}
}
}
neighbors
}
}
pub fn process_part1(input: &str) -> i32 {
let map = input
.lines()
.enumerate()
.map(|(yidx, line)| {
line.as_bytes()
.iter()
.enumerate()
.map(|(xidx, &height)| TrailTile {
coords: (xidx as i32, yidx as i32),
height,
..Default::default()
})
.collect_vec()
})
.collect_vec();
let mut updated_map = Vec::new();
let mut trailheads = Vec::new();
for row in map.iter() {
let mut new_row = Vec::new();
for tile in row {
let up = match map.get((tile.coords.1 - 1) as usize) {
Some(row) => {
let up = row[tile.coords.0 as usize];
Some(up.height == tile.height + 1)
}
None => None,
};
let down = match map.get((tile.coords.1 + 1) as usize) {
Some(row) => {
let down = row[tile.coords.0 as usize];
Some(down.height == tile.height + 1)
}
None => None,
};
let left = map[tile.coords.1 as usize]
.get((tile.coords.0 - 1) as usize)
.map(|left| left.height == tile.height + 1);
let right = map[tile.coords.1 as usize]
.get((tile.coords.0 + 1) as usize)
.map(|right| right.height == tile.height + 1);
let tile = TrailTile {
up,
down,
left,
right,
..*tile
};
if tile.height == b'0' {
trailheads.push(tile);
}
//print!(
// "{}: {}, {} ",
// tile.height as char, tile.coords.0, tile.coords.1
//);
new_row.push(tile);
}
//println!();
updated_map.push(new_row);
}
let mut res = 0;
//println!("0 {trailheads:?}");
for trailhead in trailheads {
let mut neighbors = trailhead.get_neighbors(&updated_map);
//println!("1 {neighbors:?}");
for _idx in 2..=9 {
//println!("{idx}");
if neighbors.is_empty() {
//println!("empty");
break;
}
let inner_neighbors = neighbors.clone();
neighbors.clear();
for neighbor in inner_neighbors {
neighbors.extend_from_slice(&neighbor.get_neighbors(&updated_map));
}
//println!("{idx} {neighbors:?}");
}
res += neighbors.iter().unique().count();
}
res as i32
}
pub fn process_part2(input: &str) -> i32 {
let map = input
.lines()
.enumerate()
.map(|(yidx, line)| {
line.as_bytes()
.iter()
.enumerate()
.map(|(xidx, &height)| TrailTile {
coords: (xidx as i32, yidx as i32),
height,
..Default::default()
})
.collect_vec()
})
.collect_vec();
let mut updated_map = Vec::new();
let mut trailheads = Vec::new();
for row in map.iter() {
let mut new_row = Vec::new();
for tile in row {
let up = match map.get((tile.coords.1 - 1) as usize) {
Some(row) => {
let up = row[tile.coords.0 as usize];
Some(up.height == tile.height + 1)
}
None => None,
};
let down = match map.get((tile.coords.1 + 1) as usize) {
Some(row) => {
let down = row[tile.coords.0 as usize];
Some(down.height == tile.height + 1)
}
None => None,
};
let left = map[tile.coords.1 as usize]
.get((tile.coords.0 - 1) as usize)
.map(|left| left.height == tile.height + 1);
let right = map[tile.coords.1 as usize]
.get((tile.coords.0 + 1) as usize)
.map(|right| right.height == tile.height + 1);
let tile = TrailTile {
up,
down,
left,
right,
..*tile
};
if tile.height == b'0' {
trailheads.push(tile);
}
//print!(
// "{}: {}, {} ",
// tile.height as char, tile.coords.0, tile.coords.1
//);
new_row.push(tile);
}
//println!();
updated_map.push(new_row);
}
let mut res = 0;
//println!("0 {trailheads:?}");
for trailhead in trailheads {
let mut neighbors = trailhead.get_neighbors(&updated_map);
//println!("1 {neighbors:?}");
for _idx in 2..=9 {
//println!("{idx}");
if neighbors.is_empty() {
//println!("empty");
break;
}
let inner_neighbors = neighbors.clone();
neighbors.clear();
for neighbor in inner_neighbors {
neighbors.extend_from_slice(&neighbor.get_neighbors(&updated_map));
}
//println!("{idx} {neighbors:?}");
}
res += neighbors.len();
}
res as i32
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT_SMALL: &str = "0123
1234
8765
9876";
const INPUT_LARGE: &str = "89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732";
const INPUT_SIMPLIFIED_1: &str = "...0...
...1...
...2...
6543456
7.....7
8.....8
9.....9";
const INPUT_SIMPLIFIED_2: &str = "..90..9
...1.98
...2..7
6543456
765.987
876....
987....";
const INPUT_SIMPLIFIED_3: &str = "10..9..
2...8..
3...7..
4567654
...8..3
...9..2
.....01";
const INPUT_SIMPLIFIED_4: &str = ".....0.
..4321.
..5..2.
..6543.
..7..4.
..8765.
..9....";
const INPUT_SIMPLIFIED_5: &str = "012345
123456
234567
345678
4.6789
56789.";
#[test]
fn part1_small() {
let result = process_part1(INPUT_SMALL);
assert_eq!(result, 1);
}
#[test]
fn part1_large() {
let result = process_part1(INPUT_LARGE);
assert_eq!(result, 36);
}
#[test]
fn part1_simplified_1() {
let result = process_part1(INPUT_SIMPLIFIED_1);
assert_eq!(result, 2);
}
#[test]
fn part1_simplified_2() {
let result = process_part1(INPUT_SIMPLIFIED_2);
assert_eq!(result, 4);
}
#[test]
fn part1_simplified_3() {
let result = process_part1(INPUT_SIMPLIFIED_3);
assert_eq!(result, 3);
}
#[test]
fn part2_small() {
let result = process_part2(INPUT_SMALL);
assert_eq!(result, 16);
}
#[test]
fn part2_large() {
let result = process_part2(INPUT_LARGE);
assert_eq!(result, 81);
}
#[test]
fn part2_simplified_2() {
let result = process_part2(INPUT_SIMPLIFIED_2);
assert_eq!(result, 13);
}
#[test]
fn part2_simplified_4() {
let result = process_part2(INPUT_SIMPLIFIED_4);
assert_eq!(result, 3);
}
#[test]
fn part2_simplified_5() {
let result = process_part2(INPUT_SIMPLIFIED_5);
assert_eq!(result, 227);
}
}

View File

@@ -1,155 +0,0 @@
use std::collections::HashMap;
use itertools::Itertools;
pub fn process_part1(input: &str) -> u64 {
let stones = input
.split_whitespace()
.map(|stone| stone.parse::<u64>().unwrap())
.collect_vec();
let mut result = stones;
for _ in 0..25 {
result = blink(result);
}
let mut test = HashMap::new();
for stone in result.iter() {
test.entry(stone)
.and_modify(|count| *count += 1)
.or_insert(1);
}
result.len() as u64
}
pub fn process_part2(input: &str, blinks: u64) -> u64 {
let mut stones: HashMap<u64, u64> = HashMap::new();
input.split_whitespace().for_each(|stone| {
let stone = stone.parse::<u64>().unwrap();
stones
.entry(stone)
.and_modify(|count| *count += 1)
.or_insert(1);
});
let mut stones_after: HashMap<u64, u64> = HashMap::new();
for _idx in 0..blinks {
for (stone, count) in stones.iter() {
if *stone == 0 {
stones_after
.entry(1)
.and_modify(|inner_count| *inner_count += count)
.or_insert(*count);
} else if (((*stone as f64).log10() + 1.0).floor() as u64) % 2 == 0 {
let num_digits = ((*stone as f64).log10() + 1.0).floor() as u64;
let digits_per_side = num_digits / 2;
let left = stone / 10_u64.pow(digits_per_side as u32);
let right = stone % 10_u64.pow(digits_per_side as u32);
stones_after
.entry(left)
.and_modify(|inner_count| *inner_count += count)
.or_insert(*count);
stones_after
.entry(right)
.and_modify(|inner_count| *inner_count += count)
.or_insert(*count);
//stones_after.push(left);
//stones_after.push(right);
} else {
let new_stone = stone * 2024;
stones_after
.entry(new_stone)
.and_modify(|inner_count| *inner_count += count)
.or_insert(*count);
//stones_after.push(stone * 2024);
}
}
stones = stones_after.clone();
stones_after.clear();
}
stones
.into_values()
.reduce(|acc, count| acc + count)
.unwrap()
}
fn blink(stones: Vec<u64>) -> Vec<u64> {
let mut stones_after = Vec::new();
for stone in stones {
if stone == 0 {
stones_after.push(1);
continue;
}
let num_digits = ((stone as f64).log10() + 1.0).floor() as u64;
if num_digits % 2 == 0 {
let digits_per_side = num_digits / 2;
let left = stone / 10_u64.pow(digits_per_side as u32);
let right = stone % 10_u64.pow(digits_per_side as u32);
stones_after.push(left);
stones_after.push(right);
} else {
stones_after.push(stone * 2024);
}
}
stones_after
}
#[cfg(test)]
mod tests {
use itertools::Itertools;
use super::*;
const INPUT_1: &str = "0 1 10 99 999";
const INPUT_2: &str = "125 17";
#[test]
fn test_blink_1() {
let stones = INPUT_1
.split_whitespace()
.map(|stone| stone.parse::<u64>().unwrap())
.collect_vec();
let stones = blink(stones);
assert_eq!(stones, vec![1, 2024, 1, 0, 9, 9, 2021976]);
}
#[test]
fn test_blink_2() {
let stones = INPUT_2
.split_whitespace()
.map(|stone| stone.parse::<u64>().unwrap())
.collect_vec();
let mut result = stones;
for _ in 0..6 {
result = blink(result);
}
assert_eq!(
result,
vec![
2097446912, 14168, 4048, 2, 0, 2, 4, 40, 48, 2024, 40, 48, 80, 96, 2, 8, 6, 7, 6,
0, 3, 2
]
);
}
#[test]
fn part1() {
let result = process_part1(INPUT_2);
assert_eq!(result, 55312);
}
#[test]
fn part2_1() {
let result = process_part2(INPUT_1, 1);
assert_eq!(result, 7);
}
#[test]
fn part2_2() {
let result = process_part2(INPUT_2, 6);
assert_eq!(result, 22);
}
#[test]
fn part2_3() {
let result = process_part2(INPUT_2, 25);
assert_eq!(result, 55312);
}
}

View File

@@ -1,348 +0,0 @@
use std::{collections::HashMap, fmt::Display};
use itertools::Itertools;
#[derive(Debug)]
enum Reason {
WrongPlotType,
AlreadyInRegion,
PlotNotNeighbor,
WrongRegionType,
MergeImpossible,
}
impl Display for Reason {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let reason_str = match self {
Reason::WrongPlotType => "Could not add plot. Wrong plant type!",
Reason::AlreadyInRegion => "Could not add plot. Already in region!",
Reason::PlotNotNeighbor => "Could not add plot. Not a Neighbor!",
Reason::WrongRegionType => "Could not merge regions. Incompatible plant types!",
Reason::MergeImpossible => "Could not merge Regions!",
};
write!(f, "{reason_str}")
}
}
#[derive(Debug, Clone)]
struct Region {
plant: char,
plots: Vec<(u32, u32)>,
}
impl Region {
fn add(&mut self, new_plot: (char, (u32, u32))) -> Result<(), Reason> {
if new_plot.0 != self.plant {
return Err(Reason::WrongPlotType);
}
let new_plot = new_plot.1;
for plot in self.plots.iter() {
if (plot.0.abs_diff(new_plot.0) == 1 && plot.1 == new_plot.1)
|| (plot.1.abs_diff(new_plot.1) == 1 && plot.0 == new_plot.0)
{
self.plots.push(new_plot);
return Ok(());
} else if *plot == new_plot {
return Err(Reason::AlreadyInRegion);
}
}
Err(Reason::PlotNotNeighbor)
}
fn merge(mut self, other: Self) -> Result<Self, Reason> {
if self.plant != other.plant {
return Err(Reason::WrongRegionType);
}
for plot in self.plots.clone() {
for other_plot in other.plots.clone().into_iter() {
if (plot.0.abs_diff(other_plot.0) == 1 && plot.1 == other_plot.1)
|| (plot.1.abs_diff(other_plot.1) == 1 && plot.0 == other_plot.0)
{
self.plots = [self.plots, other.plots]
.concat()
.into_iter()
.unique()
.collect_vec();
return Ok(self);
}
}
}
Err(Reason::MergeImpossible)
}
fn merge_multiple(regions: Vec<Region>) -> Region {
let mut merged_regions = regions[0].clone();
for region in regions[1..].iter() {
merged_regions = merged_regions.merge(region.clone()).unwrap();
}
merged_regions
}
fn area(&self) -> u32 {
self.plots.len() as u32
}
fn perimeter(&self) -> u32 {
let mut num_fence_elements = 0;
for plot in self.plots.iter() {
if plot.0 == 0 || !self.plots.contains(&(plot.0 - 1, plot.1)) {
num_fence_elements += 1;
}
if plot.1 == 0 || !self.plots.contains(&(plot.0, plot.1 - 1)) {
num_fence_elements += 1;
}
if !self.plots.contains(&(plot.0 + 1, plot.1)) {
num_fence_elements += 1;
}
if !self.plots.contains(&(plot.0, plot.1 + 1)) {
num_fence_elements += 1;
}
}
num_fence_elements
}
fn sides(&self) -> u32 {
let mut top_sides = HashMap::new();
let mut bottom_sides = HashMap::new();
let mut left_sides = HashMap::new();
let mut right_sides = HashMap::new();
for plot in self.plots.iter() {
if plot.0 == 0 || !self.plots.contains(&(plot.0 - 1, plot.1)) {
left_sides
.entry(plot.0)
.and_modify(|ys: &mut Vec<u32>| ys.push(plot.1))
.or_insert(vec![plot.1]);
}
if plot.1 == 0 || !self.plots.contains(&(plot.0, plot.1 - 1)) {
top_sides
.entry(plot.1)
.and_modify(|xs: &mut Vec<u32>| xs.push(plot.0))
.or_insert(vec![plot.0]);
}
if !self.plots.contains(&(plot.0, plot.1 + 1)) {
bottom_sides
.entry(plot.1)
.and_modify(|xs: &mut Vec<u32>| xs.push(plot.0))
.or_insert(vec![plot.0]);
}
if !self.plots.contains(&(plot.0 + 1, plot.1)) {
right_sides
.entry(plot.0)
.and_modify(|ys: &mut Vec<u32>| ys.push(plot.1))
.or_insert(vec![plot.1]);
}
}
let mut num_top_sides = top_sides.len() as u32;
for (_x, ys) in top_sides.iter_mut() {
ys.sort();
ys.windows(2).for_each(|window| {
if window[0].abs_diff(window[1]) != 1 {
num_top_sides += 1;
}
});
}
let mut num_bottom_sides = bottom_sides.len() as u32;
for (_x, ys) in bottom_sides.iter_mut() {
ys.sort();
ys.windows(2).for_each(|window| {
if window[0].abs_diff(window[1]) != 1 {
num_bottom_sides += 1;
}
});
}
let mut num_left_sides = left_sides.len() as u32;
for (_y, xs) in left_sides.iter_mut() {
xs.sort();
xs.windows(2).for_each(|window| {
if window[0].abs_diff(window[1]) != 1 {
num_left_sides += 1;
}
});
}
let mut num_right_sides = right_sides.len() as u32;
for (_y, xs) in right_sides.iter_mut() {
xs.sort();
xs.windows(2).for_each(|window| {
if window[0].abs_diff(window[1]) != 1 {
num_right_sides += 1;
}
});
}
num_top_sides + num_bottom_sides + num_left_sides + num_right_sides
}
}
pub fn process_part1(input: &str) -> u32 {
let mut regions: Vec<Region> = Vec::new();
input.lines().enumerate().for_each(|(y, line)| {
line.chars().enumerate().for_each(|(x, plant)| {
let mut added_regions_idx = Vec::new();
for (idx, region) in regions.iter_mut().enumerate() {
match region.add((plant, (x as u32, y as u32))) {
Ok(_) => added_regions_idx.push(idx),
Err(_) => continue,
}
}
if added_regions_idx.is_empty() {
regions.push(Region {
plant,
plots: vec![(x as u32, y as u32)],
});
} else if added_regions_idx.len() > 1 {
let regions_to_merge = regions
.iter()
.enumerate()
.filter(|&(idx, _region)| added_regions_idx.contains(&idx))
.map(|(_, region)| region)
.cloned()
.collect_vec();
let merged_region = Region::merge_multiple(regions_to_merge);
for idx in added_regions_idx.iter().rev() {
regions.remove(*idx);
}
regions.push(merged_region);
}
})
});
regions
.iter()
.map(|region| region.perimeter() * region.area())
.sum()
}
pub fn process_part2(input: &str) -> u32 {
let mut regions: Vec<Region> = Vec::new();
input.lines().enumerate().for_each(|(y, line)| {
line.chars().enumerate().for_each(|(x, plant)| {
let mut added_regions_idx = Vec::new();
for (idx, region) in regions.iter_mut().enumerate() {
match region.add((plant, (x as u32, y as u32))) {
Ok(_) => added_regions_idx.push(idx),
Err(_) => continue,
}
}
if added_regions_idx.is_empty() {
regions.push(Region {
plant,
plots: vec![(x as u32, y as u32)],
});
} else if added_regions_idx.len() > 1 {
let regions_to_merge = regions
.iter()
.enumerate()
.filter(|&(idx, _region)| added_regions_idx.contains(&idx))
.map(|(_, region)| region)
.cloned()
.collect_vec();
let merged_region = Region::merge_multiple(regions_to_merge);
for idx in added_regions_idx.iter().rev() {
regions.remove(*idx);
}
regions.push(merged_region);
}
})
});
regions
.iter()
.map(|region| region.sides() * region.area())
.sum()
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT_1: &str = "AAAA
BBCD
BBCC
EEEC";
const INPUT_2: &str = "OOOOO
OXOXO
OOOOO
OXOXO
OOOOO";
const INPUT_3: &str = "RRRRIICCFF
RRRRIICCCF
VVRRRCCFFF
VVRCCCJFFF
VVVVCJJCFE
VVIVCCJJEE
VVIIICJJEE
MIIIIIJJEE
MIIISIJEEE
MMMISSJEEE";
const INPUT_CUSTOM: &str = "XOX
OOO";
const INPUT_4: &str = "EEEEE
EXXXX
EEEEE
EXXXX
EEEEE";
const INPUT_5: &str = "AAAAAA
AAABBA
AAABBA
ABBAAA
ABBAAA
AAAAAA";
#[test]
fn part1_1() {
let result = process_part1(INPUT_1);
assert_eq!(result, 140);
}
#[test]
fn part1_2() {
let result = process_part1(INPUT_2);
assert_eq!(result, 772);
}
#[test]
fn part1_3() {
let result = process_part1(INPUT_3);
assert_eq!(result, 1930);
}
#[test]
fn part1_custom() {
let result = process_part1(INPUT_CUSTOM);
assert_eq!(result, 48);
}
#[test]
fn part2_1() {
let result = process_part2(INPUT_1);
assert_eq!(result, 80);
}
#[test]
fn part2_2() {
let result = process_part2(INPUT_2);
assert_eq!(result, 436);
}
#[test]
fn part2_3() {
let result = process_part2(INPUT_3);
assert_eq!(result, 1206);
}
#[test]
fn part2_4() {
let result = process_part2(INPUT_4);
assert_eq!(result, 236);
}
#[test]
fn part2_5() {
let result = process_part2(INPUT_5);
assert_eq!(result, 368);
}
}

View File

@@ -1,151 +0,0 @@
use core::panic;
#[derive(Debug, Clone, Copy)]
struct ClawMachine {
button_a: (i64, i64),
button_b: (i64, i64),
prize: (i64, i64),
}
impl ClawMachine {
fn parse(s: &str) -> Self {
let mut button_a = (0, 0);
let mut button_b = (0, 0);
let mut prize = (0, 0);
s.lines().for_each(|line| {
let (field, coords) = line.split_once(": ").unwrap();
if field == "Button A" {
let (x, y) = coords.split_once(", ").unwrap();
let x: i64 = x.split_once("+").unwrap().1.parse().unwrap();
let y: i64 = y.split_once("+").unwrap().1.parse().unwrap();
button_a = (x, y);
} else if field == "Button B" {
let (x, y) = coords.split_once(", ").unwrap();
let x: i64 = x.split_once("+").unwrap().1.parse().unwrap();
let y: i64 = y.split_once("+").unwrap().1.parse().unwrap();
button_b = (x, y);
} else if field == "Prize" {
let (x, y) = coords.split_once(", ").unwrap();
let x: i64 = x.split_once("=").unwrap().1.parse().unwrap();
let y: i64 = y.split_once("=").unwrap().1.parse().unwrap();
prize = (x, y);
} else {
panic!("Unknown machine information {line}");
}
});
Self {
button_a,
button_b,
prize,
}
}
fn correct(&mut self) {
self.prize.0 += 10000000000000;
self.prize.1 += 10000000000000;
}
fn parse_all(input: &str) -> Vec<Self> {
input.split("\n\n").map(Self::parse).collect()
}
//fn get_moves(&self) -> Option<(i64, i64)> {
// if self.prize.0 % self.button_b.0 == 0
// && self.prize.1 % self.button_b.1 == 0
// && self.prize.0 / self.button_b.0 == self.prize.1 / self.button_b.1
// {
// let b_moves = self.prize.0 / self.button_b.0;
// return Some((0, b_moves));
// }
// for b_presses in (1..=100).rev() {
// let after_b_moves = (self.button_b.0 * b_presses, self.button_b.1 * b_presses);
// if after_b_moves.0 < self.prize.0 && after_b_moves.1 < self.prize.1 {
// for a_presses in 1..=100 {
// let after_a_moves = (
// after_b_moves.0 + a_presses * self.button_a.0,
// after_b_moves.1 + a_presses * self.button_a.1,
// );
// if after_a_moves == self.prize {
// return Some((a_presses, b_presses));
// }
// }
// }
// }
// None
//}
}
pub fn process_part1(input: &str) -> i64 {
let machines = ClawMachine::parse_all(input);
machines
.iter()
.map(|machine| {
let p = machine.prize;
let a = machine.button_a;
let b = machine.button_b;
let bm = (p.1 * a.0 - p.0 * a.1) / (b.1 * a.0 - b.0 * a.1);
let am = (p.0 - bm * b.0) / a.0;
if p.0 != am * a.0 + bm * b.0 || p.1 != am * a.1 + bm * b.1 {
0
} else {
am * 3 + bm
}
})
.sum()
}
pub fn process_part2(input: &str) -> i64 {
let mut machines = ClawMachine::parse_all(input);
for machine in machines.iter_mut() {
machine.correct();
}
machines
.iter()
.map(|machine| {
let p = machine.prize;
let a = machine.button_a;
let b = machine.button_b;
let bm = (p.1 * a.0 - p.0 * a.1) / (b.1 * a.0 - b.0 * a.1);
let am = (p.0 - bm * b.0) / a.0;
if p.0 != am * a.0 + bm * b.0 || p.1 != am * a.1 + bm * b.1 {
0
} else {
am * 3 + bm
}
})
.sum()
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &str = "Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=12748, Y=12176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=7870, Y=6450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=18641, Y=10279";
#[test]
fn part1() {
let result = process_part1(INPUT);
assert_eq!(result, 480);
}
#[test]
fn part2() {
let result = process_part2(INPUT);
assert_eq!(result, 0);
}
}

View File

@@ -1,331 +0,0 @@
use std::{collections::HashMap, thread, time::Duration};
use itertools::Itertools;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Robot {
position: (i32, i32),
velocity: (i32, i32),
}
impl Robot {
fn parse(s: &str) -> Self {
let (p, v) = s.split_once(" ").unwrap();
let (_, p_x_y) = p.split_once("=").unwrap();
let (px, py) = p_x_y.split_once(",").unwrap();
let position: (i32, i32) = (px.parse().unwrap(), py.parse().unwrap());
let (_, v_x_y) = v.split_once("=").unwrap();
let (vx, vy) = v_x_y.split_once(",").unwrap();
let velocity: (i32, i32) = (vx.parse().unwrap(), vy.parse().unwrap());
Robot { position, velocity }
}
fn walk(&mut self, seconds: i32, grid_size: (i32, i32)) {
let movement = (
self.velocity.0 * seconds + self.position.0,
self.velocity.1 * seconds + self.position.1,
);
let mut position = (movement.0 % (grid_size.0), movement.1 % (grid_size.1));
if position.0 < 0 {
position.0 += grid_size.0;
}
if position.1 < 0 {
position.1 += grid_size.1;
}
self.position = position;
}
fn get_quadrant(&self, grid_size: (i32, i32)) -> i32 {
if self.position.0 == (grid_size.0 / 2) || self.position.1 == (grid_size.1 / 2) {
return 0;
}
let top = self.position.1 < grid_size.1 / 2;
let left = self.position.0 < grid_size.0 / 2;
match (top, left) {
(true, true) => 1,
(true, false) => 2,
(false, true) => 3,
(false, false) => 4,
}
}
fn print_robots(robots: &Vec<Self>, grid_size: (i32, i32)) {
let mut grid = vec![vec![0; grid_size.0 as usize]; grid_size.1 as usize];
for robot in robots {
let value = grid[robot.position.1 as usize][robot.position.0 as usize];
grid[robot.position.1 as usize][robot.position.0 as usize] = value + 1;
}
for row in grid {
for tile in row {
if tile == 0 {
print!(".");
} else {
print!("{tile}");
}
}
println!();
}
}
}
pub fn process_part1(input: &str) -> i32 {
let robots = input
.lines()
.map(|line| {
let mut robot = Robot::parse(line);
robot.walk(100, (101, 103));
robot
})
.collect_vec();
Robot::print_robots(&robots, (101, 103));
let mut quadrants = HashMap::new();
for robot in robots {
let quadrant = robot.get_quadrant((101, 103));
quadrants
.entry(quadrant)
.and_modify(|count| *count += 1)
.or_insert(1);
}
quadrants
.iter()
.filter(|(quadrant, _)| **quadrant != 0)
.map(|(_, count)| count)
.product()
}
pub fn process_part2(input: &str) {
let mut robots = input.lines().map(Robot::parse).collect_vec();
for seconds in 1..=10000 {
for robot in robots.iter_mut() {
robot.walk(1, (101, 103));
}
let mut quadrants = HashMap::new();
for robot in robots.iter() {
let quadrant = robot.get_quadrant((101, 103));
quadrants
.entry(quadrant)
.and_modify(|count| *count += 1)
.or_insert(1);
}
if quadrants.iter().any(|(_, count)| *count > robots.len() / 3) {
Robot::print_robots(&robots, (101, 103));
println!("{seconds} secs");
let half_sec = Duration::from_millis(1000);
thread::sleep(half_sec);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &str = "p=0,4 v=3,-3
p=6,3 v=-1,-3
p=10,3 v=-1,2
p=2,0 v=2,-1
p=0,0 v=1,3
p=3,0 v=-2,-2
p=7,6 v=-1,-3
p=3,0 v=-1,-2
p=9,3 v=2,3
p=7,3 v=-1,2
p=2,4 v=2,-3
p=9,5 v=-3,-3";
#[test]
fn part1_1() {
let mut robot = Robot {
position: (0, 4),
velocity: (3, -3),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (3, 5),
velocity: (3, -3),
};
assert_eq!(robot, result);
}
#[test]
fn part1_2() {
let mut robot = Robot {
position: (6, 3),
velocity: (-1, -3),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (5, 4),
velocity: (-1, -3),
};
assert_eq!(robot, result);
}
#[test]
fn part1_3() {
let mut robot = Robot {
position: (10, 3),
velocity: (-1, 2),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (9, 0),
velocity: (-1, 2),
};
assert_eq!(robot, result);
}
#[test]
fn part1_4() {
let mut robot = Robot {
position: (2, 0),
velocity: (2, -1),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (4, 5),
velocity: (2, -1),
};
assert_eq!(robot, result);
}
#[test]
fn part1_5() {
let mut robot = Robot {
position: (0, 0),
velocity: (1, 3),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (1, 6),
velocity: (1, 3),
};
assert_eq!(robot, result);
}
#[test]
fn part1_6() {
let mut robot = Robot {
position: (3, 0),
velocity: (-2, -2),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (1, 3),
velocity: (-2, -2),
};
assert_eq!(robot, result);
}
#[test]
fn part1_7() {
let mut robot = Robot {
position: (7, 6),
velocity: (-1, -3),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (6, 0),
velocity: (-1, -3),
};
assert_eq!(robot, result);
}
#[test]
fn part1_8() {
let mut robot = Robot {
position: (3, 0),
velocity: (-1, -2),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (2, 3),
velocity: (-1, -2),
};
assert_eq!(robot, result);
}
#[test]
fn part1_9() {
let mut robot = Robot {
position: (9, 3),
velocity: (2, 3),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (0, 2),
velocity: (2, 3),
};
assert_eq!(robot, result);
}
#[test]
fn part1_10() {
let mut robot = Robot {
position: (7, 3),
velocity: (-1, 2),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (6, 0),
velocity: (-1, 2),
};
assert_eq!(robot, result);
}
#[test]
fn part1_11() {
let mut robot = Robot {
position: (2, 4),
velocity: (2, -3),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (4, 5),
velocity: (2, -3),
};
assert_eq!(robot, result);
}
#[test]
fn part1_12() {
let mut robot = Robot {
position: (9, 5),
velocity: (-3, -3),
};
robot.walk(100, (11, 7));
let result = Robot {
position: (6, 6),
velocity: (-3, -3),
};
assert_eq!(robot, result);
}
#[test]
fn part1() {
let robots = INPUT
.lines()
.map(|line| {
let mut robot = Robot::parse(line);
robot.walk(100, (11, 7));
robot
})
.collect_vec();
Robot::print_robots(&robots, (11, 7));
let mut quadrants = HashMap::new();
for robot in robots {
let quadrant = robot.get_quadrant((11, 7));
quadrants
.entry(quadrant)
.and_modify(|count| *count += 1)
.or_insert(1);
}
println!("{quadrants:?}");
let result: i32 = quadrants
.iter()
.filter(|(quadrant, _)| **quadrant != 0)
.map(|(_, count)| count)
.product();
assert_eq!(result, 12);
}
}

View File

@@ -1,569 +0,0 @@
use std::error::Error;
use itertools::Itertools;
pub fn process_part1(input: &str) -> u32 {
let (grid, movements) = input.split_once("\n\n").unwrap();
let (mut grid, mut robot) = parse_grid(grid);
let movements = parse_movements(movements);
for movement in movements {
match movement {
Movement::Up => move_up(&mut robot, &mut grid),
Movement::Down => move_down(&mut robot, &mut grid),
Movement::Left => move_left(&mut robot, &mut grid),
Movement::Right => move_right(&mut robot, &mut grid),
}
}
log_grid(grid.clone());
grid.concat().iter().map(|tile| tile.get_gps()).sum()
}
pub fn process_part2(input: &str) -> u32 {
let (grid, movements) = input.split_once("\n\n").unwrap();
let (mut grid, mut robot) = parse_large_grid(grid);
let movements = parse_movements(movements);
for movement in movements {
match movement {
Movement::Up => move_up_large(&mut robot, &mut grid),
Movement::Down => move_down_large(&mut robot, &mut grid),
Movement::Left => move_left_large(&mut robot, &mut grid),
Movement::Right => move_right_large(&mut robot, &mut grid),
}
}
log_grid(grid.clone());
grid.concat().iter().map(|tile| tile.get_gps()).sum()
}
fn log_grid(grid: Vec<Vec<GridTile>>) {
for row in grid {
for tile in row {
match tile.entity {
GridTileType::Robot => print!("@"),
GridTileType::Crate => print!("O"),
GridTileType::Wall => print!("#"),
GridTileType::Nothing => print!("."),
GridTileType::BigCrateLeft => print!("["),
GridTileType::BigCrateRight => print!("]"),
}
}
println!();
}
}
fn parse_large_grid(input: &str) -> (Vec<Vec<GridTile>>, GridTile) {
let mut grid_entities = Vec::new();
let mut robot = GridTile {
entity: GridTileType::Robot,
..Default::default()
};
input.lines().enumerate().for_each(|(yidx, line)| {
let mut row_entities = Vec::new();
line.chars().enumerate().for_each(|(xidx, chara)| {
if let Ok(entity) = GridTileType::from_character(chara) {
match entity {
GridTileType::Robot => {
robot.coords = (xidx as u32 * 2, yidx as u32);
row_entities.push(robot);
row_entities.push(GridTile::default());
}
GridTileType::Crate => {
let entity = GridTile {
entity: GridTileType::BigCrateLeft,
coords: (xidx as u32 * 2, yidx as u32),
};
row_entities.push(entity);
let entity = GridTile {
entity: GridTileType::BigCrateRight,
coords: (xidx as u32 * 2 + 1, yidx as u32),
};
row_entities.push(entity);
}
GridTileType::Wall => {
let entity = GridTile {
entity,
coords: (xidx as u32 * 2, yidx as u32),
};
row_entities.push(entity);
let entity = GridTile {
entity: GridTileType::Wall,
coords: (xidx as u32 * 2 + 1, yidx as u32),
};
row_entities.push(entity);
}
GridTileType::Nothing => {
row_entities.push(GridTile::default());
row_entities.push(GridTile::default());
}
GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (),
}
}
});
grid_entities.push(row_entities);
});
(grid_entities, robot)
}
fn parse_grid(input: &str) -> (Vec<Vec<GridTile>>, GridTile) {
let mut grid_entities = Vec::new();
let mut robot = GridTile {
entity: GridTileType::Robot,
..Default::default()
};
input.lines().enumerate().for_each(|(yidx, line)| {
let mut row_entities = Vec::new();
line.chars().enumerate().for_each(|(xidx, chara)| {
if let Ok(entity) = GridTileType::from_character(chara) {
match entity {
GridTileType::Robot => {
robot.coords = (xidx as u32, yidx as u32);
row_entities.push(robot);
}
GridTileType::Crate | GridTileType::Wall => {
let entity = GridTile {
entity,
coords: (xidx as u32, yidx as u32),
};
row_entities.push(entity);
}
GridTileType::Nothing => row_entities.push(GridTile::default()),
GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (),
}
}
});
grid_entities.push(row_entities);
});
(grid_entities, robot)
}
fn parse_movements(input: &str) -> Vec<Movement> {
input
.lines()
.map(|line| {
line.chars()
.map(|chara| Movement::try_from(chara).unwrap())
.collect_vec()
})
.concat()
}
fn move_up(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) {
let (robot_x, robot_y) = robot.coords;
let mut moving_tiles = Vec::new();
for above in (0..robot_y).rev() {
let tile = grid[above as usize][robot_x as usize];
match tile.entity {
GridTileType::Robot => (),
GridTileType::Crate => moving_tiles.push(tile),
GridTileType::Wall => return,
GridTileType::Nothing => break,
GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (),
}
}
for tile in moving_tiles.iter_mut() {
tile.coords.1 -= 1;
grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile;
}
grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default();
robot.coords.1 -= 1;
grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot;
}
fn move_down(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) {
let (robot_x, robot_y) = robot.coords;
let height = grid.len();
let mut moving_tiles = Vec::new();
for below in robot_y..height as u32 {
let tile = grid[below as usize][robot_x as usize];
match tile.entity {
GridTileType::Robot => (),
GridTileType::Crate => moving_tiles.push(tile),
GridTileType::Wall => return,
GridTileType::Nothing => break,
GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (),
}
}
for tile in moving_tiles.iter_mut() {
tile.coords.1 += 1;
grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile;
}
grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default();
robot.coords.1 += 1;
grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot;
}
fn move_left(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) {
let (robot_x, robot_y) = robot.coords;
let mut moving_tiles = Vec::new();
for left in (0..robot_x).rev() {
let tile = grid[robot_y as usize][left as usize];
match tile.entity {
GridTileType::Robot => (),
GridTileType::Crate => moving_tiles.push(tile),
GridTileType::Wall => return,
GridTileType::Nothing => break,
GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (),
}
}
for tile in moving_tiles.iter_mut() {
tile.coords.0 -= 1;
grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile;
}
grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default();
robot.coords.0 -= 1;
grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot;
}
fn move_right(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) {
let (robot_x, robot_y) = robot.coords;
let mut moving_tiles = Vec::new();
let width = grid[0].len();
for right in robot_x..width as u32 {
let tile = grid[robot_y as usize][right as usize];
match tile.entity {
GridTileType::Robot => (),
GridTileType::Crate => moving_tiles.push(tile),
GridTileType::Wall => return,
GridTileType::Nothing => break,
GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (),
}
}
for tile in moving_tiles.iter_mut() {
tile.coords.0 += 1;
grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile;
}
grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default();
robot.coords.0 += 1;
grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot;
}
fn get_above(tile: &GridTile, grid: &[Vec<GridTile>]) -> Vec<GridTile> {
let (tile_x, tile_y) = tile.coords;
let mut above_tiles = Vec::new();
let above = grid[tile_y as usize - 1][tile_x as usize];
match above.entity {
GridTileType::Robot => (),
GridTileType::Crate => {
above_tiles.push(above);
above_tiles.extend_from_slice(&get_above(&above, grid));
}
GridTileType::BigCrateLeft => {
above_tiles.push(above);
let right = grid[above.coords.1 as usize][above.coords.0 as usize + 1];
above_tiles.push(above);
above_tiles.push(right);
above_tiles.extend_from_slice(&get_above(&above, grid));
above_tiles.extend_from_slice(&get_above(&right, grid));
}
GridTileType::BigCrateRight => {
above_tiles.push(above);
let left = grid[above.coords.1 as usize][above.coords.0 as usize - 1];
above_tiles.push(above);
above_tiles.push(left);
above_tiles.extend_from_slice(&get_above(&above, grid));
above_tiles.extend_from_slice(&get_above(&left, grid));
}
GridTileType::Wall => above_tiles.push(above),
GridTileType::Nothing => (),
}
above_tiles
}
fn get_below(tile: &GridTile, grid: &[Vec<GridTile>]) -> Vec<GridTile> {
let (tile_x, tile_y) = tile.coords;
let mut below_tiles = Vec::new();
let below = grid[tile_y as usize + 1][tile_x as usize];
match below.entity {
GridTileType::Robot => (),
GridTileType::Crate => {
below_tiles.push(below);
below_tiles.extend_from_slice(&get_below(&below, grid));
}
GridTileType::BigCrateLeft => {
below_tiles.push(below);
let right = grid[below.coords.1 as usize][below.coords.0 as usize + 1];
below_tiles.push(below);
below_tiles.push(right);
below_tiles.extend_from_slice(&get_below(&below, grid));
below_tiles.extend_from_slice(&get_below(&right, grid));
}
GridTileType::BigCrateRight => {
below_tiles.push(below);
let left = grid[below.coords.1 as usize][below.coords.0 as usize - 1];
below_tiles.push(below);
below_tiles.push(left);
below_tiles.extend_from_slice(&get_below(&below, grid));
below_tiles.extend_from_slice(&get_below(&left, grid));
}
GridTileType::Wall => below_tiles.push(below),
GridTileType::Nothing => (),
}
below_tiles
}
fn get_left(tile: &GridTile, grid: &[Vec<GridTile>]) -> Vec<GridTile> {
let (tile_x, tile_y) = tile.coords;
let mut left_tiles = Vec::new();
let left = grid[tile_y as usize][tile_x as usize - 1];
match left.entity {
GridTileType::Robot => (),
GridTileType::Crate | GridTileType::BigCrateLeft | GridTileType::BigCrateRight => {
left_tiles.push(left);
left_tiles.extend_from_slice(&get_left(&left, grid));
}
GridTileType::Wall => left_tiles.push(left),
GridTileType::Nothing => (),
}
left_tiles
}
fn get_right(tile: &GridTile, grid: &[Vec<GridTile>]) -> Vec<GridTile> {
let (tile_x, tile_y) = tile.coords;
let mut right_tiles = Vec::new();
let right = grid[tile_y as usize][tile_x as usize + 1];
match right.entity {
GridTileType::Robot => (),
GridTileType::Crate | GridTileType::BigCrateLeft | GridTileType::BigCrateRight => {
right_tiles.push(right);
right_tiles.extend_from_slice(&get_right(&right, grid));
}
GridTileType::Wall => right_tiles.push(right),
GridTileType::Nothing => (),
}
right_tiles
}
fn move_up_large(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) {
let mut moving_tiles = get_above(robot, grid);
if moving_tiles
.iter()
.map(|tile| tile.entity)
.contains(&GridTileType::Wall)
{
return;
}
moving_tiles.sort_by(|tile_a, tile_b| tile_a.coords.1.cmp(&tile_b.coords.1));
for tile in moving_tiles.iter_mut() {
grid[tile.coords.1 as usize][tile.coords.0 as usize] = GridTile::default();
tile.coords.1 -= 1;
grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile;
}
grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default();
robot.coords.1 -= 1;
grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot;
}
fn move_down_large(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) {
let mut moving_tiles = get_below(robot, grid);
if moving_tiles
.iter()
.map(|tile| tile.entity)
.contains(&GridTileType::Wall)
{
return;
}
moving_tiles.sort_by(|tile_a, tile_b| tile_b.coords.1.cmp(&tile_a.coords.1));
for tile in moving_tiles.iter_mut() {
grid[tile.coords.1 as usize][tile.coords.0 as usize] = GridTile::default();
tile.coords.1 += 1;
grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile;
}
grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default();
robot.coords.1 += 1;
grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot;
}
fn move_left_large(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) {
let mut moving_tiles = get_left(robot, grid);
if moving_tiles
.iter()
.map(|tile| tile.entity)
.contains(&GridTileType::Wall)
{
return;
}
for tile in moving_tiles.iter_mut() {
tile.coords.0 -= 1;
grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile;
}
grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default();
robot.coords.0 -= 1;
grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot;
}
fn move_right_large(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) {
let mut moving_tiles = get_right(robot, grid);
if moving_tiles
.iter()
.map(|tile| tile.entity)
.contains(&GridTileType::Wall)
{
return;
}
for tile in moving_tiles.iter_mut() {
tile.coords.0 += 1;
grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile;
}
grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default();
robot.coords.0 += 1;
grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot;
}
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)]
enum GridTileType {
Robot,
Crate,
BigCrateLeft,
BigCrateRight,
Wall,
#[default]
Nothing,
}
impl GridTileType {
fn from_character(value: char) -> Result<GridTileType, Box<dyn Error>> {
match value {
'#' => Ok(Self::Wall),
'O' => Ok(Self::Crate),
'@' => Ok(Self::Robot),
'.' => Ok(Self::Nothing),
_ => Err(Box::from(format!("{value} is not a valid entity"))),
}
}
}
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)]
struct GridTile {
entity: GridTileType,
coords: (u32, u32),
}
impl GridTile {
fn get_gps(&self) -> u32 {
if self.entity == GridTileType::Crate || self.entity == GridTileType::BigCrateLeft {
self.coords.0 + self.coords.1 * 100
} else {
0
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
enum Movement {
Up,
Down,
Left,
Right,
}
impl TryFrom<char> for Movement {
type Error = Box<dyn Error>;
fn try_from(value: char) -> std::result::Result<Movement, Box<dyn Error>> {
match value {
'^' => Ok(Self::Up),
'v' => Ok(Self::Down),
'<' => Ok(Self::Left),
'>' => Ok(Self::Right),
_ => Err(Box::from(format!("{value} is not a valid direction"))),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT_SMALL: &str = "#######
#...O..
#......";
const INPUT_MEDIUM: &str = "########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
<^^>>>vv<v>>v<<";
const INPUT_LARGE: &str = "##########
#..O..O.O#
#......O.#
#.OO..O.O#
#..O@..O.#
#O#..O...#
#O..O..O.#
#.OO.O.OO#
#....O...#
##########
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^";
const INPUT_LARGE_BOX_SIMPLE: &str = "#####
#..O.
#....";
const INPUT_LARGE_BOX_FULL: &str = "#######
#...#.#
#.....#
#..OO@#
#..O..#
#.....#
#######
<vv<<^^<<^^";
#[test]
fn part1_small() {
let (grid, _) = parse_grid(INPUT_SMALL);
let flat_grid = grid.concat();
let result: u32 = flat_grid.iter().map(|tile| tile.get_gps()).sum();
assert_eq!(result, 104);
}
#[test]
fn part1_medium() {
let result = process_part1(INPUT_MEDIUM);
assert_eq!(result, 2028);
}
#[test]
fn part1_large() {
let result = process_part1(INPUT_LARGE);
assert_eq!(result, 10092);
}
#[test]
fn part2_simple() {
let (grid, _) = parse_large_grid(INPUT_LARGE_BOX_SIMPLE);
let flat_grid = grid.concat();
let result: u32 = flat_grid.iter().map(|tile| tile.get_gps()).sum();
assert_eq!(result, 106);
}
#[test]
fn part2_full() {
let result = process_part2(INPUT_LARGE_BOX_FULL);
assert_eq!(result, 618);
}
#[test]
fn part2_large() {
let result = process_part2(INPUT_LARGE);
assert_eq!(result, 9021);
}
}

View File

@@ -1,448 +0,0 @@
use std::{collections::HashMap, error::Error};
use itertools::Itertools;
pub fn process_part1(input: &str) -> usize {
let mut start = (0, 0);
let mut end = (0, 0);
let grid = input
.lines()
.enumerate()
.map(|(yidx, row)| {
row.chars()
.enumerate()
.map(|(xidx, chara)| {
let tile = GridTile::try_from(chara).unwrap();
match tile {
GridTile::Wall | GridTile::Path => tile,
GridTile::Start => {
start = (xidx, yidx);
tile
}
GridTile::End => {
end = (xidx, yidx);
tile
}
}
})
.collect_vec()
})
.collect_vec();
let mut next_paths = vec![Reindeer {
coords: start,
..Default::default()
}];
let mut arrived: Vec<Reindeer> = Vec::new();
let mut visited = HashMap::new();
let mut iter = 0;
while !next_paths.is_empty() {
next_paths = next_paths
.iter()
.map(|reindeer| reindeer.get_all_next_paths(&grid))
.collect_vec()
.concat();
for (idx, reindeer) in next_paths.clone().iter().enumerate().rev() {
if let Some(score) = visited.get_mut(&reindeer.coords) {
if *score <= reindeer.score {
next_paths.remove(idx);
continue;
} else {
*score = reindeer.score;
}
} else {
visited.insert(reindeer.coords, reindeer.score);
}
if reindeer.state == ReindeerState::Arrived {
let arrived_reindeer = next_paths.remove(idx);
arrived.push(arrived_reindeer);
}
}
iter += 1;
}
println!("Iterations to goal {iter}");
arrived.iter().map(|reindeer| reindeer.score).min().unwrap()
}
pub fn process_part2(input: &str) -> usize {
let mut start = (0, 0);
let mut end = (0, 0);
let grid = input
.lines()
.enumerate()
.map(|(yidx, row)| {
row.chars()
.enumerate()
.map(|(xidx, chara)| {
let tile = GridTile::try_from(chara).unwrap();
match tile {
GridTile::Wall | GridTile::Path => tile,
GridTile::Start => {
start = (xidx, yidx);
tile
}
GridTile::End => {
end = (xidx, yidx);
tile
}
}
})
.collect_vec()
})
.collect_vec();
let mut smallest_score = usize::MAX;
let mut visited = HashMap::new();
visited.insert((start, Orientation::East), 0);
let mut next_paths = vec![Reindeer {
coords: start,
visited: visited.clone(),
..Default::default()
}];
let mut arrived: Vec<Reindeer> = Vec::new();
while !next_paths.is_empty() {
next_paths = next_paths
.iter()
.map(|reindeer| reindeer.get_all_next_paths(&grid))
.collect_vec()
.concat();
for (idx, reindeer) in next_paths.clone().iter().enumerate().rev() {
if reindeer.score > smallest_score
|| reindeer
.visited
.contains_key(&(reindeer.coords, reindeer.orientation))
{
next_paths.remove(idx);
continue;
}
next_paths[idx]
.visited
.insert((reindeer.coords, reindeer.orientation), reindeer.score);
if let Some(score) = visited.get_mut(&(reindeer.coords, reindeer.orientation)) {
if *score < reindeer.score {
next_paths.remove(idx);
continue;
} else {
*score = reindeer.score;
}
} else {
visited.insert((reindeer.coords, reindeer.orientation), reindeer.score);
}
if reindeer.state == ReindeerState::Arrived && reindeer.score <= smallest_score {
smallest_score = reindeer.score;
let arrived_reindeer = next_paths.remove(idx);
arrived.push(arrived_reindeer);
}
}
arrived.retain(|reindeer| reindeer.score == smallest_score);
}
let visited = arrived
.iter()
.map(|reindeer| {
reindeer
.visited
.keys()
.map(|(coords, _)| coords)
.collect_vec()
})
.collect_vec()
.concat();
log_maze(&grid, &arrived);
visited.iter().unique().count()
}
#[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)]
enum Orientation {
#[default]
East,
West,
North,
South,
}
impl Orientation {
fn turn_clockwise(&self) -> Self {
match self {
Orientation::East => Self::South,
Orientation::West => Self::North,
Orientation::North => Self::East,
Orientation::South => Self::West,
}
}
fn turn_counterclockwise(&self) -> Self {
match self {
Orientation::East => Self::North,
Orientation::West => Self::South,
Orientation::North => Self::West,
Orientation::South => Self::East,
}
}
}
#[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)]
enum ReindeerState {
#[default]
Going,
Arrived,
Stuck,
}
#[derive(Debug, Default, Clone, PartialEq, Eq)]
struct Reindeer {
orientation: Orientation,
coords: (usize, usize),
score: usize,
visited: HashMap<((usize, usize), Orientation), usize>,
state: ReindeerState,
}
impl Reindeer {
fn get_next(&self, grid: &[Vec<GridTile>]) -> Reindeer {
let tile = match self.orientation {
Orientation::East => grid[self.coords.1][self.coords.0 + 1],
Orientation::West => grid[self.coords.1][self.coords.0 - 1],
Orientation::North => grid[self.coords.1 - 1][self.coords.0],
Orientation::South => grid[self.coords.1 + 1][self.coords.0],
};
let coords = match self.orientation {
Orientation::East => (self.coords.0 + 1, self.coords.1),
Orientation::West => (self.coords.0 - 1, self.coords.1),
Orientation::South => (self.coords.0, self.coords.1 + 1),
Orientation::North => (self.coords.0, self.coords.1 - 1),
};
if tile == GridTile::Wall {
Reindeer {
state: ReindeerState::Stuck,
..self.clone()
}
} else if tile == GridTile::End {
Reindeer {
score: self.score + 1,
state: ReindeerState::Arrived,
coords,
..self.clone()
}
} else {
Reindeer {
score: self.score + 1,
coords,
..self.clone()
}
}
}
fn get_right(&self, grid: &[Vec<GridTile>]) -> Reindeer {
let tile = match self.orientation {
Orientation::East => grid[self.coords.1 + 1][self.coords.0],
Orientation::West => grid[self.coords.1 - 1][self.coords.0],
Orientation::North => grid[self.coords.1][self.coords.0 + 1],
Orientation::South => grid[self.coords.1][self.coords.0 - 1],
};
let coords = match self.orientation {
Orientation::East => (self.coords.0, self.coords.1 + 1),
Orientation::West => (self.coords.0, self.coords.1 - 1),
Orientation::South => (self.coords.0 - 1, self.coords.1),
Orientation::North => (self.coords.0 + 1, self.coords.1),
};
if tile == GridTile::Wall {
Reindeer {
state: ReindeerState::Stuck,
..self.clone()
}
} else if tile == GridTile::End {
Reindeer {
score: self.score + 1001,
state: ReindeerState::Arrived,
coords,
orientation: self.orientation.turn_clockwise(),
..self.clone()
}
} else {
Reindeer {
score: self.score + 1001,
orientation: self.orientation.turn_clockwise(),
coords,
..self.clone()
}
}
}
fn get_left(&self, grid: &[Vec<GridTile>]) -> Reindeer {
let tile = match self.orientation {
Orientation::East => grid[self.coords.1 - 1][self.coords.0],
Orientation::West => grid[self.coords.1 + 1][self.coords.0],
Orientation::North => grid[self.coords.1][self.coords.0 - 1],
Orientation::South => grid[self.coords.1][self.coords.0 + 1],
};
let coords = match self.orientation {
Orientation::East => (self.coords.0, self.coords.1 - 1),
Orientation::West => (self.coords.0, self.coords.1 + 1),
Orientation::South => (self.coords.0 + 1, self.coords.1),
Orientation::North => (self.coords.0 - 1, self.coords.1),
};
if tile == GridTile::Wall {
Reindeer {
state: ReindeerState::Stuck,
..self.clone()
}
} else if tile == GridTile::End {
Reindeer {
score: self.score + 1001,
state: ReindeerState::Arrived,
coords,
orientation: self.orientation.turn_counterclockwise(),
..self.clone()
}
} else {
Reindeer {
score: self.score + 1001,
orientation: self.orientation.turn_counterclockwise(),
coords,
..self.clone()
}
}
}
fn get_all_next_paths(&self, grid: &[Vec<GridTile>]) -> Vec<Reindeer> {
let next = self.get_next(grid);
let right = self.get_right(grid);
let left = self.get_left(grid);
let mut paths = Vec::new();
if next.state != ReindeerState::Stuck {
paths.push(next);
}
if right.state != ReindeerState::Stuck {
paths.push(right);
}
if left.state != ReindeerState::Stuck {
paths.push(left);
}
paths
}
}
#[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)]
enum GridTile {
Wall,
#[default]
Path,
Start,
End,
}
impl TryFrom<char> for GridTile {
type Error = Box<dyn Error>;
fn try_from(value: char) -> std::result::Result<GridTile, Box<dyn Error>> {
match value {
'#' => Ok(Self::Wall),
'.' => Ok(Self::Path),
'S' => Ok(Self::Start),
'E' => Ok(Self::End),
_ => Err(Box::from(format!("{value} is not a valid tile"))),
}
}
}
fn log_maze(grid: &[Vec<GridTile>], visited: &Vec<Reindeer>) {
for (yidx, row) in grid.iter().enumerate() {
for (xidx, tile) in row.iter().enumerate() {
let contains = {
let mut contains = false;
for reindeer in visited {
if reindeer
.visited
.contains_key(&((xidx, yidx), Orientation::East))
|| reindeer
.visited
.contains_key(&((xidx, yidx), Orientation::West))
|| reindeer
.visited
.contains_key(&((xidx, yidx), Orientation::North))
|| reindeer
.visited
.contains_key(&((xidx, yidx), Orientation::South))
{
contains = true;
break;
}
}
contains
};
if contains && !(*tile == GridTile::Start || *tile == GridTile::End) {
print!("O");
} else if *tile == GridTile::Wall {
print!("#");
} else if *tile == GridTile::Path {
print!(".");
} else if *tile == GridTile::Start {
print!("S");
} else if *tile == GridTile::End {
print!("E");
}
}
println!();
}
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT_1: &str = "###############
#.......#....E#
#.#.###.#.###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############";
const INPUT_2: &str = "#################
#...#...#...#..E#
#.#.#.#.#.#.#.#.#
#.#.#.#...#...#.#
#.#.#.#.###.#.#.#
#...#.#.#.....#.#
#.#.#.#.#.#####.#
#.#...#.#.#.....#
#.#.#####.#.###.#
#.#.#.......#...#
#.#.###.#####.###
#.#.#...#.....#.#
#.#.#.#####.###.#
#.#.#.........#.#
#.#.#.#########.#
#S#.............#
#################";
#[test]
fn part1_1() {
let result = process_part1(INPUT_1);
assert_eq!(result, 7036);
}
#[test]
fn part1_2() {
let result = process_part1(INPUT_2);
assert_eq!(result, 11048);
}
#[test]
fn part2_1() {
let result = process_part2(INPUT_1);
assert_eq!(result, 45);
}
#[test]
fn part2_2() {
let result = process_part2(INPUT_2);
assert_eq!(result, 64);
}
}

View File

@@ -1,308 +0,0 @@
use std::{collections::HashMap, error::Error};
use itertools::Itertools;
pub fn process_part1(input: &str) -> (String, HashMap<&str, u64>) {
let (registers, program) = input.split_once("\n\n").unwrap();
let mut registers = parse_registers(registers);
let (_, instructions) = program.split_once(": ").unwrap();
let mut out = Vec::new();
let instructions = instructions
.lines()
.map(|line| {
line.split(",")
.collect_vec()
.chunks(2)
.map(|chunk| (chunk[0], chunk[1]))
.collect_vec()
})
.collect_vec()
.concat();
let mut instruction_pointer: u64 = 0;
while let Some((opcode, operand)) = instructions.get(instruction_pointer as usize) {
let opcode = OpCodes::try_from(*opcode).unwrap();
if let Some((output, skip)) = opcode.exec(operand, &mut registers) {
if skip {
instruction_pointer = 0;
} else {
out.push(output);
instruction_pointer += 1;
}
} else {
instruction_pointer += 1;
}
}
(out.into_iter().join(","), registers)
}
pub fn process_part2(input: &str) -> u64 {
let (registers, program) = input.split_once("\n\n").unwrap();
let mut registers = parse_registers(registers);
let (_, instructions) = program.split_once(": ").unwrap();
let instructions = instructions
.lines()
.map(|line| {
line.split(",")
.collect_vec()
.chunks(2)
.map(|chunk| (chunk[0], chunk[1]))
.collect_vec()
})
.collect_vec()
.concat();
let orig = instructions
.iter()
.map(|(opcode, operand)| {
[
opcode.parse::<u64>().unwrap(),
operand.parse::<u64>().unwrap(),
]
})
.collect_vec()
.concat();
let mut a = 0;
for idx in 1..=orig.len() {
let target = orig[orig.len() - idx..].to_vec();
let mut new_a = a << 3;
loop {
registers.insert("A", new_a);
let out = exec_program(instructions.clone(), &mut registers);
//println!("target {target:?}");
//println!("output {out:?}");
if out == target {
a = new_a;
break;
}
new_a += 1;
}
}
a
}
fn exec_program(instructions: Vec<(&str, &str)>, registers: &mut HashMap<&str, u64>) -> Vec<u64> {
let mut out = Vec::new();
let mut instruction_pointer: u64 = 0;
while let Some((opcode, operand)) = instructions.get(instruction_pointer as usize) {
let opcode = OpCodes::try_from(*opcode).unwrap();
if let Some((output, skip)) = opcode.exec(operand, registers) {
if skip {
instruction_pointer = 0;
} else {
out.push(output);
instruction_pointer += 1;
}
} else {
instruction_pointer += 1;
}
}
out
}
fn parse_registers(input: &str) -> HashMap<&str, u64> {
let mut registers = HashMap::new();
input.lines().for_each(|line| {
let (register, value) = line.split_once(": ").unwrap();
let (_, register) = register.split_once(" ").unwrap();
let value = value.parse().unwrap();
registers.insert(register, value);
});
registers
}
#[derive(Debug)]
enum OpCodes {
Adv,
Bxl,
Bst,
Jnz,
Bxc,
Out,
Bdv,
Cdv,
}
impl OpCodes {
fn exec(&self, operand: &str, registers: &mut HashMap<&str, u64>) -> Option<(u64, bool)> {
let a = *registers.get("A").unwrap();
let b = *registers.get("B").unwrap();
let c = *registers.get("C").unwrap();
let operand: u64 = operand.parse().unwrap();
let combo = if operand <= 3 {
operand
} else if operand == 4 {
a
} else if operand == 5 {
b
} else if operand == 6 {
c
} else {
0
};
match self {
OpCodes::Adv => {
//println!(
// "a = a / 2 ** combo = {a} / 2 ** {combo} = {}",
// a / 2_u64.pow(combo)
//);
registers.insert("A", a / 2_u64.pow(combo as u32));
None
}
OpCodes::Bxl => {
//println!("b = b xor operand = {b} xor {operand} = {}", b ^ operand);
registers.insert("B", b ^ operand);
None
}
OpCodes::Bst => {
//println!("b = combo mod 8 = {combo} mod 8 = {}", combo % 8);
registers.insert("B", combo % 8);
None
}
OpCodes::Jnz => {
if a != 0 {
//println!("jump {operand}");
Some((operand, true))
} else {
//println!("don't jump");
None
}
}
OpCodes::Bxc => {
//println!("b = b xor c = {b} xor {c} = {}", b ^ c);
registers.insert("B", b ^ c);
None
}
OpCodes::Out => {
//println!("out {combo} % 8 = {}", combo % 8);
Some((combo % 8, false))
}
OpCodes::Bdv => {
//println!(
// "b = a / 2 ** combo = {a} / 2 ** {combo} = {}",
// a / 2_u64.pow(combo)
//);
registers.insert("B", a / 2_u64.pow(combo as u32));
None
}
OpCodes::Cdv => {
//println!(
// "c = a / 2 ** combo = {a} / 2 ** {combo} = {}",
// a / 2_u64.pow(combo)
//);
registers.insert("C", a / 2_u64.pow(combo as u32));
None
}
}
}
}
impl TryFrom<&str> for OpCodes {
type Error = Box<dyn Error>;
fn try_from(value: &str) -> std::result::Result<OpCodes, Box<dyn Error>> {
match value {
"0" => Ok(Self::Adv),
"1" => Ok(Self::Bxl),
"2" => Ok(Self::Bst),
"3" => Ok(Self::Jnz),
"4" => Ok(Self::Bxc),
"5" => Ok(Self::Out),
"6" => Ok(Self::Bdv),
"7" => Ok(Self::Cdv),
_ => Err(Box::from(format!("{value} is not a valid OpCode"))),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT_MAIN: &str = "Register A: 729
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0";
const INPUT_SMALL_1: &str = "Register A: 0
Register B: 0
Register C: 9
Program: 2,6";
const INPUT_SMALL_2: &str = "Register A: 10
Register B: 0
Register C: 0
Program: 5,0,5,1,5,4";
const INPUT_SMALL_3: &str = "Register A: 2024
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0";
const INPUT_SMALL_4: &str = "Register A: 0
Register B: 29
Register C: 0
Program: 1,7";
const INPUT_SMALL_5: &str = "Register A: 0
Register B: 2024
Register C: 43690
Program: 4,0";
const INPUT_COPY: &str = "Register A: 2024
Register B: 0
Register C: 0
Program: 0,3,5,4,3,0";
#[test]
fn part1_main() {
let result = process_part1(INPUT_MAIN);
assert_eq!(result.0, "4,6,3,5,6,3,5,2,1,0".to_string());
}
#[test]
fn part1_small_1() {
let result = process_part1(INPUT_SMALL_1);
assert_eq!(result.1.get("B").unwrap(), &1);
}
#[test]
fn part1_small_2() {
let result = process_part1(INPUT_SMALL_2);
assert_eq!(result.0, "0,1,2".to_string());
}
#[test]
fn part1_small_3() {
let result = process_part1(INPUT_SMALL_3);
assert_eq!(result.1.get("A").unwrap(), &0);
assert_eq!(result.0, "4,2,5,6,7,7,7,7,3,1,0".to_string());
}
#[test]
fn part1_small_4() {
let result = process_part1(INPUT_SMALL_4);
assert_eq!(result.1.get("B").unwrap(), &26);
}
#[test]
fn part1_small_5() {
let result = process_part1(INPUT_SMALL_5);
assert_eq!(result.1.get("B").unwrap(), &44354);
}
#[test]
fn part2() {
let result = process_part2(INPUT_COPY);
assert_eq!(result, 117440);
}
}

View File

@@ -1,294 +0,0 @@
use std::{collections::HashSet, error::Error};
use itertools::Itertools;
pub fn process_part1(input: &str) -> u32 {
let falling_bytes = &input
.lines()
.map(|line| {
let (x, y) = line.split_once(",").unwrap();
(x.parse().unwrap(), y.parse().unwrap())
})
.collect_vec()[..1024];
let y_walls = vec![GridTile::Wall; 73];
let mut inner_rows = vec![GridTile::Path; 71];
inner_rows.insert(0, GridTile::Wall);
inner_rows.push(GridTile::Wall);
let mut grid = vec![inner_rows; 71];
grid.insert(0, y_walls.clone());
grid.push(y_walls);
simulate(grid, falling_bytes).unwrap()
}
fn simulate(mut grid: Vec<Vec<GridTile>>, falling_bytes: &[(usize, usize)]) -> Option<u32> {
grid[1][1] = GridTile::Start;
let height = grid.len();
let width = grid[0].len();
grid[height - 2][width - 2] = GridTile::End;
falling_bytes.iter().for_each(|(x, y)| {
grid[*y + 1][*x + 1] = GridTile::Wall;
});
let mut visited = HashSet::new();
visited.insert((1, 1));
let mut next_paths = vec![MazeRunner {
coords: (1, 1),
visited: visited.clone(),
..Default::default()
}];
let mut arrived: Vec<MazeRunner> = Vec::new();
while !next_paths.is_empty() {
next_paths = next_paths
.iter()
.map(|maze_runner| {
let mut paths = Vec::new();
if let Some(path) = maze_runner.get_next(&grid, Direction::Up) {
paths.push(path);
}
if let Some(path) = maze_runner.get_next(&grid, Direction::Down) {
paths.push(path);
}
if let Some(path) = maze_runner.get_next(&grid, Direction::Left) {
paths.push(path);
}
if let Some(path) = maze_runner.get_next(&grid, Direction::Right) {
paths.push(path);
}
paths
})
.collect_vec()
.concat();
for (idx, maze_runner) in next_paths.clone().iter().enumerate().rev() {
if maze_runner.visited.contains(&maze_runner.coords)
|| visited.contains(&maze_runner.coords)
{
next_paths.remove(idx);
continue;
}
visited.insert(maze_runner.coords);
next_paths[idx].visited.insert(maze_runner.coords);
if maze_runner.state == State::Arrived {
let arrived_reindeer = next_paths.remove(idx);
arrived.push(arrived_reindeer);
}
}
}
//let visited = arrived
// .iter()
// .map(|reindeer| {
// reindeer
// .visited
// .iter()
// .map(|(coords, _)| coords)
// .collect_vec()
// })
// .collect_vec()
// .concat();
//visited.iter().unique().count()
arrived.sort_by(|a_runner, b_runner| a_runner.visited.len().cmp(&b_runner.visited.len()));
if let Some(arrived) = arrived.first() {
log_maze(&grid, arrived);
Some(arrived.visited.len() as u32 - 1)
} else {
None
}
}
pub fn process_part2(input: &str) -> String {
let falling_bytes = &input
.lines()
.map(|line| {
let (x, y) = line.split_once(",").unwrap();
(x.parse::<usize>().unwrap(), y.parse::<usize>().unwrap())
})
.collect_vec();
let y_walls = vec![GridTile::Wall; 73];
let mut inner_rows = vec![GridTile::Path; 71];
inner_rows.insert(0, GridTile::Wall);
inner_rows.push(GridTile::Wall);
let mut grid = vec![inner_rows; 71];
grid.insert(0, y_walls.clone());
grid.push(y_walls);
let mut num_bytes = 1025;
while simulate(grid.clone(), &falling_bytes[..num_bytes]).is_some() {
num_bytes += 1;
}
let (x, y) = falling_bytes[num_bytes - 1];
format!("{x},{y}")
}
#[derive(Debug, Clone, PartialEq, Eq)]
enum Direction {
Up,
Down,
Left,
Right,
}
#[derive(Debug, Default, Clone, PartialEq, Eq)]
enum State {
#[default]
Going,
Arrived,
}
#[derive(Debug, Default, Clone, PartialEq, Eq)]
struct MazeRunner {
coords: (usize, usize),
visited: HashSet<(usize, usize)>,
state: State,
}
impl MazeRunner {
fn get_next(&self, grid: &[Vec<GridTile>], direction: Direction) -> Option<MazeRunner> {
let tile = match direction {
Direction::Up => grid[self.coords.1 - 1][self.coords.0],
Direction::Down => grid[self.coords.1 + 1][self.coords.0],
Direction::Right => grid[self.coords.1][self.coords.0 + 1],
Direction::Left => grid[self.coords.1][self.coords.0 - 1],
};
let coords = match direction {
Direction::Up => (self.coords.0, self.coords.1 - 1),
Direction::Down => (self.coords.0, self.coords.1 + 1),
Direction::Left => (self.coords.0 - 1, self.coords.1),
Direction::Right => (self.coords.0 + 1, self.coords.1),
};
if tile == GridTile::Wall {
None
} else if tile == GridTile::End {
Some(MazeRunner {
state: State::Arrived,
coords,
..self.clone()
})
} else {
Some(MazeRunner {
coords,
..self.clone()
})
}
}
}
#[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)]
enum GridTile {
Wall,
#[default]
Path,
Start,
End,
}
impl TryFrom<char> for GridTile {
type Error = Box<dyn Error>;
fn try_from(value: char) -> std::result::Result<GridTile, Box<dyn Error>> {
match value {
'#' => Ok(Self::Wall),
'.' => Ok(Self::Path),
'S' => Ok(Self::Start),
'E' => Ok(Self::End),
_ => Err(Box::from(format!("{value} is not a valid tile"))),
}
}
}
fn log_maze(grid: &[Vec<GridTile>], maze_runner: &MazeRunner) {
for (yidx, row) in grid.iter().enumerate() {
for (xidx, tile) in row.iter().enumerate() {
let contains = {
maze_runner.visited.contains(&(xidx, yidx))
|| maze_runner.visited.contains(&(xidx, yidx))
|| maze_runner.visited.contains(&(xidx, yidx))
|| maze_runner.visited.contains(&(xidx, yidx))
};
if contains && !(*tile == GridTile::Start || *tile == GridTile::End) {
print!("O");
} else if *tile == GridTile::Wall {
print!("#");
} else if *tile == GridTile::Path {
print!(".");
} else if *tile == GridTile::Start {
print!("S");
} else if *tile == GridTile::End {
print!("E");
}
}
println!();
}
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &str = "5,4
4,2
4,5
3,0
2,1
6,3
2,4
1,5
0,6
3,3
2,6
5,1
1,2
5,5
2,5
6,5
1,4
0,4
6,4
1,1
6,1
1,0
0,5
1,6
2,0";
#[test]
fn part1() {
let falling_bytes = &INPUT
.lines()
.map(|line| {
let (x, y) = line.split_once(",").unwrap();
(x.parse().unwrap(), y.parse().unwrap())
})
.collect_vec()[..12];
let y_walls = vec![GridTile::Wall; 9];
let mut inner_rows = vec![GridTile::Path; 7];
inner_rows.insert(0, GridTile::Wall);
inner_rows.push(GridTile::Wall);
let mut grid = vec![inner_rows; 7];
grid.insert(0, y_walls.clone());
grid.push(y_walls);
let result = simulate(grid, falling_bytes);
assert_eq!(result, Some(22));
}
#[test]
fn part2() {
let falling_bytes = INPUT
.lines()
.map(|line| {
let (x, y) = line.split_once(",").unwrap();
(x.parse::<usize>().unwrap(), y.parse::<usize>().unwrap())
})
.collect_vec();
let y_walls = vec![GridTile::Wall; 9];
let mut inner_rows = vec![GridTile::Path; 7];
inner_rows.insert(0, GridTile::Wall);
inner_rows.push(GridTile::Wall);
let mut grid = vec![inner_rows; 7];
grid.insert(0, y_walls.clone());
grid.push(y_walls);
let mut num_bytes = 12;
while simulate(grid.clone(), &falling_bytes[..num_bytes]).is_some() {
num_bytes += 1;
}
let (x, y) = falling_bytes[num_bytes - 1];
let result = format!("{x},{y}");
assert_eq!(result, "6,1".to_string());
}
}

Some files were not shown because too many files have changed in this diff Show More