From 8283941473e27f5f47d90ba6dde3863528b7c544 Mon Sep 17 00:00:00 2001 From: Aria Shrimpton Date: Wed, 7 Feb 2024 20:54:43 +0000 Subject: aoc 2021 day 9 test --- src/tests/Cargo.lock | 9 ++ src/tests/Cargo.toml | 2 +- src/tests/aoc-2021-09/Cargo.toml | 17 +++ src/tests/aoc-2021-09/benches/main.rs | 31 ++++ src/tests/aoc-2021-09/src/lib.rs | 270 ++++++++++++++++++++++++++++++++++ src/tests/aoc-2021-09/src/types.pr.rs | 12 ++ 6 files changed, 340 insertions(+), 1 deletion(-) create mode 100644 src/tests/aoc-2021-09/Cargo.toml create mode 100644 src/tests/aoc-2021-09/benches/main.rs create mode 100644 src/tests/aoc-2021-09/src/lib.rs create mode 100644 src/tests/aoc-2021-09/src/types.pr.rs 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 @@ -11,6 +11,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aoc-2021-09" +version = "0.1.0" +dependencies = [ + "criterion", + "primrose-library", + "rand", +] + [[package]] name = "atty" version = "0.2.14" 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 = VecDeque; // 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::() + } + + 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::>(); + + 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 { + \c <: (Stack) -> (forall \x -> (forall \j -> ((equal? (pop ((push ((push c) x)) j))) x))) +} + +property unique { + \c <: (Container) -> ((for-all-elems c) \a -> ((unique-count? a) c)) +} + +type Map = {c impl (Mapping) | true} +type Set = {c impl (Container) | (unique c)} + *ENDSPEC*/ -- cgit v1.2.3