Compare commits

...

10 Commits

1
.gitignore vendored

@ -0,0 +1 @@
/target

16
Cargo.lock generated

@ -0,0 +1,16 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "aoc2022"
version = "0.1.0"
dependencies = [
"seahash",
]
[[package]]
name = "seahash"
version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"

@ -0,0 +1,9 @@
[package]
name = "aoc2022"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
seahash = { version = "4.1.0", features = [], default-features = false }

@ -0,0 +1,9 @@
unstable_features = true
hard_tabs = true
max_width = 80
imports_granularity = 'Crate'
group_imports = 'StdExternalCrate'
format_strings = true
wrap_comments = true
blank_lines_lower_bound = 0
blank_lines_upper_bound = 2

@ -0,0 +1,44 @@
pub mod a {
static INPUT: &str = include_str!("inputs/day1a.txt");
pub fn go() {
let input = INPUT;
let max = input
.split("\n\n")
.map(|elf_cals_str| {
elf_cals_str
.split('\n')
.filter(|s| !s.is_empty())
.map(|cal_str| cal_str.parse::<u32>().unwrap())
.sum::<u32>()
})
.max()
.unwrap();
println!("{}", max);
}
}
pub mod b {
static INPUT: &str = include_str!("inputs/day1a.txt");
pub fn go() {
let input = INPUT;
let mut cals: Vec<_> = input
.split("\n\n")
.map(|elf_cals_str| {
elf_cals_str
.split('\n')
.filter(|s| !s.is_empty())
.map(|cal_str| cal_str.parse::<u32>().unwrap())
.sum::<u32>()
})
.collect();
cals.sort_by(|a, b| a.cmp(b).reverse());
let total = cals.iter().take(3).sum::<u32>();
println!("{}", total);
}
}

@ -0,0 +1,148 @@
pub mod a {
static INPUT: &str = include_str!("inputs/day2a.txt");
#[derive(Copy, Clone, Eq, PartialEq)]
pub enum Rps {
Rock,
Paper,
Scissors,
}
impl Rps {
pub fn score(&self) -> u64 {
use Rps::*;
match self {
Rock => 1,
Paper => 2,
Scissors => 3,
}
}
}
pub enum Outcome {
ElfWin,
MeWin,
Draw,
}
impl Outcome {
pub fn score(&self) -> u64 {
use Outcome::*;
match self {
ElfWin => 0,
Draw => 3,
MeWin => 6,
}
}
}
pub fn get_outcome(elf: &Rps, me: &Rps) -> Outcome {
use Rps::*;
match (elf, me) {
(Paper, Rock) | (Rock, Scissors) | (Scissors, Paper) => {
Outcome::ElfWin
}
_ if elf == me => Outcome::Draw,
_ => Outcome::MeWin,
}
}
pub fn elf_to_rps(i: &str) -> Rps {
match i {
"A" => Rps::Rock,
"B" => Rps::Paper,
"C" => Rps::Scissors,
_ => panic!(),
}
}
pub fn me_to_rps(i: &str) -> Rps {
match i {
"X" => Rps::Rock,
"Y" => Rps::Paper,
"Z" => Rps::Scissors,
_ => panic!(),
}
}
pub fn go() {
let input = INPUT;
let score = input
.split('\n')
.filter(|line| !line.is_empty())
.map(|line| {
let mut it = line.split(' ');
let elf = it.next().unwrap();
let me = it.next().unwrap();
let elf = elf_to_rps(elf);
let me = me_to_rps(me);
let me_score = me.score() + get_outcome(&elf, &me).score();
me_score
})
.sum::<u64>();
println!("{}", score);
}
}
pub mod b {
use super::a::*;
static INPUT: &str = include_str!("inputs/day2a.txt");
fn to_outcome(me: &str) -> Outcome {
use Outcome::*;
match me {
"X" => ElfWin,
"Y" => Draw,
"Z" => MeWin,
_ => panic!(),
}
}
fn get_move(elf: &Rps, outcome: &Outcome) -> Rps {
use Outcome::*;
use Rps::*;
match outcome {
Draw => *elf,
ElfWin => match elf {
Rock => Scissors,
Scissors => Paper,
Paper => Rock,
},
MeWin => match elf {
Rock => Paper,
Paper => Scissors,
Scissors => Rock,
},
}
}
pub fn go() {
let input = INPUT;
let score = input
.split('\n')
.filter(|line| !line.is_empty())
.map(|line| {
let mut it = line.split(' ');
let elf = it.next().unwrap();
let outcome = it.next().unwrap();
let elf = super::a::elf_to_rps(elf);
let outcome = to_outcome(outcome);
let me = get_move(&elf, &outcome);
let me_score = me.score() + outcome.score();
me_score
})
.sum::<u64>();
println!("{}", score);
}
}

@ -0,0 +1,68 @@
use crate::util::prelude::*;
static INPUT: &str = include_str!("inputs/day3.txt");
type Item = char;
pub fn item_prio(item: &Item) -> uint {
if ('a'..='z').contains(&item) {
return (*item as uint - 'a' as uint) + 1;
}
if ('A'..='Z').contains(&item) {
return (*item as uint - 'A' as uint) + 27;
}
panic!()
}
pub fn part1() {
let sum = INPUT
.split('\n')
.filter(|s| !s.is_empty())
.map(|line| {
let len = line.len();
let (fst_ruck_str, snd_ruck_str) = line.split_at(len / 2);
let fst_ruck = fst_ruck_str.chars().collect::<HashSet<_>>();
let snd_ruck = snd_ruck_str.chars().collect::<HashSet<_>>();
let both = fst_ruck.intersection(&snd_ruck).collect::<HashSet<_>>();
assert!(both.len() == 1);
let both = both.iter().next().unwrap();
item_prio(*both)
})
.sum::<uint>();
println!("{}", sum);
}
pub fn part2() {
let lines: Vec<_> = INPUT.split('\n').filter(|s| !s.is_empty()).collect();
let elf_groups = lines.chunks_exact(3);
let sum: uint = elf_groups
.flat_map(|lines| {
let item_counts = lines
.iter()
.map(|line| line.chars().collect::<HashSet<_>>())
.fold(HashMap::default(), |mut map, set| {
for v in set.iter() {
let ct = map.entry(*v).or_insert(0);
*ct += 1;
}
map
});
item_counts
.iter()
.max_by(|a, b| a.1.cmp(b.1))
.map(|v| item_prio(v.0))
})
.sum();
println!("{}", sum);
}

@ -0,0 +1,69 @@
use crate::util::prelude::*;
static INPUT: &str = include_str!("inputs/day4.txt");
fn parse_range(s: &str) -> core::ops::RangeInclusive<uint> {
let mut parts = s.split('-');
let lo = parts.next().unwrap();
let hi = parts.next().unwrap();
let lo = lo.parse().unwrap();
let hi = hi.parse().unwrap();
lo..=hi
}
fn fully_contains<U: PartialOrd>(
haystack: &core::ops::RangeInclusive<U>,
needle: &core::ops::RangeInclusive<U>,
) -> bool {
haystack.contains(needle.start()) && haystack.contains(needle.end())
}
fn has_overlap<U: PartialOrd>(
a: &core::ops::RangeInclusive<U>,
b: &core::ops::RangeInclusive<U>,
) -> bool {
a.contains(b.start())
|| a.contains(b.end())
|| b.contains(a.start())
|| b.contains(a.end())
}
pub fn part1() {
let sum = INPUT
.split('\n')
.filter(|s| !s.is_empty())
.map(|line| {
let mut elves = line.split(',');
let fst = elves.next().unwrap();
let fst = parse_range(fst);
let snd = elves.next().unwrap();
let snd = parse_range(snd);
u64::from(fully_contains(&fst, &snd) || fully_contains(&snd, &fst))
})
.sum::<uint>();
println!("{}", sum);
}
pub fn part2() {
let sum = INPUT
.split('\n')
.filter(|s| !s.is_empty())
.map(|line| {
let mut elves = line.split(',');
let fst = elves.next().unwrap();
let fst = parse_range(fst);
let snd = elves.next().unwrap();
let snd = parse_range(snd);
u64::from(has_overlap(&fst, &snd))
})
.sum::<uint>();
println!("{}", sum);
}

@ -0,0 +1,154 @@
static INPUT: &str = include_str!("inputs/day5.txt");
type CrateID = char;
#[derive(Debug)]
struct Stacks(Vec<Vec<CrateID>>);
impl Stacks {
fn apply_move_part_1(&mut self, mv: &Move) {
let from = mv.from - 1;
let to = mv.to - 1;
for _ in 0..mv.count {
let c = self.0[from].pop().unwrap();
self.0[to].push(c)
}
}
fn apply_move_part_2(&mut self, mv: &Move) {
let from = mv.from - 1;
let to = mv.to - 1;
// SAFETY: should be safe, borrowing from disjoint sub-vectors and
// not modifying the length of the primary vector. Technically it
// is possible that this could alias if to and from are the same,
// but even if that happened this should be safe (although the
// answer given would be incorrect)
unsafe {
let from: &'static mut Vec<_> =
core::mem::transmute(&mut self.0[from]);
let new_len = from.len() - mv.count;
let picked_up = &from[new_len..];
self.0[to].extend_from_slice(picked_up);
from.truncate(new_len);
}
}
}
fn parse_stacks(s: &str) -> Stacks {
let mut lines = s.split('\n').filter(|s| !s.is_empty()).map(|line| {
let mut chars = line.chars();
core::iter::from_fn(move || {
match chars.next() {
None => return None,
Some(_) => (),
};
let id = chars.next().unwrap();
chars.next();
chars.next();
if id == ' ' {
return Some(None);
}
Some(Some(id))
})
});
let mut crates = Vec::new();
let first_line = lines.next().unwrap();
for id in first_line {
let mut stack = Vec::new();
if let Some(id) = id {
stack.push(id);
}
crates.push(stack);
}
for ids in lines {
for (idx, id) in ids.enumerate() {
if let Some(id) = id {
crates[idx].push(id);
}
}
}
for stack in &mut crates {
stack.pop();
stack.reverse();
}
Stacks(crates)
}
#[derive(Debug)]
struct Move {
count: usize,
from: usize,
to: usize,
}
fn parse_moves(s: &str) -> impl Iterator<Item = Move> + '_ {
s.split('\n').filter(|s| !s.is_empty()).map(|line| {
let mut words = line.split(' ');
let count = {
words.next();
words.next().unwrap()
};
let from = {
words.next();
words.next().unwrap()
};
let to = {
words.next();
words.next().unwrap()
};
Move {
count: count.parse().unwrap(),
from: from.parse().unwrap(),
to: to.parse().unwrap(),
}
})
}
fn parse(s: &str) -> (Stacks, impl Iterator<Item = Move> + '_) {
let mut parts = s.split("\n\n");
let crates_str = parts.next().unwrap();
let stacks = parse_stacks(crates_str);
let moves_str = parts.next().unwrap();
let moves = parse_moves(moves_str);
(stacks, moves)
}
pub fn part1() {
let (mut stacks, moves) = parse(INPUT);
for mv in moves {
stacks.apply_move_part_1(&mv);
}
for stack in &stacks.0 {
print!("{}", stack.last().unwrap());
}
println!();
}
pub fn part2() {
let (mut stacks, moves) = parse(INPUT);
for mv in moves {
stacks.apply_move_part_2(&mv);
}
for stack in &stacks.0 {
print!("{}", stack.last().unwrap());
}
println!();
}

