aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tests/Cargo.lock9
-rw-r--r--src/tests/Cargo.toml2
-rw-r--r--src/tests/aoc-2021-09/Cargo.toml17
-rw-r--r--src/tests/aoc-2021-09/benches/main.rs31
-rw-r--r--src/tests/aoc-2021-09/src/lib.rs270
-rw-r--r--src/tests/aoc-2021-09/src/types.pr.rs12
6 files changed, 340 insertions, 1 deletions
diff --git a/src/tests/Cargo.lock b/src/tests/Cargo.lock
index 183a743..f16f8c2 100644
--- a/src/tests/Cargo.lock
+++ b/src/tests/Cargo.lock
@@ -12,6 +12,15 @@ dependencies = [
]
[[package]]
+name = "aoc-2021-09"
+version = "0.1.0"
+dependencies = [
+ "criterion",
+ "primrose-library",
+ "rand",
+]
+
+[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/src/tests/Cargo.toml b/src/tests/Cargo.toml
index 1d6189d..d15bd9b 100644
--- a/src/tests/Cargo.toml
+++ b/src/tests/Cargo.toml
@@ -1,6 +1,6 @@
[workspace]
resolver = "2"
-members = [
+members = [ "aoc-2021-09",
"example_sets",
"example_stack",
"prime_sieve"
diff --git a/src/tests/aoc-2021-09/Cargo.toml b/src/tests/aoc-2021-09/Cargo.toml
new file mode 100644
index 0000000..49da8bb
--- /dev/null
+++ b/src/tests/aoc-2021-09/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "aoc-2021-09"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+rand = { workspace = true }
+primrose-library = { path = "../../crates/library" }
+
+[dev-dependencies]
+criterion = { workspace = true }
+
+[[bench]]
+name = "main"
+harness = false
diff --git a/src/tests/aoc-2021-09/benches/main.rs b/src/tests/aoc-2021-09/benches/main.rs
new file mode 100644
index 0000000..2ebfbec
--- /dev/null
+++ b/src/tests/aoc-2021-09/benches/main.rs
@@ -0,0 +1,31 @@
+use aoc_2021_09::HeightMap;
+use criterion::{criterion_group, criterion_main, BatchSize, BenchmarkId, Criterion};
+use rand::{rngs::StdRng, SeedableRng};
+
+fn run_benches(c: &mut Criterion) {
+ let mut rng = StdRng::seed_from_u64(42);
+ for size in [100].iter() {
+ c.bench_with_input(BenchmarkId::new("part1", size), size, |b, &n| {
+ b.iter_batched_ref(
+ || HeightMap::gen(&mut rng, n),
+ |map| map.part1(),
+ BatchSize::SmallInput,
+ )
+ });
+
+ c.bench_with_input(BenchmarkId::new("part2", size), size, |b, &n| {
+ b.iter_batched_ref(
+ || HeightMap::gen(&mut rng, n),
+ |map| map.part2(),
+ BatchSize::SmallInput,
+ )
+ });
+ }
+}
+
+criterion_group!(
+ name = benches;
+ config = Criterion::default().sample_size(10);
+ targets = run_benches
+);
+criterion_main!(benches);
diff --git a/src/tests/aoc-2021-09/src/lib.rs b/src/tests/aoc-2021-09/src/lib.rs
new file mode 100644
index 0000000..9ada752
--- /dev/null
+++ b/src/tests/aoc-2021-09/src/lib.rs
@@ -0,0 +1,270 @@
+#![feature(type_alias_impl_trait)]
+
+use primrose_library::traits::*;
+use rand::{rngs::StdRng, Rng};
+use std::collections::VecDeque;
+
+mod types;
+use types::*;
+
+type Queue<T> = VecDeque<T>; // TODO: would be nice for this to be in primrose
+
+pub struct HeightMap {
+ map: Map<(usize, usize), usize>,
+ cols: usize,
+ rows: usize,
+}
+
+impl HeightMap {
+ pub fn new(map: Map<(usize, usize), usize>, cols: usize, rows: usize) -> Self {
+ Self { map, cols, rows }
+ }
+
+ pub fn gen(rng: &mut StdRng, n: usize) -> Self {
+ let mut map = Map::default();
+ for x in 0..n {
+ for y in 0..n {
+ map.insert((x, y), rng.gen());
+ }
+ }
+
+ Self {
+ map,
+ cols: n,
+ rows: n,
+ }
+ }
+
+ fn is_low_point(&self, x: usize, y: usize) -> bool {
+ [
+ self.map.get(&(x + 1, y)),
+ self.map.get(&(x.overflowing_sub(1).0, y)),
+ self.map.get(&(x, y + 1)),
+ self.map.get(&(x, y.overflowing_sub(1).0)),
+ ]
+ .into_iter()
+ .flatten()
+ .all(|v| v > self.map.get(&(x, y)).unwrap())
+ }
+
+ fn risk_level(&self, x: usize, y: usize) -> usize {
+ self.map.get(&(x, y)).unwrap() + 1
+ }
+
+ pub fn part1(&self) -> usize {
+ let coords = (0..self.cols).flat_map(|x| (0..self.rows).map(move |y| (x, y)));
+
+ coords
+ .filter(|(x, y)| self.is_low_point(*x, *y))
+ .map(|(x, y)| self.risk_level(x, y))
+ .sum::<usize>()
+ }
+
+ fn basin_size(&self, x: usize, y: usize) -> usize {
+ let mut visited = Set::default();
+ let mut queue = Queue::default();
+ queue.push_back((x, y));
+
+ let mut size = 0;
+ while let Some((x, y)) = queue.pop_front() {
+ if !(0..self.cols).contains(&x)
+ || !(0..self.rows).contains(&y)
+ || visited.contains(&(x, y))
+ {
+ continue;
+ }
+
+ let val = self.map.get(&(x, y)).unwrap();
+ if *val == 9 {
+ continue;
+ }
+
+ size += 1;
+ visited.insert((x, y));
+ for coord in [
+ (x + 1, y),
+ (x.overflowing_sub(1).0, y),
+ (x, y + 1),
+ (x, y.overflowing_sub(1).0),
+ ] {
+ queue.push_back(coord)
+ }
+ }
+
+ size
+ }
+
+ pub fn part2(&self) -> usize {
+ let mut basins = (0..self.cols)
+ .flat_map(|x| (0..self.rows).map(move |y| (x, y)))
+ .filter(|(x, y)| self.is_low_point(*x, *y))
+ .map(|(x, y)| self.basin_size(x, y))
+ .collect::<Vec<_>>();
+
+ basins.sort();
+ basins.reverse();
+ basins.iter().take(3).product()
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use crate::HeightMap;
+
+ macro_rules! mkRow {
+ ($($v:expr) *) => {{
+ let mut c = Vec::default();
+ $(c.push($v);)*
+ c
+ }}
+ }
+ macro_rules! mkMap {
+ ($rows:expr, $cols:expr, $($r:expr),*) => {{
+ let mut c = Vec::default();
+ $(
+ let r = $r;
+ assert_eq!(r.len(), $cols);
+ c.push($r);
+ )*
+ assert_eq!(c.len(), $rows);
+ HeightMap::new(
+ c.into_iter().enumerate().flat_map(|(y, xs)| xs.into_iter().enumerate().map(move |(x, v)| ((x, y), v))).collect(),
+ $cols,
+ $rows
+ )
+ }}
+ }
+
+ #[test]
+ fn test_small() {
+ let map = small_input();
+
+ assert_eq!(map.part1(), 15);
+ assert_eq!(map.part2(), 1134);
+ }
+
+ #[test]
+ fn test_large() {
+ let map = large_input();
+
+ assert_eq!(map.part1(), 560);
+ assert_eq!(map.part2(), 959136);
+ }
+
+ fn small_input() -> HeightMap {
+ mkMap! {
+ 5, 10,
+ mkRow!{2 1 9 9 9 4 3 2 1 0},
+ mkRow!{3 9 8 7 8 9 4 9 2 1},
+ mkRow!{9 8 5 6 7 8 9 8 9 2},
+ mkRow!{8 7 6 7 8 9 6 7 8 9},
+ mkRow!{9 8 9 9 9 6 5 6 7 8}
+ }
+ }
+
+ fn large_input() -> HeightMap {
+ mkMap! {
+ 100, 100,
+ mkRow!{9 7 5 6 7 8 9 5 4 5 9 8 7 6 5 2 3 4 5 8 9 1 0 1 2 3 6 7 8 9 9 9 8 9 9 9 1 3 5 9 9 9 9 8 6 6 4 3 5 9 7 4 3 2 1 9 2 1 2 3 4 9 8 9 9 9 4 3 4 6 6 7 9 8 9 8 7 9 9 9 9 8 7 6 5 4 9 8 7 6 5 4 3 5 6 9 7 6 5 4},
+ mkRow!{6 5 4 5 8 9 8 9 5 9 8 7 6 5 4 1 2 3 6 7 8 9 2 4 5 4 5 8 9 8 9 8 7 8 9 8 9 4 9 8 9 8 7 6 5 4 3 2 3 9 6 5 6 3 9 8 9 2 9 4 9 8 7 8 9 8 9 1 3 4 5 6 9 6 5 6 6 7 8 9 9 7 6 5 4 3 4 9 9 7 9 8 5 6 7 8 9 5 4 3},
+ mkRow!{5 4 3 4 5 6 7 8 9 9 7 6 5 4 3 0 4 4 5 6 7 8 9 9 7 9 6 9 8 7 6 5 6 9 8 7 8 9 8 7 6 9 9 5 4 3 2 1 9 8 9 6 7 9 8 7 8 9 8 9 4 3 6 5 6 7 8 9 4 5 6 9 8 7 4 4 5 6 7 9 9 8 7 6 5 1 3 4 5 9 8 7 6 7 8 9 9 4 3 2},
+ mkRow!{6 5 4 5 6 7 8 9 3 2 9 8 4 3 2 1 2 6 7 7 8 9 7 8 9 8 9 1 9 9 7 6 7 8 9 6 7 8 9 6 5 9 8 7 5 9 9 0 9 7 8 9 9 8 7 6 7 6 7 8 9 2 3 4 7 8 9 6 5 9 9 8 7 6 3 2 4 5 6 7 8 9 6 5 4 3 5 6 7 8 9 8 7 8 9 7 8 9 2 1},
+ mkRow!{7 6 5 7 7 8 9 7 9 3 9 6 5 4 3 2 4 5 7 8 9 4 6 9 8 7 9 0 1 9 8 9 8 9 4 5 6 7 8 9 4 7 9 8 9 8 8 9 8 6 6 7 8 9 6 5 5 5 6 7 8 9 4 5 6 7 8 9 7 8 9 9 7 5 4 3 8 6 7 8 9 8 7 8 5 4 6 7 8 9 3 9 8 9 5 6 7 8 9 2},
+ mkRow!{9 8 6 9 8 9 5 6 7 9 8 7 6 5 6 6 5 6 8 9 2 3 9 8 7 6 8 9 2 4 9 9 9 2 3 6 5 8 9 2 3 5 7 9 8 7 6 7 6 5 5 7 8 9 9 4 3 4 5 6 7 8 9 6 9 8 9 9 8 9 9 8 7 6 5 6 7 8 9 9 3 9 9 9 6 5 7 9 9 3 2 1 9 3 4 5 6 9 4 3},
+ mkRow!{4 9 8 9 9 5 4 2 3 4 9 8 9 8 7 8 6 7 9 0 1 9 8 7 6 5 7 8 9 9 8 9 9 1 2 3 4 5 9 5 4 5 6 7 9 6 5 4 3 4 3 4 6 7 8 9 2 3 6 7 8 9 9 9 8 9 8 7 9 9 9 9 8 7 8 9 8 9 9 1 2 3 9 8 7 9 8 9 5 2 1 0 1 2 3 9 7 8 9 4},
+ mkRow!{3 4 9 6 5 4 3 1 2 9 9 9 8 9 8 8 7 8 9 3 2 9 8 7 6 4 3 9 9 7 7 7 8 9 3 4 5 7 8 9 5 9 7 9 8 7 6 3 2 1 2 9 7 8 9 2 1 2 3 4 9 9 9 8 7 8 9 6 9 8 9 8 9 8 9 7 9 7 8 9 9 4 5 9 8 9 9 5 4 3 2 4 2 6 7 8 9 9 6 5},
+ mkRow!{2 1 2 9 6 9 2 0 9 8 9 8 7 5 9 9 9 9 8 9 9 8 7 6 5 3 2 9 8 6 5 6 7 8 9 6 8 9 9 7 6 7 8 9 9 8 5 4 9 0 9 8 9 9 4 3 2 3 5 6 7 9 8 7 6 7 8 9 8 7 6 7 8 9 7 6 6 6 5 9 8 9 6 8 9 8 7 6 5 4 3 5 3 4 9 9 9 8 7 6},
+ mkRow!{3 0 9 8 9 8 9 9 8 7 5 9 5 4 3 4 5 6 7 8 9 9 8 7 6 4 3 4 9 7 4 5 6 7 8 9 9 3 9 8 7 8 9 9 8 7 6 9 8 9 8 7 8 9 6 4 3 4 9 8 9 8 9 6 5 5 7 9 9 6 5 6 7 8 9 5 4 3 4 8 7 8 9 9 9 9 8 7 8 5 4 5 4 5 6 7 8 9 9 8},
+ mkRow!{5 9 8 7 6 7 8 9 7 6 4 3 4 3 2 3 5 6 8 9 6 7 9 8 6 5 4 9 8 6 5 6 7 8 9 4 3 2 3 9 8 9 2 0 9 8 9 8 7 6 7 6 9 8 7 9 7 6 8 9 8 7 6 5 3 4 6 7 9 9 6 7 8 9 9 4 3 2 3 4 6 9 4 3 9 9 9 8 9 6 6 6 5 6 7 9 9 1 0 9},
+ mkRow!{9 8 7 6 5 6 7 8 9 7 3 2 1 0 1 2 6 7 8 9 5 7 7 9 7 6 5 6 9 7 6 8 9 9 6 5 5 3 9 9 9 8 9 9 9 9 8 7 6 5 4 5 8 9 8 9 8 7 9 7 9 9 4 3 2 3 5 6 7 8 9 8 9 9 8 6 5 5 4 5 6 8 9 9 8 9 9 9 9 8 7 7 6 7 9 8 8 9 1 2},
+ mkRow!{9 9 6 5 4 7 8 9 8 9 4 3 2 3 2 4 5 8 9 3 4 5 6 9 8 8 9 8 9 8 9 9 3 8 9 6 6 9 8 9 9 7 8 8 9 9 9 8 9 6 5 6 7 8 9 3 9 9 8 6 5 4 3 2 1 3 3 7 8 8 9 9 3 2 9 7 6 7 6 6 8 9 9 8 7 8 9 4 3 9 8 9 7 9 8 7 7 8 9 4},
+ mkRow!{9 8 5 4 3 6 5 6 7 9 6 4 5 4 6 5 6 7 8 9 5 6 7 8 9 9 9 9 9 9 0 1 2 7 8 9 9 8 7 9 8 6 7 7 8 9 1 9 9 9 8 7 8 9 1 2 4 5 9 9 8 9 4 3 0 1 2 4 5 6 7 8 9 1 9 8 7 8 7 9 9 8 6 5 6 7 8 9 2 3 9 9 9 8 6 5 6 7 8 9},
+ mkRow!{8 7 4 3 2 3 4 5 6 8 9 5 6 9 7 7 8 9 9 7 6 7 9 9 8 7 8 8 9 5 4 3 5 6 9 9 8 7 6 5 9 4 5 6 9 1 0 1 9 9 9 8 9 4 3 3 5 6 9 8 7 8 7 5 1 2 3 8 6 9 8 9 1 0 1 9 8 9 9 8 7 6 5 4 5 6 7 8 9 4 5 9 8 7 5 4 5 6 8 9},
+ mkRow!{7 6 5 4 5 6 5 6 9 9 9 6 7 9 8 9 9 9 8 9 7 8 9 8 7 6 8 7 8 9 5 9 6 8 9 9 8 9 5 4 3 2 3 9 8 9 1 9 8 7 8 9 6 5 9 7 6 7 9 9 6 5 4 3 2 3 4 7 8 9 9 9 9 9 9 9 9 3 9 8 6 7 6 3 4 5 6 9 9 9 9 8 7 6 4 3 4 7 9 9},
+ mkRow!{8 7 6 5 7 7 6 7 8 9 8 7 8 9 9 8 7 6 7 9 9 9 0 9 6 5 5 6 9 9 9 8 9 9 9 8 7 6 4 3 2 1 9 8 7 8 9 8 7 6 9 8 7 9 8 9 9 9 8 9 8 8 6 5 3 4 5 6 7 9 9 8 7 8 8 9 1 2 9 9 5 4 3 2 3 4 5 6 7 8 9 9 8 7 5 4 5 9 8 9},
+ mkRow!{9 8 7 8 9 8 7 8 9 5 9 8 9 9 8 7 6 5 6 7 8 9 1 9 5 3 4 8 9 8 6 7 8 9 3 9 8 7 6 4 3 2 9 7 6 7 9 7 6 5 4 9 9 8 7 8 7 6 7 9 9 8 7 6 4 5 6 7 8 9 9 9 6 6 7 8 9 9 8 7 6 5 4 3 4 6 6 7 8 9 6 9 8 7 6 5 9 9 7 8},
+ mkRow!{4 9 8 9 2 9 8 9 3 4 5 9 9 9 9 9 7 3 2 6 7 8 9 8 9 1 9 9 8 7 5 9 9 5 4 9 9 8 7 5 4 9 8 6 5 6 8 9 6 5 3 9 8 7 6 5 4 5 6 8 9 9 9 8 7 6 7 9 9 9 9 5 4 5 6 7 8 9 9 8 7 8 5 4 5 7 8 9 9 4 5 6 9 9 7 9 8 7 6 7},
+ mkRow!{3 4 9 4 3 4 9 2 1 0 2 9 8 7 9 7 6 5 3 5 6 7 9 6 7 9 8 8 9 5 4 8 9 6 9 8 9 9 7 6 9 8 7 6 4 5 6 8 9 3 2 1 9 8 7 4 3 6 5 7 8 9 9 9 8 9 8 9 9 9 8 9 3 4 5 6 8 9 9 9 8 9 8 7 6 8 9 3 4 3 4 9 2 3 9 8 9 8 5 6},
+ mkRow!{4 5 9 9 9 5 9 9 2 1 2 9 8 5 9 8 7 8 7 6 7 9 4 5 9 9 7 6 5 4 3 7 8 9 9 7 8 9 9 9 8 7 6 4 3 4 5 8 9 2 1 0 9 7 6 5 2 3 4 5 9 8 9 9 9 9 9 9 7 6 7 4 2 3 4 7 9 7 8 9 9 2 9 8 7 9 4 2 1 2 9 8 9 9 8 7 6 4 3 2},
+ mkRow!{5 9 8 7 8 9 7 8 9 3 9 8 7 3 2 9 8 9 8 7 9 6 5 6 7 9 8 7 6 6 5 6 7 9 5 6 7 9 9 9 6 5 4 3 2 3 5 6 8 9 2 9 8 9 7 7 3 5 5 9 8 7 8 9 9 9 8 7 6 5 4 3 1 2 3 4 5 6 7 8 9 3 9 9 9 8 9 1 0 9 8 7 8 9 7 6 5 4 2 1},
+ mkRow!{9 9 9 6 4 5 6 7 8 9 8 7 6 5 3 4 9 9 9 8 9 7 6 9 8 9 9 8 9 8 7 7 8 9 4 5 9 8 9 8 7 2 1 0 1 2 4 7 8 9 9 8 7 8 9 8 9 6 6 9 8 6 7 8 9 9 9 9 7 6 2 1 0 1 2 3 4 5 6 9 9 9 8 9 8 7 8 9 9 9 7 6 5 9 8 7 5 4 3 2},
+ mkRow!{8 9 6 5 3 4 7 8 9 9 9 8 9 6 7 6 7 9 9 9 9 8 9 9 9 2 3 9 8 9 8 8 9 1 2 9 8 7 6 5 4 3 2 1 5 3 4 5 9 9 8 7 6 7 8 9 8 7 9 6 6 5 3 9 9 8 7 8 9 4 3 2 3 2 3 4 5 6 7 8 9 6 7 8 9 6 7 9 8 9 8 5 4 5 9 8 7 6 4 4},
+ mkRow!{7 9 9 6 7 5 6 7 8 9 4 9 9 8 9 7 9 8 9 9 8 9 9 8 7 5 4 6 7 8 9 9 2 0 9 8 9 8 7 8 5 4 3 2 6 4 5 6 7 8 9 6 5 6 9 9 9 9 8 5 4 3 2 4 4 5 6 7 8 9 5 3 4 3 4 5 6 7 8 9 6 5 3 9 4 5 9 8 7 6 5 4 3 4 6 9 8 7 5 6},
+ mkRow!{6 7 8 9 7 6 7 8 9 2 3 4 9 9 8 9 8 7 8 9 7 5 5 9 9 7 6 7 8 9 6 4 3 9 8 7 6 9 8 9 7 6 5 3 4 5 6 8 8 9 2 3 4 7 8 9 9 9 7 8 4 2 1 3 3 4 5 6 7 8 9 4 6 4 5 6 7 9 9 8 7 6 2 1 3 4 5 9 8 7 6 7 2 3 4 5 9 8 8 7},
+ mkRow!{5 6 7 8 9 7 8 9 2 1 2 9 8 9 7 6 5 6 7 8 9 4 4 0 9 8 9 8 9 8 9 5 9 8 7 6 5 6 9 9 9 8 7 6 5 6 7 8 9 2 1 2 5 9 9 9 8 7 6 5 2 1 0 1 2 3 4 7 8 9 9 8 7 5 6 7 8 9 9 7 6 4 3 0 2 3 9 8 7 8 5 4 1 2 3 4 5 9 9 8},
+ mkRow!{4 4 4 9 8 9 9 9 1 0 9 8 7 6 6 5 4 5 6 7 9 3 2 1 9 9 7 9 8 7 8 9 9 7 9 5 4 5 6 9 9 9 8 9 8 7 8 9 7 4 2 3 6 8 9 9 9 8 5 4 3 2 1 2 3 4 5 8 9 6 5 9 9 8 7 8 9 9 9 5 4 3 2 1 3 9 8 7 6 5 4 3 2 4 4 5 6 7 8 9},
+ mkRow!{3 2 3 9 7 8 9 8 9 9 8 7 6 5 3 4 3 6 7 8 9 4 9 9 8 7 6 4 7 6 9 8 8 6 7 4 3 4 6 7 8 9 9 4 9 8 9 8 6 5 6 4 7 9 9 9 8 7 6 5 6 4 2 3 4 5 6 7 8 9 4 4 5 9 8 9 3 9 8 7 6 5 4 5 4 9 9 9 7 8 5 4 5 7 5 6 7 8 9 9},
+ mkRow!{4 5 9 8 5 6 6 7 9 8 9 5 4 3 2 1 2 5 6 7 8 9 8 6 9 8 4 3 4 5 9 7 6 5 4 3 2 3 5 6 9 7 4 3 2 9 2 9 9 8 7 5 6 7 8 9 9 8 7 6 7 6 3 4 5 6 7 9 9 5 2 3 4 7 9 9 2 0 9 8 7 6 5 7 9 8 7 9 8 7 6 5 6 9 6 7 8 9 9 8},
+ mkRow!{5 9 8 6 4 5 4 6 7 7 8 9 4 3 1 0 3 4 5 8 9 8 9 5 4 9 9 4 5 6 9 8 7 4 3 2 1 6 7 8 9 6 5 4 1 0 1 2 3 9 8 6 7 8 9 4 6 9 8 7 8 7 4 7 6 7 9 6 5 4 3 4 5 6 7 8 9 9 9 9 9 7 6 7 9 8 6 5 9 8 7 6 8 9 7 8 9 8 7 7},
+ mkRow!{6 7 9 7 3 2 3 4 7 6 9 8 9 3 2 1 2 3 8 9 9 7 8 9 9 9 8 9 6 8 9 9 8 7 4 3 4 5 8 9 6 5 4 3 2 1 2 4 4 5 9 7 8 9 3 3 4 2 9 8 9 6 5 6 7 8 9 7 6 5 4 6 7 8 8 9 9 8 9 9 9 8 9 8 9 9 9 6 8 9 8 9 9 9 8 9 8 7 5 6},
+ mkRow!{8 9 8 3 2 1 2 3 4 5 6 7 8 9 3 2 3 4 6 9 8 6 9 9 7 8 7 9 9 9 9 8 7 6 5 6 5 6 9 8 7 6 5 4 3 4 4 5 6 7 9 8 9 3 2 1 0 1 2 9 8 9 7 7 8 9 9 8 7 6 9 8 8 9 9 9 8 7 8 9 9 9 9 9 3 9 8 7 9 1 9 9 9 9 9 5 9 8 4 3},
+ mkRow!{9 9 7 5 9 0 3 5 5 9 7 8 9 9 9 4 5 6 9 9 7 5 9 8 6 5 6 7 8 9 6 9 8 7 6 7 7 8 9 9 8 7 6 5 4 5 5 8 7 8 9 9 6 5 3 2 1 4 3 9 7 9 8 9 9 8 9 9 8 9 8 9 9 0 1 9 7 6 7 8 9 8 9 1 2 3 9 8 9 0 9 8 9 8 9 4 3 2 3 2},
+ mkRow!{4 5 9 9 8 9 9 6 7 8 9 9 9 9 8 9 7 9 8 7 5 4 5 7 8 4 5 6 9 5 5 6 9 8 9 8 8 9 2 3 9 9 7 6 5 8 6 9 8 9 9 8 7 9 4 3 2 9 9 7 6 5 9 5 6 7 8 9 9 8 7 8 9 1 2 9 6 5 4 5 6 7 8 9 3 4 5 9 9 9 8 7 6 7 8 9 2 1 0 1},
+ mkRow!{5 9 8 7 7 8 8 9 8 9 9 9 9 8 7 8 9 9 8 5 4 3 4 6 2 3 4 9 5 4 3 4 5 9 8 9 9 0 1 9 8 9 8 7 7 9 7 8 9 9 8 9 9 8 9 4 9 8 7 6 5 4 3 4 5 6 9 9 8 7 6 7 9 3 9 8 7 4 3 9 7 9 9 9 9 7 6 7 8 9 7 6 5 5 5 8 9 3 1 2},
+ mkRow!{9 8 7 6 5 6 7 8 9 9 8 9 8 7 6 7 9 8 7 6 6 2 1 0 1 2 6 8 9 4 2 3 9 8 7 8 9 2 9 8 6 2 9 9 8 9 8 9 9 8 7 7 5 6 8 9 9 8 7 5 5 3 2 3 4 9 8 6 5 6 5 6 8 9 9 9 9 9 9 8 9 0 1 9 8 9 7 8 9 9 8 5 4 3 4 7 8 9 2 3},
+ mkRow!{9 8 9 5 4 5 6 7 9 8 7 8 6 5 4 5 6 9 8 7 7 8 2 3 2 3 5 8 9 3 1 9 8 7 6 9 9 4 9 7 5 4 5 6 9 9 9 9 9 8 6 5 4 5 6 9 7 7 6 4 4 2 1 2 9 8 7 5 4 5 4 5 7 8 8 9 8 7 8 7 8 9 9 8 7 8 9 9 9 8 7 6 3 2 7 6 7 8 9 4},
+ mkRow!{8 7 5 4 2 3 4 5 9 6 5 6 5 4 3 4 7 9 7 6 5 4 3 4 5 6 6 7 8 9 9 8 7 6 5 6 8 9 8 7 6 7 6 7 8 9 9 8 8 7 8 4 3 4 5 9 6 5 4 3 2 1 0 9 8 7 6 5 3 2 3 4 5 6 7 8 9 6 5 6 7 8 9 7 6 7 8 9 8 7 6 5 2 1 2 5 6 7 8 9},
+ mkRow!{9 7 6 4 3 4 5 7 8 9 4 3 2 1 2 3 4 5 9 7 6 5 4 5 6 7 7 9 9 9 9 8 7 5 4 5 7 8 9 8 7 8 9 9 9 9 8 7 9 6 5 1 2 9 9 8 7 9 6 4 5 2 1 3 9 8 9 9 2 1 2 3 7 8 9 9 2 3 4 5 6 9 8 9 5 7 8 9 7 6 5 4 3 0 1 3 8 8 9 4},
+ mkRow!{9 8 6 5 7 5 6 8 9 6 5 4 3 0 1 6 5 6 9 8 7 6 7 6 7 8 9 3 4 9 8 7 6 6 3 4 6 7 8 9 8 9 4 3 4 5 9 6 5 4 3 2 9 8 9 9 9 8 7 5 9 3 2 4 5 9 9 8 2 0 1 2 6 9 2 1 0 1 2 3 7 9 7 8 4 6 9 8 6 5 4 3 2 1 2 3 9 9 9 5},
+ mkRow!{2 9 7 6 7 8 7 9 9 8 6 5 2 1 2 7 6 7 8 9 8 8 8 7 8 9 3 2 3 9 8 7 5 4 2 3 7 8 9 9 9 5 3 2 3 9 8 7 6 5 4 4 9 7 9 3 2 9 8 7 8 4 3 5 7 9 8 7 6 2 2 4 5 9 3 3 1 2 6 4 9 8 6 5 3 7 8 9 7 8 5 4 3 4 3 4 6 7 8 9},
+ mkRow!{1 2 9 7 8 9 8 9 9 9 7 6 3 3 4 6 7 8 9 3 9 9 9 8 9 9 0 1 2 4 9 8 3 2 1 2 6 9 8 9 7 6 2 1 2 3 9 8 7 9 5 9 8 6 8 9 1 0 9 8 7 6 5 6 7 8 9 9 5 4 3 4 9 8 9 4 5 9 8 9 8 9 7 6 2 2 3 9 8 9 6 5 6 5 6 5 6 9 9 4},
+ mkRow!{0 1 2 9 9 6 9 8 9 9 8 7 4 5 5 7 8 9 5 2 1 2 9 9 9 8 9 9 4 9 8 7 4 4 3 3 5 6 7 8 9 2 1 0 1 4 5 9 9 8 9 8 9 5 7 8 9 1 2 9 8 7 6 7 9 9 8 7 6 6 4 9 8 7 8 9 6 7 9 8 7 6 5 1 0 1 4 7 9 9 7 6 7 7 8 7 8 9 2 3},
+ mkRow!{1 9 9 8 6 5 4 6 9 8 9 8 6 6 6 7 8 9 4 3 2 9 8 9 6 7 8 8 9 8 7 6 5 6 5 6 7 8 9 9 4 3 2 3 4 5 6 9 8 7 6 7 5 4 5 7 9 2 9 9 9 8 7 8 9 8 9 8 7 8 9 8 7 6 9 8 9 8 9 9 8 9 3 2 4 2 3 5 6 9 8 9 8 8 9 8 9 2 1 2},
+ mkRow!{9 8 8 7 6 4 3 5 6 7 8 9 8 9 8 9 9 6 5 5 9 8 7 6 5 6 7 7 5 9 8 7 6 7 7 7 9 9 8 8 9 4 3 4 5 6 7 9 6 6 5 3 4 3 8 6 8 9 8 7 9 9 8 9 6 7 8 9 8 9 8 7 6 5 6 7 8 9 1 0 9 8 9 4 5 3 5 6 7 8 9 7 9 9 9 9 9 9 0 9},
+ mkRow!{8 7 9 8 4 3 2 3 4 5 9 9 9 2 9 8 9 7 8 9 8 7 6 5 4 3 5 6 4 5 9 8 7 8 9 8 9 7 6 7 8 9 4 6 7 7 9 8 5 4 3 2 1 2 3 5 7 8 9 6 8 9 9 4 5 6 8 9 9 8 7 9 7 4 5 6 9 9 2 9 8 7 8 9 7 4 5 9 8 9 5 6 7 8 9 9 9 8 9 8},
+ mkRow!{9 6 5 4 3 2 1 4 5 6 8 9 0 1 9 7 8 9 9 0 9 7 5 6 3 2 3 4 3 4 6 9 8 9 9 9 5 4 5 6 7 9 5 9 8 9 8 7 7 3 2 1 0 1 7 6 7 9 3 5 6 7 9 5 6 7 9 9 9 9 6 5 6 3 5 6 7 8 9 8 7 6 7 8 9 5 6 7 9 5 4 5 6 7 8 9 8 7 6 7},
+ mkRow!{8 7 6 5 4 3 0 1 2 7 7 8 9 9 8 6 7 9 2 1 9 8 4 3 2 1 0 1 2 4 5 6 9 9 8 7 6 3 4 5 8 9 9 8 9 8 7 6 5 4 3 2 1 2 8 7 9 3 2 4 5 7 8 9 9 8 9 9 8 7 9 4 3 2 3 7 9 9 8 7 6 5 6 9 8 9 7 8 9 9 3 4 9 8 9 8 7 5 4 5},
+ mkRow!{9 8 7 6 5 4 1 2 3 5 6 9 9 9 7 5 6 7 9 2 3 9 9 8 3 4 3 2 3 6 7 8 9 8 7 6 5 4 5 6 9 8 7 6 5 9 8 7 6 5 4 3 2 3 4 8 9 2 1 2 5 9 8 9 9 9 9 9 8 6 5 4 2 1 2 6 7 8 9 6 5 4 5 6 7 8 9 9 6 8 9 9 9 9 8 9 6 5 3 6},
+ mkRow!{2 9 8 7 6 7 8 3 4 6 9 8 8 8 5 4 5 6 8 9 4 9 8 7 6 5 4 3 4 7 8 9 4 9 8 7 6 5 9 7 9 9 8 7 6 7 9 8 7 6 5 4 3 5 6 9 4 3 0 1 4 5 7 9 9 8 9 8 7 6 5 3 1 0 4 5 8 9 7 5 4 3 4 5 6 9 1 2 5 6 7 8 9 8 7 8 9 7 4 7},
+ mkRow!{1 2 9 8 8 9 8 7 6 9 8 7 6 7 4 3 4 5 7 8 9 9 9 8 7 6 5 4 5 7 9 1 3 4 9 8 7 6 7 8 9 3 9 8 9 8 9 9 8 7 6 5 4 6 7 8 9 7 1 2 3 4 6 8 9 6 7 9 8 7 4 3 2 2 3 6 9 8 6 4 2 1 2 5 7 8 9 3 4 7 8 9 6 7 6 7 8 9 5 8},
+ mkRow!{0 1 9 9 9 5 9 8 9 9 7 6 5 3 2 2 3 4 6 7 8 9 7 9 9 8 6 7 8 9 8 9 9 5 9 9 9 7 8 9 0 2 3 9 9 9 9 9 9 8 8 7 6 7 8 9 9 5 4 3 4 6 7 9 6 5 6 7 9 8 5 4 3 9 8 7 8 9 5 4 3 2 3 4 8 9 9 4 5 8 9 6 5 6 5 6 9 8 9 9},
+ mkRow!{9 9 8 6 5 4 5 9 9 8 7 5 4 3 0 1 2 5 8 8 9 7 6 5 8 9 7 8 9 5 6 7 8 9 8 7 9 8 9 5 2 3 5 6 9 9 9 8 8 9 9 8 7 8 9 9 8 7 5 5 6 9 8 9 7 6 9 8 9 9 8 6 4 5 9 8 9 7 6 5 5 3 6 5 6 7 8 9 6 9 6 5 4 5 4 5 6 7 8 9},
+ mkRow!{8 7 6 5 4 3 4 4 5 9 6 4 3 2 1 3 4 7 8 9 7 6 5 4 6 9 8 9 3 4 5 6 7 8 9 6 7 9 9 4 3 4 5 7 8 9 7 6 7 8 9 9 8 9 6 8 9 8 6 7 8 9 9 9 8 9 8 9 8 9 7 6 5 8 9 9 9 8 7 6 9 8 7 6 7 8 9 8 7 8 9 4 3 4 3 4 5 8 9 8},
+ mkRow!{9 8 7 6 3 2 1 3 9 8 9 5 4 3 4 4 5 6 9 9 8 7 6 9 7 9 9 1 2 3 6 7 8 9 4 5 6 9 8 7 6 5 6 7 9 9 8 5 6 7 8 9 9 5 4 7 7 9 7 8 9 7 6 8 9 9 7 6 7 9 8 7 6 7 8 9 2 9 8 7 8 9 8 7 8 9 9 9 8 9 9 3 2 1 2 3 4 9 8 7},
+ mkRow!{2 9 9 5 4 5 6 9 8 7 8 9 6 4 7 6 7 7 8 9 9 8 9 8 9 7 5 4 3 4 7 8 9 4 3 1 2 3 9 8 7 6 8 9 8 7 5 4 5 8 7 8 9 2 3 5 6 9 8 9 6 6 5 9 8 7 6 5 4 5 9 9 7 8 9 4 3 4 9 9 9 6 9 8 9 9 9 9 9 9 8 9 3 9 3 5 9 8 7 6},
+ mkRow!{1 9 8 7 5 6 9 8 7 6 7 8 9 5 6 9 8 9 9 2 4 9 8 7 8 9 6 5 4 5 6 9 6 5 3 2 3 4 6 9 8 7 9 8 7 6 5 3 4 5 6 9 0 1 2 3 4 5 9 6 4 3 4 5 9 8 7 4 3 2 1 9 8 9 8 9 4 9 8 7 6 5 6 9 9 9 8 9 9 8 7 8 9 8 9 6 7 9 6 5},
+ mkRow!{0 1 9 8 6 7 8 9 7 5 6 7 9 9 7 8 9 5 4 3 9 9 8 6 7 8 9 6 5 6 7 8 9 9 4 3 4 5 9 9 9 8 9 9 8 7 5 4 5 6 7 9 9 2 3 4 6 9 8 7 6 2 3 9 7 6 4 3 2 1 0 1 9 6 7 8 9 8 7 6 5 4 5 6 9 9 7 9 5 4 6 7 5 7 7 9 9 6 5 4},
+ mkRow!{3 2 3 9 9 8 9 7 6 4 5 6 7 8 9 9 9 6 7 9 7 6 5 5 6 8 9 9 7 7 8 9 7 8 9 4 9 9 7 8 9 9 3 0 9 8 6 5 6 8 9 7 8 9 6 5 9 8 7 5 4 3 4 9 9 8 9 4 3 3 1 2 4 5 9 9 9 9 8 7 6 5 7 9 8 7 6 7 6 3 2 3 4 5 6 7 8 9 4 3},
+ mkRow!{4 5 9 9 8 9 9 8 6 5 6 9 8 9 9 9 8 7 9 8 6 5 4 4 5 7 9 8 9 8 9 7 6 7 8 9 8 7 6 7 8 9 2 1 2 9 7 8 9 9 7 6 7 8 9 6 7 9 8 7 5 6 9 8 9 9 8 7 6 5 3 5 5 6 7 8 9 9 9 8 7 9 9 8 7 6 5 4 3 4 1 2 9 6 7 9 9 4 3 2},
+ mkRow!{5 9 8 8 7 6 7 9 7 8 9 6 9 7 8 9 9 9 8 7 6 5 3 3 4 5 6 7 8 9 3 4 5 8 9 8 9 6 5 6 7 8 9 3 9 9 8 9 9 7 6 5 6 7 8 9 8 9 9 9 6 9 8 7 6 5 9 8 8 9 4 6 7 7 8 9 8 9 9 9 9 8 9 9 8 7 9 3 2 1 0 9 8 9 9 8 9 9 4 9},
+ mkRow!{9 8 7 6 5 4 3 9 8 9 6 5 6 6 7 8 9 8 7 6 5 4 1 2 5 6 7 8 9 4 2 3 4 9 8 7 6 5 4 5 6 7 9 9 8 9 9 9 8 9 7 6 7 8 9 6 9 9 9 9 9 8 7 6 5 4 6 9 9 6 5 7 8 9 9 6 7 9 9 9 8 7 9 9 9 9 8 9 3 4 9 8 7 8 5 6 7 8 9 8},
+ mkRow!{6 5 6 5 4 3 2 3 9 1 2 3 4 5 6 9 9 9 8 5 4 3 2 7 6 8 8 9 5 4 3 4 5 6 9 8 5 4 3 1 0 9 8 8 7 6 7 6 7 8 9 7 8 9 9 5 9 8 7 9 9 9 8 8 6 3 2 9 8 7 6 8 9 5 4 5 6 7 8 9 5 6 8 9 9 8 7 8 9 9 8 7 6 7 4 7 9 9 6 7},
+ mkRow!{5 4 3 2 1 0 1 2 3 9 3 4 5 8 9 9 9 9 8 6 6 7 9 8 9 9 9 7 6 7 5 6 6 9 8 7 6 5 4 5 9 8 7 8 5 4 3 5 6 7 8 9 9 6 8 9 8 7 6 8 9 9 9 9 9 9 1 9 9 8 7 9 5 4 3 5 7 8 9 4 4 5 6 9 8 7 6 7 9 9 9 8 4 3 2 3 4 5 5 6},
+ mkRow!{8 5 5 6 2 1 4 3 9 8 9 9 6 7 9 9 8 9 8 7 7 8 9 9 9 9 9 8 7 8 7 8 9 9 9 8 7 6 5 9 8 7 6 5 4 3 2 4 8 8 9 5 4 5 9 8 7 6 5 7 8 9 9 9 8 8 9 8 9 9 8 9 9 5 5 6 8 9 5 3 3 4 9 8 9 6 5 6 7 8 9 6 5 4 0 1 2 3 4 5},
+ mkRow!{7 6 7 9 3 4 5 9 8 7 8 8 9 9 8 8 7 5 9 9 8 9 9 7 8 8 9 9 8 9 8 9 9 9 9 9 9 8 7 8 9 9 7 6 5 2 1 0 1 9 7 9 3 9 8 7 6 5 4 5 6 7 9 8 7 6 6 7 8 9 9 9 8 7 8 7 9 5 4 1 2 9 8 7 6 5 4 5 6 9 9 9 6 4 1 4 4 5 6 9},
+ mkRow!{8 7 9 8 9 5 6 9 8 6 6 7 9 8 7 6 5 4 3 5 9 8 7 6 7 6 9 8 9 9 9 9 9 8 8 8 9 9 8 9 0 1 9 6 5 4 2 1 4 5 6 8 9 9 8 6 5 4 3 3 4 9 8 9 6 5 5 6 7 9 2 1 9 8 9 9 5 4 3 0 1 2 9 6 5 4 3 4 7 5 9 8 9 3 2 3 4 5 7 8},
+ mkRow!{9 9 8 7 8 9 9 7 6 5 4 9 8 7 6 5 4 3 2 4 8 9 6 5 6 5 9 7 8 9 9 9 8 7 6 7 9 9 9 3 1 9 8 7 8 4 3 2 3 6 7 9 8 7 6 5 4 3 1 2 9 8 7 6 5 4 4 5 9 8 9 2 3 9 6 5 4 3 2 1 2 9 8 7 7 5 2 1 2 3 8 7 8 9 3 4 5 6 7 9},
+ mkRow!{9 7 6 5 9 7 8 9 6 4 3 4 9 8 7 6 4 2 1 2 7 8 9 4 5 4 5 6 7 9 9 8 7 6 5 6 8 9 4 3 2 3 9 8 7 5 6 3 4 7 8 9 9 8 8 6 5 1 0 1 2 9 8 7 6 2 3 4 6 7 8 9 9 9 8 7 6 5 3 2 3 5 9 9 9 4 3 0 1 4 5 6 7 8 9 6 8 7 8 9},
+ mkRow!{8 9 6 4 5 6 8 9 9 1 2 5 6 9 9 5 4 3 2 3 5 9 9 3 2 3 4 5 6 7 9 9 8 7 4 5 9 8 5 5 9 4 5 9 8 7 8 4 5 8 9 9 9 9 7 7 6 2 1 2 9 8 7 5 4 3 4 5 6 8 9 7 8 9 9 8 8 6 4 3 5 6 9 8 6 5 4 3 2 3 6 8 9 9 8 7 9 8 9 7},
+ mkRow!{7 8 4 3 4 5 6 9 8 9 3 4 6 9 8 6 5 4 8 7 6 7 8 9 1 2 3 4 8 7 8 9 9 6 5 9 8 7 6 9 8 9 6 8 9 8 9 5 6 9 9 9 8 7 6 5 4 3 4 3 4 9 8 6 6 4 5 7 7 9 7 6 7 8 7 9 9 8 5 4 6 7 8 9 7 8 5 6 5 4 5 9 9 9 9 8 9 9 8 6},
+ mkRow!{6 5 3 2 3 4 5 6 7 8 9 6 7 9 8 7 6 6 9 8 7 8 9 1 0 1 2 3 5 6 7 8 9 7 6 7 9 8 9 8 7 8 9 9 9 9 7 6 7 8 9 9 9 9 7 6 5 5 6 4 5 6 9 8 7 5 6 8 9 8 6 5 8 7 6 9 8 7 6 7 7 8 9 9 8 9 8 7 6 5 6 7 8 9 9 9 7 6 7 5},
+ mkRow!{4 3 2 1 2 3 4 7 8 9 8 7 9 2 9 9 8 7 9 9 8 9 8 9 2 3 4 4 5 7 9 9 9 9 9 9 9 9 8 7 6 8 9 9 8 9 9 9 8 9 9 9 8 9 8 9 6 6 7 5 8 7 8 9 8 6 7 9 8 7 8 4 5 4 5 9 9 8 9 8 9 9 8 9 9 1 9 9 7 8 7 8 9 9 8 9 6 5 4 3},
+ mkRow!{3 2 1 0 3 4 5 8 9 7 9 8 9 1 2 9 9 9 7 9 9 8 7 8 9 4 5 6 6 8 9 9 8 8 8 7 8 9 9 6 5 6 9 8 7 9 3 2 9 9 9 8 7 8 9 8 9 7 9 6 9 8 9 5 9 7 8 9 7 6 4 3 2 3 4 8 9 9 4 9 6 6 7 9 9 0 1 9 8 9 9 9 7 8 7 9 5 4 3 2},
+ mkRow!{4 3 2 1 2 9 6 8 9 6 5 9 1 0 9 7 8 5 6 8 9 7 6 7 8 9 6 7 7 8 9 8 7 6 5 6 9 8 9 5 4 5 4 7 6 8 9 1 0 9 8 7 6 5 6 7 9 9 8 9 2 9 2 4 9 8 9 9 8 6 5 2 1 4 6 7 8 9 3 2 4 5 6 7 8 9 2 9 9 5 6 9 6 5 6 7 9 3 2 1},
+ mkRow!{6 5 4 2 3 8 9 9 8 9 4 3 2 9 7 6 5 4 5 7 3 4 5 7 7 8 9 9 8 9 3 9 8 5 4 9 8 7 6 4 3 4 3 4 5 6 8 9 1 2 9 8 5 4 5 6 9 8 7 9 1 0 1 2 5 9 7 8 9 5 4 3 0 3 4 9 9 6 4 3 4 6 7 9 9 9 9 8 7 6 7 8 9 4 5 7 8 9 1 0},
+ mkRow!{9 5 4 3 5 7 8 9 7 8 9 4 9 8 6 5 4 3 4 8 2 3 4 5 6 7 8 9 9 3 2 9 8 7 6 7 9 8 6 3 2 1 2 3 4 7 8 9 2 9 9 9 9 3 5 7 9 7 6 8 9 1 3 3 4 5 6 7 8 9 4 2 1 2 5 8 9 7 5 9 5 9 8 9 9 9 8 9 8 7 8 9 4 3 4 6 7 8 9 1},
+ mkRow!{8 7 5 4 6 9 9 5 6 7 8 9 9 8 7 6 3 2 1 0 1 2 5 6 7 8 9 3 2 0 1 2 9 8 7 8 9 7 5 6 1 0 1 3 5 6 7 8 9 8 9 9 8 9 6 9 8 6 5 7 8 9 9 4 5 6 7 8 9 9 5 3 2 3 6 7 9 7 6 7 7 8 9 8 7 9 7 5 9 9 9 8 9 2 3 4 8 9 8 9},
+ mkRow!{8 7 6 7 9 7 6 4 5 6 9 1 2 9 8 6 5 4 2 1 5 3 4 5 7 9 5 4 3 1 4 3 4 9 8 9 7 5 4 3 2 1 2 4 6 7 8 9 6 7 9 8 7 8 9 8 7 6 4 5 9 7 8 9 6 8 8 9 9 8 9 4 3 4 8 9 9 9 7 8 8 9 6 7 6 8 9 9 9 7 6 7 9 0 1 9 9 8 7 8},
+ mkRow!{9 8 9 8 9 9 5 3 4 5 8 9 3 4 9 8 5 4 3 4 6 4 7 6 8 9 6 5 3 2 6 4 5 6 9 9 9 6 5 6 3 5 3 4 7 8 9 4 5 9 8 7 6 7 8 9 5 4 3 4 5 6 7 8 9 9 9 9 8 7 8 9 4 5 9 8 7 8 9 9 9 6 5 4 5 9 9 8 7 6 5 8 9 1 9 8 9 7 6 7},
+ mkRow!{3 9 1 9 8 9 4 2 3 6 7 8 9 9 8 7 6 5 5 5 7 5 8 8 9 8 7 6 5 3 9 5 6 7 8 9 8 7 6 7 7 6 4 5 8 9 4 3 9 8 7 6 5 6 9 8 9 5 2 3 4 5 8 9 9 9 8 7 7 6 7 8 9 6 7 9 5 6 5 8 9 9 8 7 6 9 8 9 8 7 6 7 9 9 8 7 5 6 5 6},
+ mkRow!{2 1 0 9 7 8 9 1 2 9 8 9 4 2 9 8 9 6 7 9 8 9 9 9 9 9 8 9 7 9 8 9 7 8 9 9 9 9 7 8 8 7 9 7 8 9 5 2 0 9 9 5 4 3 6 7 8 9 1 2 5 6 7 8 9 9 9 6 5 4 5 6 8 9 8 9 4 3 4 7 8 9 9 8 7 9 7 6 9 8 7 9 8 7 6 8 4 5 4 5},
+ mkRow!{3 9 9 8 6 7 9 2 9 8 9 3 2 1 2 9 8 7 8 9 9 6 8 9 9 9 9 8 9 8 7 8 9 9 9 9 9 9 8 9 9 8 9 9 9 7 6 2 1 9 8 6 5 4 5 6 7 8 9 7 6 7 8 9 8 9 8 7 6 8 6 7 9 9 9 7 6 4 5 6 7 8 9 9 8 9 6 5 7 9 9 8 9 6 5 4 3 3 3 4},
+ mkRow!{9 8 7 7 5 6 8 9 9 7 8 9 3 2 4 5 9 8 9 3 4 5 6 7 8 9 9 7 6 7 6 7 9 8 9 8 9 9 9 3 4 9 8 7 6 5 4 3 9 9 9 7 8 7 6 7 8 9 4 9 9 8 9 5 6 9 9 8 7 9 7 8 9 8 9 8 7 9 6 7 8 9 7 6 9 8 7 6 8 9 8 7 8 9 9 3 2 1 2 3},
+ mkRow!{9 9 6 5 4 7 9 8 7 6 7 8 9 3 4 6 7 9 0 1 2 3 7 8 9 9 7 6 5 8 5 9 8 7 6 7 8 8 9 1 9 8 9 9 7 6 9 9 8 9 9 8 9 8 7 8 9 6 3 2 1 9 3 4 9 8 7 9 8 9 8 9 6 7 8 9 9 8 9 9 9 9 9 5 3 9 8 7 9 8 7 6 6 7 8 9 9 0 1 4},
+ mkRow!{7 6 5 4 3 9 8 7 6 5 6 9 5 4 5 6 9 8 9 5 4 5 6 9 9 9 8 5 4 3 4 9 7 6 5 6 7 7 8 9 8 7 8 9 8 9 8 9 7 8 4 9 7 9 8 9 6 5 4 9 0 1 2 9 9 9 6 7 9 3 9 3 5 6 7 9 8 7 9 8 9 9 8 9 2 0 9 8 9 9 8 5 4 5 6 7 8 9 2 3},
+ mkRow!{8 7 4 3 2 1 9 7 5 4 9 8 9 5 7 9 8 7 9 9 5 6 7 8 9 4 9 6 9 2 9 8 9 5 4 3 4 6 7 8 9 6 6 7 9 9 7 6 5 4 3 4 6 5 9 8 9 6 9 8 9 2 9 8 7 6 5 4 3 2 1 2 3 5 6 9 7 6 7 6 7 6 7 8 9 1 5 9 9 9 5 5 3 4 5 6 7 8 9 5},
+ mkRow!{9 8 5 4 5 9 8 8 5 3 8 7 8 9 9 8 7 6 7 8 9 7 9 9 2 3 4 9 8 9 9 7 8 9 3 2 3 7 8 9 6 5 5 6 7 9 8 7 6 2 1 0 3 4 6 7 8 9 9 7 9 3 4 9 8 9 6 5 4 1 0 1 2 9 9 8 7 5 6 5 4 5 6 7 9 2 3 4 9 7 4 3 2 3 5 6 7 8 9 6},
+ mkRow!{8 7 6 5 9 9 7 5 4 2 3 6 7 8 8 9 6 5 8 9 8 9 3 2 1 0 9 8 7 8 5 6 7 8 9 3 4 5 7 8 9 3 4 5 6 7 9 8 5 4 2 1 2 3 5 8 9 9 7 6 7 9 5 6 9 8 9 4 3 2 1 2 9 8 7 6 5 4 3 2 3 6 7 9 9 3 9 9 8 6 3 2 1 2 4 5 5 6 8 9},
+ mkRow!{9 8 7 9 8 7 6 5 2 1 3 4 5 6 7 8 9 4 7 6 7 8 9 3 2 2 9 7 6 5 4 5 6 9 9 6 5 9 8 9 3 1 2 3 9 9 8 7 6 5 3 4 5 6 9 9 6 7 6 5 6 7 9 7 9 7 7 9 9 3 2 3 4 9 9 7 4 3 2 1 4 5 6 7 8 9 8 7 6 5 4 2 0 1 2 3 4 6 7 8},
+ mkRow!{5 9 8 9 8 5 4 3 1 0 4 5 6 8 9 9 4 3 4 5 6 7 8 9 4 5 9 8 7 6 5 7 8 9 8 7 6 7 9 2 1 0 5 7 8 9 9 9 7 9 4 5 6 7 8 9 5 4 5 4 6 9 8 9 8 6 5 7 8 9 9 4 5 6 9 6 5 4 9 2 3 6 7 9 9 3 9 8 7 6 5 6 2 9 3 4 6 8 8 9},
+ mkRow!{4 1 9 8 7 6 4 3 2 1 6 9 7 9 7 4 3 2 5 7 7 8 9 9 8 6 7 9 9 8 6 9 9 3 9 8 9 8 9 3 2 3 4 5 7 8 9 9 9 8 9 6 9 8 9 5 4 3 5 3 5 9 7 6 9 8 4 5 6 7 8 9 6 9 8 9 7 9 8 9 4 7 8 9 3 2 1 9 8 7 6 5 4 8 9 5 6 7 8 9},
+ mkRow!{3 0 1 9 8 7 8 9 3 2 7 8 9 7 6 5 5 3 4 5 6 8 9 9 8 7 9 9 9 8 7 8 9 4 5 9 9 9 5 4 3 4 5 6 9 9 9 9 8 7 8 9 8 9 5 4 3 2 1 2 3 4 9 5 4 3 2 3 7 8 9 9 9 8 7 8 9 8 7 8 9 9 9 4 2 1 0 1 9 8 7 6 5 6 7 8 7 8 9 5},
+ mkRow!{2 1 2 3 9 8 9 5 4 9 8 9 8 9 8 7 6 8 9 6 7 9 4 3 9 9 8 9 9 9 8 9 6 5 6 9 8 7 6 5 4 5 6 7 8 9 9 8 7 6 7 8 7 8 9 5 9 4 3 4 5 9 8 9 5 4 3 4 8 9 9 9 8 7 6 9 5 5 6 6 7 8 9 4 3 2 1 9 8 9 9 9 8 7 9 9 8 9 6 4},
+ mkRow!{4 2 5 7 8 9 8 6 7 8 9 7 7 6 9 8 7 8 9 9 8 9 5 4 9 8 7 8 9 9 9 8 7 8 8 9 9 8 7 6 9 7 7 8 9 9 9 9 6 5 4 5 6 7 8 9 7 5 4 5 9 8 7 8 9 5 4 5 9 9 9 8 7 6 5 4 4 3 4 5 6 9 6 5 4 5 9 8 7 6 9 9 9 9 4 5 9 9 9 5},
+ mkRow!{4 3 4 5 9 9 8 7 8 9 7 6 4 5 6 9 8 9 7 9 9 9 6 9 9 7 6 7 8 9 9 9 8 9 9 6 7 9 8 7 9 8 8 9 4 9 8 7 6 4 3 4 9 8 9 9 8 6 9 6 9 7 6 7 8 9 5 6 7 8 9 9 8 7 6 3 1 2 3 6 7 8 9 6 7 9 8 7 6 5 8 9 5 4 3 5 6 7 8 9},
+ mkRow!{5 6 5 6 7 9 9 8 9 3 2 1 2 6 9 8 9 7 5 7 7 8 9 8 7 6 5 6 7 8 7 8 9 6 4 5 9 8 9 8 9 9 9 2 3 5 9 8 6 5 4 5 7 9 5 4 9 9 8 9 9 6 5 6 9 8 7 7 8 9 3 4 9 8 7 4 5 6 4 9 8 9 9 8 9 9 9 6 5 4 7 8 9 3 2 3 5 8 8 9},
+ mkRow!{6 7 6 7 8 9 9 9 6 5 4 3 5 9 8 7 6 5 4 5 6 9 8 7 6 5 4 4 6 5 6 7 8 9 5 9 8 7 6 9 2 1 0 1 2 4 5 9 8 6 7 8 8 9 4 2 9 8 7 9 8 7 4 6 8 9 9 8 9 3 2 9 8 7 6 5 6 7 8 9 9 1 0 9 5 9 8 7 6 5 6 7 9 2 0 2 3 9 7 9},
+ mkRow!{9 8 9 8 9 9 9 8 7 6 7 8 6 9 8 6 5 4 3 2 1 0 9 8 7 6 3 2 3 4 7 8 9 9 9 8 7 6 5 4 3 2 1 2 3 5 6 9 8 7 8 9 9 6 5 9 8 7 6 5 3 2 3 4 9 0 1 9 1 0 1 2 9 8 8 6 7 9 9 5 4 3 2 3 4 5 9 9 7 6 7 8 9 3 4 3 4 5 6 8}
+ }
+ }
+}
diff --git a/src/tests/aoc-2021-09/src/types.pr.rs b/src/tests/aoc-2021-09/src/types.pr.rs
new file mode 100644
index 0000000..067e89e
--- /dev/null
+++ b/src/tests/aoc-2021-09/src/types.pr.rs
@@ -0,0 +1,12 @@
+/*SPEC*
+property fifo<T> {
+ \c <: (Stack) -> (forall \x -> (forall \j -> ((equal? (pop ((push ((push c) x)) j))) x)))
+}
+
+property unique<T> {
+ \c <: (Container) -> ((for-all-elems c) \a -> ((unique-count? a) c))
+}
+
+type Map<K,V> = {c impl (Mapping) | true}
+type Set<T> = {c impl (Container) | (unique c)}
+ *ENDSPEC*/