@ -0,0 +1,37 @@
use crate::util::prelude::*;
static INPUT: &str = include_str!("inputs/day6.txt");
fn find_start(s: &str, win_size: usize) -> usize {
let chars: Vec<_> = s.chars().collect();
chars
.windows(win_size)
.find(|chars| {
let char_counts =
chars.iter().fold(HashMap::default(), |mut counts, char| {
*counts.entry(char).or_insert(0) += 1;
counts
});
if *char_counts.values().max().unwrap() == 1 {
return true;
}
false
})
.map(|s| {
(unsafe { s.as_ptr().offset_from(chars.as_ptr()) } as usize)
+ s.len()
})
.unwrap()
}
pub fn part1() {
println!("{}", find_start(INPUT, 4));
}
pub fn part2() {
println!("{}", find_start(INPUT, 14));
}

@ -0,0 +1,188 @@
static INPUT: &str = include_str!("inputs/day7.txt");
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
struct FileID(usize);
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
struct DirID(usize);
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
enum DirEntryKind {
File(FileID),
Dir(DirID),
}
#[derive(Debug)]
struct DirEntry {
name: String,
kind: DirEntryKind,
}
#[derive(Debug)]
struct File {
size: usize,
}
#[derive(Debug)]
struct Dir {
parent: DirID,
children: Vec<DirEntry>,
}
#[derive(Debug)]
struct Fs {
files: Vec<File>,
dirs: Vec<Dir>,
}
impl Fs {
fn new() -> Self {
Self {
files: vec![],
dirs: vec![Dir {
parent: DirID(0),
children: vec![],
}],
}
}
fn root(&self) -> DirID {
DirID(0)
}
fn mkdir(&mut self, target: DirID, name: &str) -> DirID {
let new_id = DirID(self.dirs.len());
self.dirs.push(Dir {
parent: target,
children: vec![],
});
self.dirs[target.0].children.push(DirEntry {
name: name.to_string(),
kind: DirEntryKind::Dir(new_id),
});
new_id
}
fn mkfile(&mut self, target: DirID, name: &str, size: usize) -> FileID {
let new_id = FileID(self.files.len());
self.files.push(File { size });
self.dirs[target.0].children.push(DirEntry {
name: name.to_string(),
kind: DirEntryKind::File(new_id),
});
new_id
}
fn entry(&self, target: DirID, name: &str) -> DirEntryKind {
let dir = &self.dirs[target.0];
dir.children
.iter()
.find(|e| e.name == name)
.map(|e| e.kind)
.unwrap()
}
fn parent(&self, target: DirID) -> DirID {
self.dirs[target.0].parent
}
fn dirsz(&self, target: DirID) -> usize {
let dir = &self.dirs[target.0];
dir.children
.iter()
.map(|c| match c.kind {
DirEntryKind::File(fid) => self.files[fid.0].size,
DirEntryKind::Dir(did) => self.dirsz(did),
})
.sum()
}
}
fn make_fs(s: &str) -> Fs {
let mut lines = s.split('\n').filter(|s| !s.is_empty()).peekable();
let mut fs = Fs::new();
let mut current_dir = fs.root();
while let Some(line) = lines.next() {
assert!(line.starts_with('$'));
let mut parts = line.split(' ').skip(1);
match parts.next().unwrap() {
"cd" => {
let arg = parts.next().unwrap();
current_dir = match arg {
"/" => fs.root(),
".." => fs.parent(current_dir),
_ => {
let entry = fs.entry(current_dir, arg);
match entry {
DirEntryKind::Dir(d) => d,
_ => panic!(),
}
}
};
}
"ls" => {
while let Some(data_line) = lines.peek() {
if data_line.starts_with('$') {
break;
}
let mut parts = data_line.split(' ');
let ty = parts.next().unwrap();
let name = parts.next().unwrap();
match ty {
"dir" => {
fs.mkdir(current_dir, name);
}
_ => {
let sz: usize = ty.parse().unwrap();
fs.mkfile(current_dir, name, sz);
}
}
lines.next();
}
}
_ => panic!(),
}
}
fs
}
pub fn part1() {
let fs = make_fs(INPUT);
println!(
"{}",
fs.dirs
.iter()
.enumerate()
.map(|(did, _)| fs.dirsz(DirID(did)))
.filter(|sz| sz <= &100000)
.sum::<usize>()
);
}
pub fn part2() {
let fs = make_fs(INPUT);
let total = 70_000_000;
let needed_free = 30_000_000;
let used = fs.dirsz(fs.root());
let free = total - used;
let diff = needed_free - free;
println!(
"{}",
fs.dirs
.iter()
.enumerate()
.map(|(did, _)| fs.dirsz(DirID(did)))
.filter(|sz| sz >= &diff)
.min()
.unwrap()
);
}

@ -0,0 +1,160 @@
use crate::util::prelude::*;
static INPUT: &str = include_str!("inputs/day8.txt");
struct Trees {
width: usize,
height: usize,
data: Vec<sint>,
}
impl Trees {
fn from_str(s: &str) -> Self {
let mut lines = s.split('\n').filter(|s| !s.is_empty());
let mut width = 0;
let mut height = 0;
let mut data = Vec::new();
for line in lines {
for ch in line.chars() {
let h = ch as sint - '0' as sint;
data.push(h);
}
height += 1;
width = line.len();
}
Self {
width,
height,
data,
}
}
fn get(&self, x: usize, y: usize) -> sint {
self.data[x + y * self.width]
}
fn it<'a>(
&'a self,
start: (usize, usize),
next: impl Fn(&mut (usize, usize)) + 'a,
) -> impl Iterator<Item = sint> + 'a {
let mut n = Some(start);
core::iter::from_fn(move || {
let n_ = match &mut n {
None => return None,
Some(n) => n,
};
let r = Some(self.get(n_.0, n_.1));
if n_.0 == 0
|| n_.1 == 0 || n_.0 == self.width - 1
|| n_.1 == self.height - 1
{
n = None;
} else {
next(n_);
}
r
})
}
fn is_visible_(
&self,
x: usize,
y: usize,
next: impl Fn(&mut (usize, usize)),
) -> bool {
let h = self.get(x, y);
let t = self.it((x, y), next).skip(1).all(|h_| h_ < h);
t
}
fn is_visible(&self, x: usize, y: usize) -> bool {
let visible_left = self.is_visible_(x, y, |(x, _)| *x -= 1);
if visible_left {
return true;
}
let visible_right = self.is_visible_(x, y, |(x, _)| *x += 1);
if visible_right {
return true;
}
let visible_up = self.is_visible_(x, y, |(_, y)| *y -= 1);
if visible_up {
return true;
}
let visible_down = self.is_visible_(x, y, |(_, y)| *y += 1);
visible_down
}
fn scenic_score_(
&self,
x: usize,
y: usize,
v: uint,
next: impl Fn(&mut (usize, usize)),
) -> uint {
let it = self.it((x, y), next);
let h = self.get(x, y);
it.enumerate()
.skip(1)
.find(|(_, h_)| *h_ >= h)
.map(|(i, _)| i as uint)
.unwrap_or(v)
}
fn scenic_score(&self, x: usize, y: usize) -> uint {
let scenic_left = self.scenic_score_(x, y, x as uint, |(x, _)| *x -= 1);
let scenic_right =
self.scenic_score_(x, y, (self.width - x) as uint - 1, |(x, _)| {
*x += 1
});
let scenic_up = self.scenic_score_(x, y, y as uint, |(_, y)| *y -= 1);
let scenic_down = self.scenic_score_(
x,
y,
(self.height - y) as uint - 1,
|(_, y)| *y += 1,
);
scenic_left * scenic_right * scenic_up * scenic_down
}
}
pub fn part1() {
let trees = Trees::from_str(INPUT);
let trees_ = &trees;
println!(
"{}",
(0..trees.height)
.flat_map(
|y| (0..trees_.width).map(move |x| trees_.is_visible(x, y))
)
.filter(|x| *x)
.count()
);
}
pub fn part2() {
let trees = Trees::from_str(INPUT);
let trees_ = &trees;
println!(
"{}",
(0..trees.height)
.flat_map(
|y| (0..trees_.width).map(move |x| trees_.scenic_score(x, y))
)
.max()
.unwrap()
);
}

@ -0,0 +1,131 @@
use crate::util::prelude::*;
static INPUT: &str = include_str!("inputs/day9.txt");
#[derive(Debug, Copy, Clone)]
enum Direction {
Right,
Down,
Up,
Left,
}
impl Direction {
fn diff(&self) -> (sint, sint) {
use Direction::*;
match self {
Right => (1, 0),
Up => (0, 1),
Down => (0, -1),
Left => (-1, 0),
}
}
}
impl core::str::FromStr for Direction {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"U" => Direction::Up,
"R" => Direction::Right,
"L" => Direction::Left,
"D" => Direction::Down,
_ => return Err(()),
})
}
}
#[derive(Debug, Copy, Clone)]
struct Move {
count: uint,
direction: Direction,
}
impl core::str::FromStr for Move {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
let mut it = s.split(' ');
let direction = it.next().ok_or(())?.parse()?;
let count = it.next().ok_or(())?.parse().map_err(|_| ())?;
Ok(Self { count, direction })
}
}
fn moves(s: &str) -> impl Iterator<Item = Move> + '_ {
s.lines()
.filter(|s| !s.is_empty())
.map(|s| s.parse().unwrap())
}
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
struct Pos(sint, sint);
fn move_tail(head: &Pos, tail: &mut Pos) {
let diff_x = head.0 - tail.0;
let diff_y = head.1 - tail.1;
let diff_x_abs = diff_x.abs();
let diff_y_abs = diff_y.abs();
// diag
let mv = if diff_x_abs + diff_y_abs == 3 {
(diff_x.signum(), diff_y.signum())
} else {
((diff_x / 2).signum(), (diff_y / 2).signum())
};
tail.0 += mv.0;
tail.1 += mv.1;
}
pub fn part1() {
let mut head = Pos(0, 0);
let mut tail = Pos(0, 0);
let moves = moves(INPUT);
let mut locations = HashSet::default();
for mv in moves {
let dir = mv.direction.diff();
let count = mv.count;
for _ in 0..count {
head.0 += dir.0;
head.1 += dir.1;
move_tail(&head, &mut tail);
locations.insert(tail);
}
}
println!("{}", locations.len())
}
pub fn part2() {
let mut parts = vec![Pos(0, 0); 10];
let moves = moves(INPUT);
let mut locations = HashSet::default();
for mv in moves {
let dir = mv.direction.diff();
let count = mv.count;
for _ in 0..count {
parts[0].0 += dir.0;
parts[0].1 += dir.1;
for i in 0..parts.len() - 1 {
let tail: &mut _ =
unsafe { core::mem::transmute(&mut parts[i + 1]) };
move_tail(&parts[i], tail);
}
locations.insert(*parts.last().unwrap());
}
}
println!("{}", locations.len())
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,300 @@
vvMQnwwvrwWNfrtZJfppmSfJSmSg
BzGqjlBqBBmztHNFzDHg
llRCPlTPPqBjPhqhlBRBClhqWcTWrWNcMbQbdrdLccccrnvM
wMhwbTWpQjbpWHMQppzTHhjtlCjPSSJCCtlqRlJVFJFt
ggdvvnvDgdDmNcBrrcDntFRFqHJJtSJqvlVSRlJq
fggNNffGmcBrmBfcDzzzpHbsGTpszwwTbp
BPdPPBggrPtrpbtvPBBdgrFmhhQThGGlbbTZnzZQzZfn
ccjWRJVNcTGmnWWFmh
DMNmsMHwRNBrggdPDPdt
TfsfHLQbBtBFQbQsBmPwwlnPGZFwwdwWFZZw
MRpcvJMJVSMrVMpVSvhhnclwgWwDZgWgWgWglwcG
GCzjRJjVjSSrvfNQtLmQNsQbjB
FrSPFjtVvwsqSwcG
hDHdWDngpgZTDgHzzHwNNqlwNvZJlGqcQGsl
wDzLTDHgFffLtRft
CnCJNVqvCBJBNZmfPcPMcFLVcwmd
HgzjHFghSFtrLfwPchPM
QDpjgDSQlHHlDQQRzRzsBRRvWnWvJvZnqWBJNF
mGHcFPFqzPtcfPwDGVVpgLgSlgBl
rCvddTrnsbDLVSDwjSjd
QWhWQThswssMQMMMvhTzPqJzmzftHccJfHFhFm
cPbNpLVFTPbbFrpTLQBzqqmgnnBhgLMM
vvSwWCZCRZCDZtGwzdgWdQmzqgnQddJn
vCltGltCGmRRmCvDjjtHFpbcFfbbfssbpNPpHFpH
WLLQMWZLSPMPWmrwhnjhZZhpHJHljBDB
csbtCfFgCftGljHwHcBnpnJR
tsvgszNtfMwPzWqPrS
NbDZrbrFQQqqQtQqQDtTcBvCLBLswsZhscCGBZ
ljmWRzVRpbndMWmmfdsTsCBsGwTVVVCGCGws
ffRpnllHRMfdWzdnmRNQNNSFQQFNbrFHHrNH
LccGzWNjcvNLGTmHNsNLMlMwMpMPGlMCwFwDDGCw
fZZtfrZgrfQSnnnSnJRCglHpCwwHwpglDClFMw
SqJQnffJRnfQQVRhrQtrhnThcLhzNzHdTjhsTWzjdmcm
QJQwJMSbtbRgMQMQVZpCZsrrhpZBwrLLvs
qCNPGWdqhpphsWrB
DcNPNnqjdGDqjmPGGJRFMQmgtlQmQJCSgb
blTRbDnHRGGBwnGPCtFPWzVCDvFWtL
pdSJprqhhZSdqSdZNhVzZWtzLVgVPvzjLzWv
rrsqsmrMpPHlwTsRHn
mbNhgbRSLmTwswFm
vHjHBWMHBzMqWZVZBzHzcwwwdcFLcpLspdzwpwQd
HfMWMfvjWtZHqWDlhSnnnJNnbhslDb
lwsvPPnqlwwwsPcHTgqcRcSccmgQ
CVWBWCFpFzWfFjWjhNSQJJmcVcHRZJNTSc
zdhfzBtfLLtfFClbrDvsPvtPbnmv
PntVQbDnQHcDVvhtbtDhcbPcFTrrNfjqmmPTTZqMLZZMjFZm
lgJCpCFCSCGCpllWMfZqTNNZrMjrJTTM
CSzSwgFlzsGBzQcQhsnnDbVdtc
THzqvrVrWzhqhWwqhTbNNDRtFRmmpFDDVsFLLsdddF
MbZSSScZSGCJCjZlCjdPmpRmFLDtctdmFRsp
GfJQlnZjSMnllbJCQbClnZQrhNwwqhBzTNhrffqhqWhTqz
BdBdmDZHFFbrHHStPSRtPCzSRNDS
JGGpwqLJGMTLpLlMpqLhJtzCCSGQSPzNNczVVPVzSV
WwpllfslqfhffLwhfJpJlqlwdBmZnrdFHBFBBmNHFsFmdZmn
jZfQZnZfnbRfjCnfbSSmVpqmNmVpCqlhCqqPpP
MdJMwMvvLDssLtFMsMtLDsvvDRmmmPhWzWzphpmqDVzPDWNp
TsLdMrvRtLJtGdtGRRtFTBjSBrScnSZjnbcgQgHfnB
RZfmlRlWJmWLLRscrslJqvvMdVwmddvPddQPVDdDwz
GStFbFCbntbjNnjFhFvdHfhzHfzzQdMHwPdD
BSGpFbbjbNjnNNFSbRsLlWqgrZrfRgsBlg
ztHczmrmcNNzHsPSTwsPHSQPQT
CFCRjlvbClCjBdPDFQdwBsqn
llbRgjClJCVVMMCssfmNZWszrNgzGL
mmFldllVlmtdWFvPPFBcSSBW
DZzZGzZswQZHwQZjZzWWTSSvjSdvPvvWjJTS
DpQQggwzZGdmbCldgVgf
PJJvhqzVGbTFqzqbbGTlLmrtrZMnnZnntlJnrD
fNwRcQBCRNddNgLtgDnttqrMMtlr
RfRdNWQHcqHscdfRdGPFbFPpvpVWWzPzVS
DRgjZRRDggTfjfRvwWzHGGHPWDswvv
dhbmpcCmchgCpsGzWPdVGvWHwP
hpMMMpCQMnChFgNRQffTRrSN
gfqPCHWtPMMjCtffgjQWGLvGdZcdLLGZcLFGZBWG
pJTDsnnnvBjnFwvj
zJRpTbNrTSppRVblgbljMgMfCfbC
fGrGwqggtbVmtzbf
CTMjNQcJjJTBNCjMNZFNBcCZHbmWZHVLZDDWVtDzzbVmlV
hMvTcNMFMhQjTTBFBNMhwpspwgnGtvtnSgdwrRpG
RfFdqPdMMGPVgWmNVN
QwrTsbnSsSQpwlSSbNNWDmGLVjjmLWwNVB
rpcclTCprmZQSbprSTpRRRfqMfHHCHfhMhvFJM
LnJJsMtLbzsPPVPJbrTBlTWlfRfqnTrrlr
VDHVQNFGgNTrSjSBjq
CHFHGmvDGdZZGCQZVDgDHVbwLLwtMwwmJLJbLPPMbczt
qNNNBllFBzFjjzwGqGgLrWgrtQjdmmtQmQpp
ZMHJCPhMZRsRCsCPsSJZLmQdQgrtQwQwQZwdWg
CnMPbbRbsPhCnbfhMPRPllnFGqwTTFzTzNvBGBGc
wZWlBFZQgBzTzpZwBlVpzWBWnNMmnMvMcMJMmLGnVmqLqGMq
PdSDfJbCHsHHdJjsRRhjjPjmLqnnrLMLcrnLvdLMNccvGn
tSJtSCtbJhDhtzlFQZlTZTFp
TNqZDqmMDZNMFSGHjSGBRBdN
CrrwVwsPjjBHddPf
rpWggQVspQWcgtLwcHZZzDDMLDvvnnMzDM
lWrWmPwmGlZwZjdLZLzV
cFcDJhJnmqBqDCRpZzVLNsFLjLzdds
qJchTDCBHDWglmrfWPHH
RgLRnTJWnfHDcQQBfg
bZpNwdwbdMvVPsHHJMQfSSfP
mVbdNNdrbCzZbdZvbWTGrhqjTJtRWttRjq
TMtqqBJLrwqrZPlHHGhGnlBhzv
bFgNcpDRnpgggjCzvWDWhQhQWQHHvz
jnnVgjcgcTZMJqJVtT
dVSjmdHrfGPddrQgstFgzsQfsMFQ
hvJJCCJDcCtwBVFQzzBD
RWCnTvWTLRnJJLJllWhTLSprVdNZVGHGNGGnrdGSZH
gvMSHFZtBBMBMFZHzjnqLsLGMCzRWWMn
QJmDrhbNDbJfPQhDmQPRLszRlnjCzzWqrRnlsL
PcJVhJbJJNcNDmfDmjJmbhTfBvpwVSdggtgvgSFZwgvtgpdZ
PBClRHHClRlFljllZSBBBllppVGDLpZVVVsGpmGcNDpGLL
MvNwnbMwccVsswDG
MqnNbzMMrQfnqtttqfQWQQnRdCSHgHPglRFBRWlHjWRlCW
lldwdfSBWphHBggZghFs
DjDbDVRzDmLRzRLGJjPssrLZPhdshFHrssTZ
mvddMzvmmDDvvwQqWftCfqWqfM
gpTTwNWGWMSMgJjnvpvvJbJppn
lQvmLFdfrQzRFctlrLdRLVPnhPPbVDPDfjnVbfhJjV
FLFqccvmmtcQtrmQccRFLlRLSSWBSgTWNwsggqMBsqWGHMNG
PjPtVQrPVjrVPLLDQVFLTTWWqbSZwRwzqwSbSbbbwFSq
lBnGJBnfflRRNZwbqb
HJMGgmfpRMHGGdgncJHLDjjtVDQctLCvQCjTtr
VvmvjRGwRwvhmhRvvvVCCTTJjfWqfDMMcJlcCD
NpNbPfpSnngZbbLMFJWTMlLFqJJDMD
bNSfdSHQZgVQzwhhvRmQ
MhmHcDhChhcPVMDPDPQdFhQHnbNpZbZnprnrmNnjNbsllbnp
WWqGCWSCzsGbbGNgjN
LzwqBLSvwJCLPVMVDLdhMP
mNVLLffSLVWdZCcFZCZrSbGr
glvcwszTlsRDrHQCZFCvGH
gTBRlJnwhzgTgsTnggslsJRTpLNmjmNNcdVLdhfpLpdLVmLc
pCgfDrDrgccfppmDnhHMGqGbpHHSqzGLlqHS
tFtjQRPFFZRVNRcQGbLzLFMSGzSbWLqH
QRNTZjvjTTwtwNfmcTgfnCgnnBhm
hcPBhqPzqWPccHWHHWqnPdssPVfFFmZDnVDDms
NSLNCTRQZndRmDfnRD
QSGTGbjTSTJHBlbZZBbh
dgcWgVgWdvZSbbRtjLRZZZ
MMDPPfTnPTQrFDMpHzmmLztLnsszRtwbtS
rDfDqfHTpCSJqlCCGq
bjsgllstBbpNpslBpdBgqljgGwzJzDzwLGGrwLQQdJDwGhQh
nncmnmHHnmWRWmPfJCnvPRMrzvDhZZLGQwhDLhhMzZZZ
mffccVHRRPTTNlpNbNjJVslJ
DgPstgPtgPNNcjQQrtPJJCRSZTwSGJZZCZCJGD
dHVvpzdBBhVqzWqvhvHdzGSZlTRCSRJrwSSCwJCWGT
zpvVVqMBrzqrhFBvjbNPcPLnjcQtMcnj
gBcmTCFghhCCBnBhWWwFbwLdwHFMLMdp
LVzlZzPPMMzWWrwH
ljqjsGlZPPqqlVsPqDVqjQQctNTnRcNLtCNmmnRTRthBGG
LPRrrBNNjLBRJNdrGPRBfBrLwFqmDbdbTbTgmmgwmttFwtmH
QQcVvnQphlWsCQCCVpnvptTJgbtqwHDwbJtJHFsTHw
ppcJVQvpvMVMCvQZQVVZCCSRZPSjNRRZBPPPPzLjSLGf
MLtRnjQsRMJcDQJnSrsfqVVvGwbbbqgggg
WBFCNlFFFhFBlCHbplFWdpWZfVqPPwqTGdqTGvwrPVvTqvTr
HClCHzFzFBhmnjtQzMMSMnbD
sVnMCsdlMRcMFBGz
JvwwgrJDfgDmmggQrhNfhQQftjFrGRRtZFGBRZFHzjGcjrcj
PBJJvgDPNllPddVCPl
fmmRSnfnMnFSmMmmzTDSBFHtlJJqHJJqdHQdTCdtCCdt
WggGpNVVgWdwwHQtlGlC
hjbWppbLbLZLjVPPjPLSRRMvDlmSzDzBSnBFZf
nVttMPnPLjnJLjcnPVCjJJLcssfggBNlffgcNsWTcGcgNsBF
HQbwhmDrRrgFsWlQGNls
pZdbGzGrGpVttPLttv
LLbMrMHLDdWhmgbqqt
jGSQZQTpQGVVRSlQMQRljZmgmJBSvggvBWhJmJWvddmt
VjlQFGMVrFFrDrPw
DZVDwGZlJlVlwZVDzNdqfjMDnjqzNnWf
pmtpLRQFhSFpmpRgRtHNFznNdqWBjzWfnBjMWf
rHRrhStppHdJcGJrrssCsV
pgQqHwgPcPCddCjdWtdp
VfZGVFfNVhZhzjjjLz
fNNBBnGVNfBfRSRjBRQHJQTwJcJTgHPwTngr
MZdlzWzthMgrwmGmqZNqNs
VvJQJPVDBJQThwwNsRqsvRsHHm
BDQQPTnDDBQQBVfTBQPdFctzzdtztMMtnhcWcd
LjWjDShflZRRcZzfHH
srNwQPBsrVRhNmRGHzmM
rBdgQTrhdPndQTrsQQsrPwnTpLLCWDpSCLtCnvtSWpJjDCvl
gSlvDwCvcmcTQTFtRMjWHFVVHwtj
rbsphZZzBshGZssMffTVRFfFpWpfTH
GZNhZBhPBzTPNLDcDlCDCJNmlg
smZjGfvjbWWffQtf
dwRrdlVdDdgDbNtgcgQSNStQ
FdFVwdblFlzVrlwrTlndZHHZGhmLhhssjHhMjnjq
QFvQVFLLgVrFLBVgGhTtllPvmHRRGbTm
hDCCNCNCJNzWDZnqJDzSNCTnbRttHGRnccbPRtmmlmHc
qJshNMCNdVFVfsLB
FcLZZPFjdZcZMPcRjcRTgbpJlwbbTlmdTlGlwD
nrrNrHWBNSWvBqvvrhBqzStrgGnnmbwsbbJbwwJnmwmgJTlD
BCrrNvqWvSQPcCGZZRQQ
vPwcJblJzJbJcJFcwBSvJNdWRLtdsddGWWddWRWsMF
mDZmmDZDHVhfmjZgjVDfhTZHtsNptRsMntnWdsMnGtRntG
mhQrQDDhgqTTNfhmVQVBrPlBczSJbbCbCCPPvb
ZjbjLlbZjGqsgJTfHggrVvlB
tFDRFRnMFnnWtDdMdDRhzHfTJhJhffHvHTBHTgcfJV
nztDtdWzCCMSptSdFRRswZjsLbjwZmwqwGqpQV
vnvmmVnmVbrBJlzgWQWVNFzNHV
MwSjZhSwPjMwfDRzgWlNpWvHlgNNNP
CfSZjSfftwZDChDRSnccnrvBbbGrtBvctr
LCBRQRBQwRrCVLVWSrCSwCptzvhthvGGhdHzwppTTddv
mFnJJmnmFFFfPLNNmqqNJDpGnGtbHTtHvhnHbzvHvpGv
lMMPLqDmNMVSjjgMCS
zzPzbLjHLjfQPQHwwjddFNsNSJjDMsdNMFsC
BqqtmgDhcqdSFCdsqddF
GtcmrvhgcZlvZtBhtVgrvrvtnWzDnQbfnwlfWWRHWbbwzHRL
JfWHWZcMMdDLMPjRnCJjRbFgnblF
ShtBTSmBhTtqtfmqSTNvmjVjnFbFnnlrlqgCnrFnVg
vfzTTthppmdzPLHLWdGZ
tdvrvGgGTSScnHcjcg
zLLVfzPPcDZnPjSPpD
LfffNFLNlNbJwrctthWqNdNq
NdjJtfVNZnnFFdtfGfFNcvpbMDbzdcTbbzpvmcDR
PHMSHCHHWrRCvzDzDChT
BqPWSHwllSQWrLHQHPqlBBNfttZMjFQfjGtZtNjJJjnN
CpZtMCMQQpCVWjMDVjPVQsWWqJJhbTcddPlfhTRqchcJblhh
NwDSGNmGRccqNJfT
SBSSmgrrgGHnvSzwGVWDCzMCpLZtMsstLM
sbjHQsBlBQrrGjQjBqCRSnSCpnfngLnFhJngFfSP
zHVctHDcZtdJffnPpcSpFn
ZdwNMztdvzVdrqblvWsqHvBR
jPdjFPSbVDMMbqZzQWzQ
hFRrJlpprGhtlJGQzmCRmZBWQCHRQR
vThNplJpNhltNNlvcGDvwVFgnPwvSgPSSfjS
DhDTPQpTDmQbDQrrrWtWPJNNrrsJ
qqGjgwCgVRjMSRwMMGRGqjwvsNJJBZtrstvNBvHWHJvL
VqqgfjzfgfFGVjRggCGznhlbTpQchcshpdFlnDbn
DpTQTBbCZQVJQZJjrFllGdlvMPlMLqGBGvLl
hmnWHWWNzzmHsmWRlGGpdLgLHGlqvgqg
RzcWRhRnRnfmswfwtzzRWrDTrrFCQTCpQpcCrjjQCp
HLvpHvGcBTDFznvfqT
hCPQbPZPbjSbwwjCPChSClJJfzqTggTFDfsJngDg
StqmmZbdqrQmhQrrhZWcRcGBpBHWVcLctMWp
dNnRNbRdbRJMBMBVVThn
rNrsLNscFsCDjpwTMgBGWMGjJjWBVJ
wNcLpqHNsCprsfLFsHwRvPSSPRZRtRQSqtQPmP
PPhGfbthhBDVsTDtDqRR
mCmSNmqpcqjjrCScWRsZDpHsDQRZQDZDss
CcWzNmccrjjvqBGzzdPGnv
SDRmCSFfcSFFcfDmDBFSCfdVJhpzZjNJTNzRTvjzjhzNjTtZ
ngGsltrMWrblNpNTJJplJN
PGGnGsWngrGLQHHtHHHgWsHSBLqqfLcqBdVdcCDDBFdCDm
VPjGwhwVPhrnqhzJmQvQTQvmzBzw
ZBDBRbLLdtfRLlddLlCLCZMgmFJQFDcvzMQmgMzzJJFJ
LHLWltHlRZCtBVhVVHPjGSpphp
JqhlhdnnmfRVVSpzWLjzVLGpvB
stQtFTTrsZQPFQNNDtQgLzzSLvjvLGLBGSZGGWJv
DDDFFgDPbTwbTTJMCMcbCqqmmRRCnb
JbDWPDPPJJDMDjHPZHGbHGVZTBhrzBpdzszdTTphdNdWdrpv
RmRRqllqffwFtqwLCsqTNvpCsqCNqvdN
fmfLmStlnnfnRtfcnQbbjPjPPggZGVsMQMbb
WJggvGDJSwWgSfgvfSMGqqQHBcPjcHChcQBCssDHCTTQ
mlRnbrnbnltblwdnnpbLRdCCjCTHTjPTTsQcTrHHhCcj
bFLbdmzRpvSwfFFNWN
BHnDnQHnHMWLwzWPzD
dmlZCrdqLZzZVZJM
tRRtdlLCjLmqCRsrSLrvvRQNFQnbgRTQQNHTBbGQQh
ZrQPQWCrJnPdQSNTmBJNTHGHJN
zhFRfswjwhhsFttfsfvQftRtLTzmBTHGTBmzMLHHLmGHNTTS
hQhwqVjQwsdggrZZCWVl
VjfnQgVQjblChfjVJlbzLtrSLlTGtztHTtsTGH
DDqWQDQMWmDwWNwcqdWvpSrtLpLsptMprMStstMz
vQcddRdRvWcwWRmmmmddZmmfVnnngJJbZnCBnBhhFbhCgJ
gVgDnnmJdQVdJJgtgDjBsBhsBSPRSRRSSwccSbSqwPcCPcSC
HrQHlHFpQfTHzzWzwScPPCRfLbPSfCSR
TTQlZNTzlZNMWvrZMlpnhnVtnDDnVNtVJnjmhg
MCmmssFnZJcNNszfpvvrpvJzvwpp
BRRRWQWbSRGGRTTtZHWSqTrvDfgfdfrrwrDgfbvfzfrd
jRBhWRWTSRttQBZMNchNCsmFMchP
GBDncllqcSlNFZWBFWPjHVbw
LQphJlJzLCwPjHbpHZvV
hzCMJLMzTsrdrszQCCCTCQCDlqqnNmggqfGmgdmGgcmSNt
hFVVbqJsqhcnBRTRGBTh
lwdDpmzdNznzZBgGRRjR
HdmvNvSCmDmwNDFrMJMqJFCRfsbq
ctnbTcFTnbwSSfrrMLRhpJLMRdpwdJJR
vdGCVBmGVHPLBRWhpRLJJZ
VmQPHqvsPdlQsVHDftnlFTbffnbttfTF
LBJZHrhLThHddcMLVtcMcL
CPMNFDDMpGqFjjSPDPDqdvmdtQgVQQcQWcQgQQsj
DzFDFMRSFPSGTJJTJBwwRhBw
dpldqlqlRppFTHpbjbnLRLVnnGfjtG
NNJTcmhzvJQNgMJBwcGtjtGbttfhtsGGnhnt
rzcwmgvcvrBNvvmMgvcBzwHPCTWWprqPHqTFWdPCWDTF
BNllDRTNqDNvNDDLBcDvBCLVJrVdJdtrnrCHggtrdd
mppFMFjpMFZQZQGjFCdgrCrCdrvVGtJJCC
PZsQmfPphvPjSsjmPjfZllBwcNRDNcDqNNWbTclS
fjqZBSDSDwwsQwCDND
rrdMdjVWtTTPslsslFLTLCsJ
rvPWbvcmHjmdPbHvrvBHgqRRgqHGgfZGfHRS
ggTQgsgwFrTrggbMTvSdmjfCmmQDcmqjDjmc
nLZnRhNZnnNHZhZVStCcDqjcqmjSjH
RWGNnhzBnJJRRWNRBNZNLZhFMTFPvrTrTlsggPwSlFMWTw
RNmnPRnLGcQmzBQpHHjTltjtlfgspbsq
CZvCJwZMMCCMdFVcwJJsgTTHfsTlbfbgbT
SSVFhWCZdSCcWCcWdrvhzmnnnLNGDRDNzzLNGz
jPwfPwNfFpFNQpDjdMcjcrdddDHD
tzsRsGRLzhLhvqvhHMlqqV
LRBnRBGSnBSGsGSGmGtBJCmnNWZpPpTNPMwQMPNJFZTTNwWT
PCrStRPSPvZQcZPvqvfjSRWFFNFJFLZTTJTTVZFFGLFF
DlpBzBntHDzhlpGJVHLwTMFLVLTL
gptBBdgzpsBbpQvvPQPRqrdcCC

File diff suppressed because it is too large Load Diff

@ -0,0 +1,512 @@
[F] [L] [M]
[T] [H] [V] [G] [V]
[N] [T] [D] [R] [N] [D]
[Z] [B] [C] [P] [B] [R] [Z]
[M] [J] [N] [M] [F] [M] [V] [H]
[G] [J] [L] [J] [S] [C] [G] [M] [F]
[H] [W] [V] [P] [W] [H] [H] [N] [N]
[J] [V] [G] [B] [F] [G] [D] [H] [G]
1 2 3 4 5 6 7 8 9
move 6 from 4 to 3
move 5 from 8 to 9
move 1 from 4 to 5
move 1 from 4 to 5
move 2 from 2 to 7
move 2 from 1 to 6
move 9 from 6 to 1
move 12 from 3 to 5
move 1 from 8 to 4
move 3 from 1 to 5
move 1 from 6 to 7
move 10 from 5 to 2
move 14 from 5 to 1
move 8 from 7 to 9
move 11 from 2 to 9
move 1 from 3 to 9
move 11 from 1 to 5
move 2 from 1 to 9
move 1 from 4 to 8
move 6 from 1 to 5
move 1 from 8 to 3
move 16 from 5 to 1
move 4 from 1 to 3
move 1 from 5 to 6
move 4 from 3 to 4
move 1 from 6 to 7
move 21 from 9 to 6
move 2 from 1 to 9
move 2 from 4 to 9
move 5 from 9 to 4
move 9 from 1 to 6
move 6 from 4 to 6
move 1 from 6 to 2
move 1 from 7 to 6
move 1 from 3 to 2
move 8 from 6 to 9
move 3 from 1 to 8
move 1 from 2 to 1
move 13 from 6 to 3
move 1 from 1 to 9
move 2 from 1 to 6
move 3 from 8 to 4
move 4 from 4 to 9
move 3 from 1 to 3
move 22 from 9 to 8
move 1 from 2 to 9
move 6 from 8 to 9
move 15 from 6 to 5
move 5 from 8 to 9
move 11 from 9 to 8
move 13 from 5 to 1
move 1 from 6 to 5
move 1 from 9 to 3
move 21 from 8 to 3
move 3 from 5 to 3
move 11 from 1 to 2
move 25 from 3 to 1
move 5 from 1 to 7
move 20 from 1 to 7
move 1 from 6 to 7
move 16 from 3 to 9
move 8 from 9 to 6
move 1 from 1 to 5
move 5 from 9 to 4
move 2 from 2 to 1
move 2 from 9 to 4
move 1 from 9 to 4
move 1 from 8 to 4
move 1 from 5 to 2
move 3 from 4 to 6
move 1 from 4 to 7
move 9 from 7 to 6
move 5 from 4 to 6
move 7 from 7 to 2
move 1 from 1 to 6
move 11 from 2 to 5
move 10 from 5 to 1
move 1 from 6 to 8
move 1 from 5 to 7
move 24 from 6 to 1
move 12 from 1 to 4
move 12 from 4 to 8
move 2 from 2 to 7
move 3 from 7 to 2
move 5 from 2 to 8
move 9 from 8 to 9
move 9 from 8 to 5
move 1 from 9 to 1
move 14 from 1 to 8
move 11 from 7 to 9
move 4 from 1 to 3
move 7 from 1 to 2
move 3 from 3 to 7
move 12 from 9 to 7
move 8 from 7 to 2
move 4 from 9 to 2
move 1 from 3 to 6
move 5 from 5 to 9
move 14 from 2 to 1
move 8 from 9 to 4
move 6 from 4 to 5
move 5 from 5 to 7
move 1 from 8 to 2
move 2 from 4 to 6
move 4 from 7 to 3
move 10 from 8 to 4
move 2 from 3 to 6
move 7 from 7 to 6
move 10 from 4 to 8
move 5 from 1 to 6
move 8 from 2 to 1
move 7 from 6 to 8
move 9 from 6 to 5
move 16 from 1 to 6
move 2 from 3 to 9
move 1 from 7 to 4
move 2 from 9 to 1
move 14 from 6 to 7
move 1 from 6 to 3
move 2 from 6 to 3
move 9 from 5 to 7
move 3 from 1 to 6
move 3 from 3 to 7
move 5 from 5 to 9
move 3 from 6 to 2
move 1 from 6 to 2
move 12 from 8 to 2
move 5 from 2 to 1
move 2 from 1 to 3
move 25 from 7 to 1
move 1 from 4 to 6
move 2 from 3 to 9
move 26 from 1 to 9
move 2 from 1 to 8
move 1 from 6 to 8
move 1 from 7 to 1
move 7 from 8 to 1
move 7 from 1 to 5
move 1 from 1 to 2
move 2 from 8 to 6
move 32 from 9 to 8
move 1 from 6 to 5
move 5 from 2 to 9
move 1 from 9 to 7
move 24 from 8 to 3
move 1 from 6 to 9
move 3 from 2 to 5
move 1 from 7 to 9
move 4 from 9 to 3
move 8 from 8 to 7
move 18 from 3 to 7
move 20 from 7 to 8
move 6 from 8 to 9
move 6 from 5 to 1
move 8 from 9 to 4
move 3 from 5 to 4
move 8 from 8 to 4
move 2 from 5 to 2
move 3 from 1 to 5
move 4 from 3 to 7
move 6 from 2 to 9
move 3 from 3 to 6
move 6 from 4 to 5
move 2 from 6 to 3
move 1 from 3 to 1
move 4 from 3 to 8
move 8 from 4 to 3
move 4 from 3 to 7
move 4 from 4 to 5
move 4 from 9 to 5
move 3 from 3 to 4
move 3 from 4 to 9
move 1 from 1 to 4
move 2 from 1 to 5
move 7 from 7 to 8
move 4 from 7 to 4
move 1 from 6 to 7
move 1 from 1 to 5
move 1 from 3 to 8
move 11 from 5 to 9
move 17 from 9 to 8
move 13 from 8 to 4
move 1 from 4 to 8
move 4 from 7 to 1
move 4 from 8 to 3
move 6 from 5 to 4
move 3 from 3 to 6
move 2 from 1 to 9
move 1 from 9 to 5
move 1 from 3 to 5
move 5 from 5 to 9
move 2 from 1 to 8
move 21 from 8 to 6
move 2 from 8 to 4
move 4 from 9 to 6
move 1 from 9 to 7
move 19 from 4 to 1
move 28 from 6 to 5
move 7 from 4 to 2
move 28 from 5 to 3
move 1 from 9 to 4
move 1 from 4 to 2
move 1 from 7 to 8
move 1 from 8 to 9
move 13 from 1 to 3
move 8 from 2 to 8
move 3 from 1 to 2
move 5 from 8 to 5
move 1 from 2 to 7
move 1 from 9 to 7
move 1 from 2 to 3
move 2 from 7 to 9
move 1 from 2 to 6
move 1 from 9 to 1
move 9 from 3 to 9
move 3 from 9 to 1
move 1 from 6 to 8
move 21 from 3 to 7
move 7 from 9 to 4
move 2 from 4 to 2
move 1 from 8 to 6
move 7 from 1 to 4
move 7 from 7 to 8
move 4 from 5 to 9
move 10 from 7 to 1
move 7 from 3 to 9
move 1 from 7 to 9
move 1 from 5 to 3
move 3 from 3 to 5
move 10 from 4 to 2
move 1 from 3 to 7
move 2 from 4 to 9
move 3 from 9 to 1
move 3 from 7 to 1
move 1 from 6 to 4
move 1 from 1 to 2
move 1 from 3 to 4
move 2 from 4 to 3
move 1 from 7 to 4
move 4 from 8 to 9
move 1 from 4 to 9
move 3 from 1 to 9
move 12 from 1 to 7
move 2 from 9 to 5
move 12 from 9 to 7
move 5 from 5 to 1
move 1 from 8 to 5
move 4 from 1 to 4
move 1 from 9 to 6
move 1 from 3 to 4
move 3 from 8 to 3
move 1 from 1 to 7
move 8 from 2 to 5
move 2 from 8 to 1
move 10 from 7 to 1
move 4 from 9 to 5
move 2 from 5 to 8
move 11 from 5 to 4
move 6 from 7 to 2
move 2 from 2 to 1
move 1 from 7 to 5
move 1 from 5 to 1
move 2 from 4 to 8
move 1 from 6 to 9
move 8 from 4 to 3
move 8 from 1 to 7
move 7 from 1 to 2
move 4 from 3 to 9
move 1 from 9 to 6
move 7 from 2 to 1
move 5 from 2 to 3
move 2 from 7 to 8
move 5 from 8 to 4
move 2 from 9 to 3
move 1 from 8 to 1
move 6 from 3 to 5
move 10 from 3 to 1
move 3 from 5 to 3
move 3 from 2 to 1
move 1 from 5 to 4
move 6 from 4 to 5
move 1 from 6 to 2
move 3 from 4 to 7
move 1 from 9 to 4
move 2 from 3 to 1
move 1 from 9 to 8
move 1 from 3 to 7
move 4 from 4 to 8
move 2 from 7 to 4
move 8 from 5 to 9
move 2 from 8 to 6
move 2 from 4 to 3
move 2 from 3 to 4
move 4 from 9 to 7
move 1 from 8 to 7
move 2 from 6 to 9
move 2 from 8 to 9
move 1 from 2 to 9
move 1 from 7 to 8
move 1 from 2 to 7
move 19 from 7 to 6
move 1 from 8 to 1
move 2 from 4 to 8
move 5 from 6 to 1
move 2 from 7 to 2
move 2 from 2 to 8
move 2 from 1 to 8
move 4 from 8 to 2
move 3 from 2 to 8
move 6 from 9 to 5
move 8 from 6 to 3
move 26 from 1 to 6
move 1 from 5 to 3
move 1 from 1 to 5
move 8 from 3 to 1
move 1 from 3 to 7
move 3 from 9 to 2
move 4 from 2 to 6
move 26 from 6 to 1
move 1 from 7 to 5
move 3 from 8 to 4
move 2 from 8 to 2
move 7 from 1 to 2
move 1 from 5 to 9
move 2 from 4 to 6
move 9 from 6 to 2
move 18 from 1 to 7
move 6 from 7 to 1
move 6 from 5 to 6
move 1 from 1 to 2
move 19 from 2 to 7
move 1 from 4 to 2
move 9 from 7 to 1
move 3 from 6 to 7
move 1 from 9 to 4
move 1 from 2 to 3
move 8 from 7 to 8
move 4 from 6 to 5
move 2 from 6 to 3
move 1 from 4 to 2
move 4 from 5 to 1
move 8 from 8 to 7
move 17 from 7 to 8
move 3 from 3 to 1
move 1 from 2 to 8
move 8 from 8 to 4
move 8 from 8 to 7
move 1 from 8 to 2
move 7 from 7 to 6
move 1 from 2 to 7
move 5 from 7 to 8
move 7 from 1 to 6
move 10 from 6 to 1
move 4 from 7 to 9
move 3 from 9 to 7
move 1 from 7 to 2
move 6 from 4 to 2
move 7 from 1 to 5
move 4 from 2 to 5
move 16 from 1 to 9
move 3 from 2 to 7
move 2 from 4 to 9
move 4 from 1 to 6
move 5 from 7 to 4
move 4 from 6 to 3
move 1 from 7 to 4
move 1 from 6 to 9
move 1 from 8 to 5
move 4 from 3 to 2
move 2 from 5 to 3
move 3 from 6 to 2
move 3 from 2 to 1
move 9 from 5 to 8
move 1 from 3 to 1
move 10 from 8 to 1
move 1 from 8 to 5
move 16 from 9 to 2
move 1 from 3 to 2
move 12 from 1 to 9
move 1 from 9 to 2
move 3 from 1 to 6
move 2 from 1 to 9
move 3 from 6 to 8
move 20 from 2 to 7
move 16 from 9 to 7
move 1 from 7 to 5
move 2 from 5 to 9
move 2 from 2 to 3
move 2 from 8 to 5
move 3 from 9 to 7
move 2 from 5 to 2
move 1 from 4 to 6
move 2 from 1 to 4
move 23 from 7 to 5
move 4 from 8 to 5
move 7 from 7 to 1
move 16 from 5 to 7
move 1 from 6 to 5
move 1 from 2 to 4
move 2 from 3 to 9
move 1 from 2 to 3
move 13 from 5 to 1
move 1 from 3 to 8
move 1 from 9 to 4
move 19 from 1 to 9
move 2 from 1 to 9
move 22 from 9 to 8
move 14 from 8 to 5
move 12 from 5 to 3
move 21 from 7 to 9
move 14 from 9 to 7
move 1 from 8 to 6
move 9 from 3 to 7
move 1 from 3 to 2
move 4 from 4 to 1
move 1 from 2 to 4
move 1 from 3 to 9
move 6 from 8 to 9
move 4 from 1 to 7
move 2 from 5 to 9
move 6 from 4 to 5
move 4 from 7 to 4
move 1 from 5 to 3
move 5 from 9 to 7
move 2 from 3 to 1
move 6 from 9 to 6
move 1 from 1 to 6
move 2 from 4 to 2
move 8 from 7 to 5
move 20 from 7 to 5
move 2 from 5 to 6
move 4 from 9 to 5
move 1 from 1 to 3
move 1 from 3 to 4
move 1 from 2 to 7
move 1 from 4 to 9
move 9 from 6 to 3
move 2 from 4 to 3
move 28 from 5 to 3
move 1 from 8 to 3
move 1 from 8 to 1
move 1 from 2 to 8
move 1 from 6 to 2
move 1 from 8 to 1
move 6 from 5 to 7
move 1 from 5 to 1
move 1 from 9 to 2
move 1 from 1 to 3
move 1 from 9 to 7
move 2 from 1 to 2
move 11 from 3 to 8
move 3 from 8 to 6
move 3 from 6 to 9
move 25 from 3 to 7
move 4 from 3 to 8
move 4 from 2 to 3
move 9 from 8 to 9
move 2 from 3 to 7
move 3 from 8 to 2
move 11 from 9 to 7
move 1 from 9 to 1
move 4 from 7 to 3
move 1 from 1 to 5
move 23 from 7 to 2
move 12 from 2 to 3
move 2 from 3 to 9
move 12 from 2 to 1
move 2 from 3 to 9
move 1 from 5 to 4
move 1 from 2 to 5
move 1 from 9 to 4
move 1 from 5 to 9
move 2 from 4 to 2
move 3 from 1 to 4
move 1 from 2 to 1
move 10 from 3 to 2
move 7 from 7 to 3
move 11 from 7 to 9
move 5 from 3 to 1
move 1 from 4 to 5
move 11 from 2 to 3
move 9 from 9 to 3
move 3 from 9 to 4
move 2 from 4 to 8
move 1 from 5 to 6
move 13 from 1 to 5
move 3 from 3 to 8
move 3 from 7 to 2
move 1 from 7 to 4
move 3 from 8 to 3
move 8 from 3 to 8
move 4 from 4 to 5
move 2 from 8 to 2
move 8 from 8 to 3
move 1 from 6 to 3
move 2 from 2 to 8
move 6 from 5 to 2
move 3 from 2 to 8
move 1 from 1 to 7
move 2 from 9 to 3
move 3 from 5 to 4
move 2 from 8 to 6

@ -0,0 +1 @@
pqffvllhrhthvhshhpnhpnpqpvpvrpvpwvwjjdssmcsmccjvjmjjwnjwjwhjwwwzswwhvhwwlvvlbvbtbzbfbzbtbqbgbpbggwzggvjjdpdffbmffntncchtccbcffcjfjnjfnntssvtstzssmnnhrhlhbbwfwjfwjfwwbhhfhmmpsssbnssssfzzfpffdrdpdqqvnncjjgrjjmhhpqqcjqcjjzdzzpvvprrlglrrcmcqqtltdltddswsrrzzwgzzgssczcmzzmgmwgmggwwzttpccmcsmmvfvnvppzlzvzllgclggpfggfnfrfvrvwwvhwwvgwwrbbgfglflblzblzbznzhzffplffnrrcqqsgsvshvhlldhhvnhhmdddnssdvdwdwccggmddsmswwtctdtqqjsshhjzzdpdmpdmppjtjwjswjsjjjsdjjtrtbrbjjwwvnvppqphqhwhcwhwbbpgbbnhbnhhswwdswwlcczdztzbbbnwwtmmpvvgjjqgqdqzzdjdpjjnnffhccscvvchhbmbcbffpdpggvdvttpvpqqhggdtdhtdhhmghmgggzwgwrgwggwlggvpggcfcttzmtmgmvgmmpqmqlmqllsqqjbjwjsszczlzrzgrzzhshlhjjwttwnntbtjtjpplccqrqhrhssbmbttrddfvfwwjcwcvwcwwvpvggqwgwjgwgccvqqcmqqtqnqpnqnffdqfqhhqnhnmhmvhmhwwfrwrggnmmmcnmmgsszmzlmzmddcwwthtssgjsgjjgpgnppdqqcgqggzjgjngnrnggvffgddvtvctcftcftfnnnnhssbgsgwwthtqtltftqtnqttsrtrggwcgwcwmwgmgvmmzrmzrzjzmmcclmmtjmjhmmlhlwlppnpccbbrlrqrcrjrdrlrnngmnmvmcmzczztbblglccvzvppzspsddrzzlsllfzfsspnpdnpnvvvgmmpccmpcpgcpcwcddtmddgwgngqqcpqqlhqqczqqbvqqgdqgqmgmlmmvrrgfgzffbccldcdmmcmcgcngnghngngdngdndcncbbpqbbphbphpccpcwwjswwfttbqbsszccrbbdndsdrdqrqjrjjbmbtbdbbgbvgvcggwdwcccttqccnffjpjqqzpzlzvlljhhschhzlhhfhcfhchvcvtvtgvgzvzrvrdrgrwrjwjljhljlssszsqzsswhhmlhlrhlhzzgghjhzjjcllwrwtrrbdbrbnrnprnrffjvvphhvbbqbbscstsmslmlvmvrmmvvngnlnzzwqzzjqqsqbqrrtmrtmmfgmgrgjjtmjmrrddmrrqmrrjmjqmqnqmmcmlmfmffcgcclplffzvzwvzzjtztftqftqffjjpwjjbpjjggzdgzgwzzfrfvvhfvvwcvvbccfcvffpcpgpbbqhbbhmmzfmfvvnjvnjjhzhqqmffndndmmzhmmqnnlglvvjhjddvggqwgwdgwdggqbqgqrqlrrtptsswlssqwssbdsdrsddjsszjszjjpnjnvnjvnnmznmnddccpwwhshzzcfcqcwcddsjjmnjmjljwwgmglllqlhhctcvvqrvrrhfrrbcrrfbrfbrfrqffbwbqwbbjggsjjjnqqrqsqhhwnhnshnhhdjjqfqpqmmqgqgqggzmmnncrrpgglgqlqclqlsqqwnnfntnzttrnnmtmvvfppbrprzpzzdzvvtctnncpclpccsbbswwcscjssvhvhhqggzmgmqgmgwwgcwgccrllzhzzlzlbljbllmqqpjqqhrhqhjhbbjmjmhmddmwmcmvvmbbmvbmmznnwvwlwtllhwlwgwpgplgpgmgngjgglbglgmllvvlttgrrrlsrllghlggjdjwwfjwfjfvhjmgqnwhwpbdtzrphsqbmmvscslhbdzffsfshgsdjbqbwlgmrtschcnfhdlnndsvpwmwttfglpghhznmgfcjsdlwhnmfqvmpvhgpnnwtjfztbmtprqhsqtjwzhwcqjtjbtqwlcldnvggrwddmpllwnrqwdljwzfzqwcdwgqwvnthnrpcsfwrmqvbzjvzqnmdnfgtbzgtnrvblfwmhdsddgbffnjzvjzfpwglctpqhnqdvtblcchrlmndzhlsczgnsmnbwgnjngnjtlrdpfhqjrwcrqvcpspbtwcvgvvmpnwqjjpdpnslmcrcjnjmhqmrmfbcmrcmpbcbhpcvwqwflljfpgdvqhgdwgcphjqfnqzjjpsqnbtfzhftjtfcbhhcmmlwcfznsflfpphprrgvqwfgjcwfgjfsghzcbqrldwrjlzlbjhpgrbmgdpgzmfsqsphqbbslwwpzspccrhcfrgcjlfwhlcmzdcltbbpcrzglqgqntpwtmgstqlmcsqqbsqgmsmfznwcrfdgvsmnfqmwtsvqvlhwwjlrlhnsvcnrtwwmrjcgfncvlrcqrllndlvmrjpfjpgrrjcwhsqvlbtnlqgwjjqzwcvtvlnfnmqqshbcnqtcbvnwtwbfdgqmvnpmjhlsfdntfwwntvsrrsmspzqmglfnprjtdbmbgnplzzclsjpnzwdhcbhpfnqrgmgqtpfhgnfbqhrpmznbrshjhntzctslwhtgtjvpqhntmchhtncfjmbzcgnpcbpmldrtnpvrzqfftbjjcjlpwwgvmnstjghftcczjzfsftgzpfhbspqmrbfhcdfmqbrgrbsmjvgpbrnvbblwwvqzzpmqrspzvzppjfbgfftdvsdvmrjzhfslptzmgndnqqgmrrfnbbpvbmvpngwjhzvfbwfnzlrgwffvjsfdldfgchfjmnzfnzhwrwttrzlrhmnwvjjdqfmbpfllhrgmddjgnwjnbqwjnslcrdjrmnldcpsgzjpdhrpdfwhbvwhwnhcsmwcwstvqrcrqsnvjrzljfgbljfszchbsqnldgntvcscwqqmpnlwtlfmswtmvrlpzgbrjhtgjgpnhggnprpvwfqpjffqhtfvpnrptgrtwzzlvplgnfjmqphgmnssccrdndqgpljtwtntshrpgsjcdrpmccjnjdgmpmzbfhqjzphcswtwvvqcrwsjhtdqgrhqjmjjcrblpswcblnpzvfztqtbpgjcgngqmwrjtlmhvlsbmrdzwlgqlfqcqnsnjcnddssqbftjvnlgcwwfcgdpdmqrdsjmcnzrfrpnvjmbsltpzwjhjzqqvbgrltczbgvcpwdzqsvhddsbjgjgcmnldrfhnhddlvjcvsnghprjwlghhtghldcqsdcdgnmbcjglvjjvvlbhzczlmjsdqtdpzdtvfztgsdfjsdtfchvzcgvhjnnncmsrfvvmcsjjdftmlpczgvtwngssqmzlmsrrsrbhhhrnwqhmpcdvqmdsvvtsgsqfdcpgsdgzvmbzpbpgtcbshnvdzlmpnwmqrvnmrjprmvppjwfbjhlhzsfhqqzmpbclqvsvfrcqwprrcvqcbbwvnqfwnrgjhlwmgzpfspqrvqrhmqnwvzjrhvvgdgswlvzjjhjtdctlthlpzqhjvwwbpsclpgflcnsdshrqbhmczcwljqlndfnfrcdgmptpsltrcjccnpdchgnswdcpsslcslcjznzpgfhznhbgqhdqvddmqzdnmpshhdcjrsmfjllhfvjvmzzhzrvlbpzqngwmlwcmqnppqzncvjshfrpjlptvnqfrfcrfnbhwhpdqqvjhsqvsmprtgfrddwzjzlwhhqvjpfrwgwvwpszzsfzwjtwngdjfllhjrmqjtmvwsvggnswpqpjbtcrnhhhlzbrvhjdstnpctjlgsffrrbfdvjzhwsgthgfsqnvqdcjffsttlrjnhtqqdpfqpjtdgfwcdwzmwfvqgglsrmmqwbszclpzwldwcswpwfwldrfmmdndcptjbmnvgcpntqcdrcffvgnlpjmcqjpfmbmwjfpqzbzhqtqbzsghbnfvhphfzzhfznttpfrqwpmzjchpzzrdclhdltlqbjmjdfdjqlqbwptsghcnvtdscwgpqnlhhvsvglplhlrwpnzmdbsbrlhmpczzfz

File diff suppressed because it is too large Load Diff

@ -0,0 +1,99 @@
201221222310231210121242440413113300240004414452541255451423433301424221344321231200331000322022002
201110223212021301023231110004043440041124554211551214344435531144314002144220404322120300310201221
022020021300232232214420211402302113414555244354252313411231531323042333142321430241331131200211211
220101300101000212103133214111232525452452133144332223522145134313243143203441411323220330102101001
010013203211303344414334400001453124241242341433545332514312432413253552020220000011210222220213011
212222232311011011440242233434421552552224125313441224221452233155422331202244211404341301032111221
000210330211043141131201411214315555313554234431241423355241553322445342213244404311341411322311202
223012310332312111412202422252114251233433231164552322424224355244442532524110421232041401022103023
203212231033131211203222534413454122353525263556454546253645235311231121525153501243212023122321022
331310310124001323434212433231115432336534526522236536443633424625133244551543134110203434332100312
331233200232041103145125233451334566232552254635666656442655453534423322531411521134033421402331113
031333212400213344515542322452113324522342242354445452323465365534254431442152141421403144041023001
111303221312241302432354252153225363664664442542334456666266653255363425131231313432040341201422111
230022101140423311411245143352262322642565656564543663352325633432652452234241222524242132111120233
111002202003112133533152425634325552524645656633433542422554263422566342523144454431451112432214030
111104231403421133411522455246633653622253675366665655474442525346262352454224513234245423104124211
321141142120031135251255344323625365664335656464755544364767363442333262542665522525235523422123233
101014313242515522434326534623634543435675343737464477766767446534622342246356341444354234003142123
230232022033253314544352254635535575447345373545434435677453676557464324566466565421351335242321112
324420241333415323423265626324463475735354336456636435774744665334656336663634352353155433241211310
030100032243154112253364662343673653443776356553363473564676474674635776342552423313423224203120400
313344442241532454632632336565534536554545477575457734636653646644647334462532342224431251430133234
413132014253243413424445624573635374656346678654756887657637545745737634534436636222324125242024402
113100413333534433542565454674475563733488675576676868477648876554567666766524232656445322351414434
114123223232332232425343334636336773665747648846868678874577587766673644456465643265412421521201133
433041012151413325526323343447553567487566866867587566644445775875465754663466453542555421131441103
132340522435542462363422743774554376876785448587855877476675458688567373747442443245466552432324421
001021233221345225425647476736373858864468748564666587766576444778854633746456543224536224435144343
234221341152333442436376347375644678848647767874568458768858755578688754766533335643636425251131120
223105335322336464234466337533744687566688488899576587584868474485578476665654335343233341545541334
033032325442253263357677467463487786576588697995668587567655778544556877377544477336442225211523122
140154353323233625364336546576744454876575996956886776576698948786578676567434555522432665455131440
313521251524264253333577755458448688767956867777976656866587658447444445736763345764252422513242253
023424511426543544456663343755755748459566799865656687669788797758646748467363475635422256153224140
040321314324626545436674534784547758568766757677656858969886995695558567665737443363252565415344150
224134232343325522357534768848688787957655668596789999966575677878845446876456535336624424222231455
224141351544346645675355675766745888689569556687686779798865896789645846755553675353243252243411351
244135535456323653555537764747588998878955767878976797986558678967577874764547747434464533344425143
254344551326626563754656664464666866556959896686868789977787865795759658468474457364425643642411212
453432354266544435774445865475849765579556687767886876969778786857895575464486457633352542454311531
431323446665534437654774645868555875879887996699999976678997889596655848857674674334366422332131423
245452135325546335457446744684476967899679886979879698996697897997855964867458477746622265232555354
234513546444464376734635746755778769688676799687796696888799766889765865688876373437542642226125433
124245215563245676536345888666777599898988777699697986779696866797658566868868473643632652666351533
412451132633344473454648745764658888566869867687787987999777797986588975866654457357332433335414444
214414333445644664644347747885599757698899697887778998877986788877899565665758765536654545622452534
425352443532542334775575668585985767578876979977998988887887686767885597575655766766575354653322551
341323343434654663634654547879857799886688998878777779988866688979775597457468777564472225534313232
545124425425455546466668554678699967677669899897978998898998899788599766464844645635647324555615353
545411452345263737347485844557977699997899687999898887897977788878767859456654535453376264223653425
111311152252635334446768747469768968699976777899879777888798889676865859677666767645565466525231355
425533525462234753747757456555769688687686979977799979989866679677777588445675575365667543425623154
544233366232657335455767466465965566867896878789799899889796686878588976676765454545775533424511523
213441153422342646773654455468595778797987868997988897788886776776976696886686865337772632526551333
223554452333265577776587466746956965867898778978889799987988779678679598566887477545354665523235112
534133436255443447675576556488868877777996999897777877778886976875596896865556547544762534525314442
333241456452523646365586568585659757669779697699977988966878999966669897486554437473446232234121511
344115333364664776766656745848985588696899986667878779686697767998659797666847675734735245222231442
414421116236222746557346445556667785989969776897796778779898766568585677544857777436565343263435252
133434525653633667577578654688666889977898699697679686969897867589679554764664774745733424632352344
241154136646553346447565458778898578665599967876979878968797678959595958665677755354553525455142314
011531545644462635553357575585857967599756967986889968779697795989875787457554556734543454461552353
223153424523265457743743788566468566897765797698887987696796969986588488566667533467354346652442154
411332541562245264754564457768657877659759856797887977686999867686796487468863345554563554445134255
111111152164636664374633647847578898695598559978766698569775899567955786746775465564426263324444553
244253125346233646356467546577845849698988799899897579679867669859864645787673574552434344345421543
313313115326365453647664377447858465768998667857957855568967559654888565586453466642363553631131144
432324453225235235547466334664574786589598875799986676595566576847644447545343753752336234152525251
041531521223254566233454745748865445478787699579956555865695776855457447863535643733363343525114551
002112312431624652227743444674864555644698975796668758988698776486764464355443457365523254433512513
213025425212342232257347333654674566866566856688587995689556785455877476445665737465436243234311522
400325152331543653344567555367648447648775847858788668878587576477775557554474774235653624524534330
201225132353363462264255647775767565547755475456468556556578565447584737544473643345362433213313114
222142313121522636325455676356473784868847684547857878444855687668664767336445622335546145345553221
011011355414132665656464753366536557558774677648768857874477547858836463653763553636322355442530410
244212055241244343462426355575737537756477456688578557657558758575356557565526346354332122411232214
404021325424244446336422545654463737338587564878856584655878477734744566335662344233623132551341343
302032133433542245555262253634757534474445887585558485465487664466546477662342245456112345233243001
441424231444113525263343236263746464755754467688554485866476655546773473745226654234112252523030440
214032432253344413442463234355566734544765733634757753665665764545453673564236526462122422444104001
342103203351243333265426433662456366677333473674353645773747465566475564352543445251533541333334403
314113332405535512354633565233636736447653775566464363643645335346737346354226636131133352141022333
012012343144323112332254436526544236533546573336744457563475465653543325224626354322442521420203000
331323010121223544315513423655655344435557476643753446477775656646564342554325132242525131344222321
013113443341413122441453332444636352663764575335454747576375673332465664626322345312155532212204401
312123312343414451414343535265554646664244743356553546534375452526223246552512452455142313402141233
320132042340313215123423434262532632625523522545755533634625565435256525425314114232543100021433302
000212022130044034153312322223623326445365426236363246362343634253255362431451512323304432021213110
030222303030411241432442515255642524264645245624533655453352455635622223544425452133340032041433101
200220034012300142142244252413524255232546323662233533666365435656633125325513144442420012444122130
200221323034034213201532144243452523245462263635346324642653556664235141513141232204114310341312231
221120311223020030124243451422521115523224253343334243524235546443234444124541441344431230021211032
030220111310304344303042424233354533343456536522445363263243421454345411511253231421443333003202211
013020231130032133104102131224232231443322543262535624653543133544515143513154040413422013100020311
000301113320331113214023402453154244323213425144333413412222543221145125224314432430141213322313322
201033303203222202041033403054544522545144223421131541521154253154411423300402404134022222301133211
010103100303000230431121021240112315522153244433244415123132432444445242404242411321211032123012202
121002102321231001201142232101443245123213423322413515533435542224131011043014003402130011211231220
002220132213130200100332200140301325451123154323515145222525421135230113344411313343203012321310011

File diff suppressed because it is too large Load Diff

@ -0,0 +1,16 @@
#![allow(dead_code)]
mod day1;
mod day2;
mod day3;
mod day4;
mod day5;
mod day6;
mod day7;
mod day8;
mod day9;
mod util;
fn main() {
day9::part2();
}

@ -0,0 +1,19 @@
pub type uint = u64;
pub type sint = i64;
#[derive(Default)]
pub struct BuildSeaHash;
impl core::hash::BuildHasher for BuildSeaHash {
type Hasher = seahash::SeaHasher;
fn build_hasher(&self) -> Self::Hasher {
seahash::SeaHasher::new()
}
}
pub type HashMap<K, V> = std::collections::HashMap<K, V, BuildSeaHash>;
pub type HashSet<K> = std::collections::HashSet<K, BuildSeaHash>;
pub mod prelude {
pub use super::{sint, uint, HashMap, HashSet};
}
Loading…
Cancel
Save