WIP rust impl for multidrone solution

This commit is contained in:
Shautvast 2024-11-10 12:15:07 +01:00
parent e34cb09125
commit 796c844c68
28 changed files with 1406 additions and 0 deletions

View file

@ -9,6 +9,7 @@ import java.util.*;
* outstanding questions: * outstanding questions:
* * is a cell of (initial) value 0 equally valuable as a cell just occupied? * * is a cell of (initial) value 0 equally valuable as a cell just occupied?
* -> probably, what is the chance that you find a 'treasure' behind it, that you would have not found via an alternative path? * -> probably, what is the chance that you find a 'treasure' behind it, that you would have not found via an alternative path?
* * what about a path that has to end at start position?
*/ */
public class OptimalPathFinder { public class OptimalPathFinder {
@ -53,6 +54,7 @@ public class OptimalPathFinder {
// next path to evaluate // next path to evaluate
path = paths.peek(); path = paths.peek();
assert path != null; // priorityqueue does not allow nulls
} }
Point currentPos = path.getHead(); Point currentPos = path.getHead();

7
solution2/Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "solution2"
version = "0.1.0"

6
solution2/Cargo.toml Normal file
View file

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

158
solution2/src/grid.rs Normal file
View file

@ -0,0 +1,158 @@
use std::{
cmp::Ordering,
collections::{BTreeSet, HashMap},
hash::{Hash, Hasher},
};
#[derive(Debug)]
pub struct Grid {
data: Vec<Vec<u16>>,
// keep track of every point that has been hit at some time
hits: HashMap<(u16, u16), BTreeSet<usize>>, // TreeSet<usize> is integer times that point has been visited.
// Must always be sorted and could probably be a single int
// (keep track of last time hit)
}
impl Grid {
pub fn new(N: usize) -> Self {
let grid20 = include_str!("grids/20.txt");
let grid100 = include_str!("grids/100.txt");
let grid1000 = include_str!("grids/1000.txt");
let datafile = match N {
20 => grid20,
100 => grid100,
1000 => grid1000,
_ => panic!("only 20, 100 or 1000 are available"),
};
let mut data = vec![];
for row in datafile.split("\n") {
let mut datarow = vec![];
for col in row.split(" ") {
datarow.push(u16::from_str_radix(col, 10).unwrap());
}
data.push(datarow);
}
Grid {
data,
hits: HashMap::new(),
}
}
pub fn get_value(&self, x: u16, y: u16, time: usize) -> f32 {
let hit = self.hits.get(&(x, y));
let initial_value = *(self.data.get(y as usize).unwrap().get(x as usize).unwrap()) as f32;
if let Some(hit_times) = hit {
for t in hit_times.iter().rev() {
if time > *t {
let elapsed_since_hit = (time - *t) as f32;
return f32::min(
elapsed_since_hit * initial_value as f32 * 0.1,
initial_value,
);
}
}
0.0
} else {
initial_value
}
}
pub fn size(&self) -> u16 {
self.data.len() as u16
}
}
#[derive(Debug, Clone)]
pub struct Path {
points: Vec<Point>,
pub value: f32,
}
impl Path {
pub fn new(grid: &Grid, initial_x: u16, initial_y: u16) -> Self {
let mut points = vec![];
let value = grid.get_value(initial_x, initial_y, 0);
let p = Point {
x: initial_x,
y: initial_y,
value,
};
points.push(p);
Self { points, value }
}
pub fn length(&self) -> usize {
self.points.len()
}
pub fn head(&self) -> &Point {
self.points.get(self.points.len() - 1).unwrap() // assert Some
}
pub fn value(&self) -> f32 {
self.points.iter().map(|p| p.value).sum()
}
}
impl PartialOrd for Path {
fn partial_cmp(&self, other: &Path) -> Option<Ordering> {
match self.value > other.value {
true => Some(Ordering::Greater),
false => {
if self.value == other.value {
Some(Ordering::Equal)
} else {
Some(Ordering::Less)
}
}
}
}
}
impl Eq for Path {}
impl Ord for Path {
fn cmp(&self, other: &Self) -> Ordering {
self.partial_cmp(other).unwrap()
}
}
impl PartialEq for Path {
fn eq(&self, other: &Path) -> bool {
self.value == other.value
}
}
#[derive(Debug, Clone)]
pub struct Point {
pub x: u16,
pub y: u16,
pub value: f32,
}
impl Point {
pub fn new(x: u16, y: u16, value: f32) -> Self {
Self { x, y, value: 0.0 }
}
}
impl PartialEq for Point {
fn eq(&self, other: &Point) -> bool {
self.x == other.x && self.y == other.y
}
}
impl Eq for Point {}
impl Hash for Point {
fn hash<H: Hasher>(&self, state: &mut H) {
self.x.hash(state);
self.y.hash(state);
}
}

100
solution2/src/grids/100.txt Normal file
View file

@ -0,0 +1,100 @@
7 4 7 9 8 9 0 2 10 9 6 10 5 5 1 9 0 4 3 0 5 10 6 3 10 3 0 4 4 6 8 0 3 6 1 0 2 7 7 3 1 0 9 10 2 9 5 0 2 0 1 4 10 8 8 0 4 4 3 9 6 6 2 9 9 5 2 2 10 4 2 6 10 0 10 6 3 4 7 8 9 7 5 5 10 9 8 5 2 10 2 4 9 1 0 1 7 7 3 9
3 6 7 9 5 3 7 9 9 2 1 8 9 5 1 9 5 3 4 10 4 1 3 1 2 10 8 6 7 10 1 10 0 0 4 10 4 6 4 0 4 10 9 6 7 8 5 1 1 6 6 8 8 7 6 5 7 8 6 4 6 5 9 8 4 5 5 9 10 4 3 5 10 1 7 0 8 1 1 3 8 6 4 2 8 9 10 3 6 2 10 3 6 6 5 8 7 10 2 1
2 1 8 10 2 4 3 8 10 0 7 9 4 5 5 3 9 2 7 2 10 1 0 0 4 2 2 10 6 2 0 5 10 6 9 6 0 4 3 0 4 6 7 1 7 5 9 6 10 6 3 6 2 3 8 5 10 5 10 0 10 6 2 7 3 1 8 1 4 1 7 3 3 6 10 9 1 0 2 10 6 2 1 2 7 8 8 4 9 6 5 2 2 9 3 10 3 3 2 4
3 4 4 0 6 2 0 5 9 0 4 0 9 8 8 0 10 9 8 2 0 10 3 3 6 0 10 3 0 3 6 2 2 8 4 9 4 6 2 7 0 7 3 7 10 7 6 4 5 9 5 10 7 9 8 6 1 0 4 9 8 2 3 1 7 5 7 8 6 5 9 8 5 10 7 2 8 7 5 0 7 4 8 3 0 6 2 7 0 1 10 4 7 9 3 10 8 10 1 0
7 2 3 0 5 5 9 5 3 10 5 3 2 1 5 2 0 2 7 6 0 5 0 5 8 2 7 1 2 4 2 3 4 7 7 8 3 1 10 3 2 8 2 6 0 10 9 10 7 0 7 3 0 5 0 6 1 4 4 7 1 0 0 4 5 1 1 2 2 5 9 5 6 6 6 7 0 3 10 4 4 0 6 0 6 10 5 0 8 8 3 2 3 6 9 3 4 8 9 5
2 9 6 3 7 2 5 7 3 7 8 10 10 6 1 9 3 6 1 7 2 2 7 6 9 10 5 7 10 0 3 4 2 3 5 4 10 0 6 2 3 5 2 2 0 9 2 6 5 10 3 0 9 3 3 2 2 2 2 3 7 0 9 6 4 4 7 3 0 10 0 2 2 4 4 1 1 1 3 1 4 5 1 9 5 2 7 3 7 7 2 4 6 8 6 2 6 8 5 1
2 3 1 0 0 5 6 8 3 2 8 9 3 7 3 0 7 2 2 0 7 2 1 5 9 4 4 6 6 2 9 6 7 1 9 2 9 3 0 2 8 1 2 8 5 6 10 8 6 4 5 7 10 4 10 8 4 7 10 7 3 1 9 2 6 7 9 5 7 1 10 10 3 2 6 10 5 0 3 5 7 9 2 7 0 0 3 10 8 8 5 7 2 9 2 1 0 5 0 4
4 5 2 5 0 2 4 1 8 0 2 0 7 1 1 7 1 9 0 2 1 3 4 2 0 10 7 6 3 7 6 5 0 10 2 4 1 7 1 10 1 8 2 10 8 6 2 7 5 1 8 9 6 7 10 8 8 1 8 4 3 8 8 5 5 1 5 3 7 6 0 1 8 6 8 4 0 9 6 4 0 10 10 0 10 10 7 6 5 2 3 6 2 4 2 6 8 4 9 3
8 5 4 0 10 6 8 3 0 4 8 4 9 1 2 8 0 5 7 9 5 8 1 1 0 7 9 1 8 3 9 9 10 4 6 1 3 0 3 6 4 4 9 8 4 9 3 5 9 3 0 9 8 10 2 2 6 6 3 7 9 1 5 3 4 8 2 5 10 6 9 9 9 2 6 6 1 3 1 3 10 10 8 9 3 3 1 0 6 1 3 9 4 4 10 4 4 7 2 0
6 4 2 4 9 3 8 8 7 4 3 0 10 2 6 0 9 10 5 5 7 0 6 8 7 7 8 0 2 3 5 6 7 6 9 3 9 8 2 7 8 2 3 9 0 2 4 0 8 6 2 7 7 3 7 0 6 2 4 10 3 5 5 6 7 2 1 6 6 0 2 1 9 7 1 9 2 9 10 0 3 5 1 5 6 2 8 10 1 8 10 10 7 0 6 0 0 8 4 3
9 5 8 2 0 3 8 6 4 8 6 1 0 1 0 3 4 0 1 5 10 5 9 5 4 3 1 8 7 4 2 6 0 1 3 10 1 7 0 10 2 3 3 8 4 8 2 7 3 8 0 8 7 2 5 10 1 8 3 10 4 7 4 2 0 10 4 3 3 1 5 9 10 7 1 10 10 3 2 6 4 4 10 2 10 3 3 2 8 6 6 8 1 6 0 7 2 2 0 1
1 7 2 1 10 10 4 2 2 10 1 6 7 3 8 9 3 4 1 3 4 10 10 0 10 7 9 5 3 0 2 4 9 3 8 3 6 4 8 10 8 8 9 0 0 1 9 0 4 7 5 1 7 7 10 5 1 9 1 1 5 10 5 6 7 0 7 10 3 3 4 9 5 0 2 7 9 6 8 10 1 6 5 3 1 7 0 0 9 5 10 10 7 7 8 7 7 9 5 5
4 4 6 10 3 9 7 3 2 5 2 8 8 9 7 1 7 3 5 2 9 2 1 2 9 8 8 4 10 2 1 10 5 5 0 2 2 7 7 10 2 2 5 1 1 8 6 6 2 7 3 3 7 8 0 6 3 3 6 10 1 8 2 8 6 2 4 0 8 2 7 6 8 5 1 4 9 10 3 5 5 5 9 7 1 1 9 10 8 4 6 0 9 2 10 2 3 7 2 2
2 1 2 7 1 0 1 9 3 5 9 10 3 8 2 7 3 0 5 8 2 9 8 10 6 8 8 2 6 8 7 2 4 4 3 2 9 6 3 8 4 2 0 5 0 9 9 3 1 1 7 7 9 5 9 3 10 8 1 6 4 1 10 3 4 3 6 5 5 9 1 8 2 4 5 0 0 6 6 2 6 2 5 2 4 5 5 10 5 6 0 5 7 7 3 4 3 5 10 7
9 8 3 8 3 8 0 8 0 10 2 1 1 1 10 5 1 8 8 0 5 6 3 0 2 7 4 10 3 6 8 7 9 3 1 6 3 8 0 8 10 10 2 4 10 5 5 6 4 2 2 5 7 9 10 5 2 5 5 1 3 7 4 7 2 4 10 2 2 8 9 8 1 4 0 3 9 0 3 0 3 4 3 9 7 10 1 3 9 10 8 0 9 5 4 5 8 5 10 4
0 5 4 4 9 10 8 6 5 0 10 9 7 8 5 3 4 1 6 6 9 6 3 7 2 8 3 6 10 3 4 3 4 2 0 0 5 0 7 8 0 10 2 4 9 6 8 5 0 8 3 2 6 6 0 0 10 2 3 1 10 3 4 4 3 5 1 8 5 0 6 8 1 1 2 3 0 8 2 6 1 7 2 1 5 7 9 3 6 6 8 8 7 5 0 1 2 4 1 0
2 7 2 3 6 7 4 4 10 4 10 8 10 4 10 10 8 8 5 1 10 8 3 7 1 5 8 10 6 0 7 2 10 10 2 5 2 1 4 9 6 9 3 9 9 8 0 5 4 9 8 8 7 0 1 2 8 2 6 10 3 6 0 8 3 7 2 0 3 10 7 2 1 8 8 10 7 7 3 10 0 7 9 6 0 1 9 0 8 1 8 8 6 10 10 7 4 0 1 10
0 9 2 10 5 9 9 9 8 2 2 10 0 10 8 0 3 5 2 7 2 6 2 4 8 5 10 1 1 5 7 7 0 8 1 8 4 0 6 5 8 8 4 8 10 9 3 0 7 10 10 0 8 8 7 10 9 3 2 1 10 2 0 4 7 6 3 6 4 8 10 9 5 3 7 4 5 4 7 9 0 8 7 8 9 1 3 10 9 6 10 10 0 0 2 1 5 3 8 1
2 6 1 5 6 3 1 10 4 4 1 6 9 8 4 6 10 3 2 7 7 9 2 9 4 7 9 9 7 8 8 3 0 1 7 9 8 8 6 4 7 5 5 0 0 1 2 2 6 6 1 2 5 1 8 0 3 4 4 2 5 3 8 2 0 6 6 0 4 5 8 9 4 10 6 4 4 9 3 9 9 3 2 5 5 0 5 1 8 4 5 1 9 1 5 0 10 0 9 4
1 9 4 5 10 4 0 6 5 1 0 1 8 4 9 0 9 0 7 10 9 0 6 4 6 10 6 0 6 10 6 3 9 1 10 10 1 8 1 8 0 4 6 10 5 7 4 2 9 3 7 1 4 1 5 0 2 6 0 4 4 3 6 5 9 4 3 6 9 3 8 9 7 4 5 5 8 1 4 6 3 10 2 0 0 5 1 3 9 8 5 6 2 6 10 7 5 10 5 2
7 8 9 2 8 6 3 3 5 1 3 0 10 4 4 6 3 7 8 7 4 4 2 0 4 3 10 2 5 5 7 1 2 4 5 7 8 10 10 9 1 8 7 9 10 10 2 0 2 8 0 4 8 7 10 10 0 6 6 10 5 2 3 6 1 9 1 1 6 8 5 1 9 8 7 0 7 6 2 5 8 2 4 8 5 8 0 9 7 4 3 7 9 9 4 9 5 9 6 10
9 5 1 2 2 0 8 2 7 0 2 5 1 5 5 3 0 4 2 10 0 2 0 5 10 9 3 5 7 8 10 0 8 6 4 5 10 1 0 10 10 8 2 0 9 6 1 4 0 9 7 7 0 0 3 0 5 8 9 0 10 2 6 8 10 4 6 5 1 10 3 9 9 7 9 0 5 8 10 6 10 5 9 7 6 3 4 1 9 2 5 7 3 0 10 5 2 10 8 10
10 1 0 3 3 7 2 6 9 7 7 5 3 2 8 10 4 9 6 8 5 6 1 7 6 5 4 4 0 6 10 6 1 1 7 8 7 0 8 4 10 9 5 7 9 5 8 4 9 1 4 6 3 6 1 9 5 3 3 1 0 1 8 2 7 6 8 3 4 4 3 10 0 8 1 2 5 2 1 10 2 1 9 10 3 5 2 4 6 5 6 7 7 2 6 5 1 1 3 7
1 5 9 0 3 5 0 1 3 10 1 9 1 5 9 8 8 8 5 0 0 3 2 3 9 8 2 5 9 2 0 0 2 2 0 0 4 0 8 6 6 0 4 10 6 1 1 8 0 7 7 0 7 6 6 6 2 8 0 7 1 10 0 3 9 2 9 2 10 9 1 4 10 8 4 6 8 6 7 2 10 10 0 6 5 1 4 9 4 2 10 2 8 10 3 9 5 7 1 3
7 10 8 5 3 10 2 5 10 4 9 8 0 1 3 7 8 7 5 9 0 10 10 2 2 4 2 1 10 8 0 10 2 7 7 6 2 5 10 4 7 5 1 8 7 0 5 9 9 5 2 2 3 0 0 3 10 4 10 10 3 7 9 0 8 4 3 2 10 6 1 10 0 6 0 9 2 6 8 9 7 5 6 10 9 9 7 7 7 9 2 0 7 7 10 5 5 8 6 0
4 2 5 5 9 0 6 10 9 8 8 7 4 9 10 10 2 0 1 2 5 8 8 7 7 3 7 3 10 9 8 8 2 6 0 10 7 8 4 5 5 9 7 4 3 1 2 0 8 4 7 6 6 10 5 6 0 8 10 6 1 8 7 8 6 9 3 3 7 9 0 3 7 7 2 6 9 4 7 2 10 0 2 9 3 0 4 2 9 4 10 10 9 9 9 9 0 2 2 7
8 2 9 5 2 4 8 1 10 9 6 1 0 9 3 8 9 2 3 0 8 5 8 8 0 3 3 3 0 7 5 1 10 1 8 1 5 7 7 3 3 7 0 4 9 2 8 9 4 3 10 3 0 2 0 4 6 0 8 4 6 1 1 9 6 6 0 2 4 1 0 2 3 7 8 0 8 2 8 7 6 0 4 6 9 7 10 1 6 2 4 2 8 0 3 8 4 3 2 9
3 8 1 3 1 2 4 4 4 3 9 2 5 5 8 3 4 3 0 7 10 1 7 8 4 10 2 5 4 0 6 4 10 0 4 6 0 1 6 1 10 8 8 5 3 10 10 5 7 1 1 6 4 6 3 0 5 8 5 2 4 7 9 2 2 4 0 6 6 1 2 0 7 7 8 7 8 3 3 10 5 10 1 3 7 6 9 3 8 7 2 2 9 9 8 8 5 0 6 8
1 10 6 5 1 10 4 3 6 3 7 9 7 1 0 7 7 10 5 3 2 0 8 1 3 3 5 0 6 2 2 8 9 2 9 6 2 8 5 0 8 8 1 3 8 4 8 2 10 8 2 7 3 9 8 5 10 6 8 3 9 6 4 2 7 2 3 5 3 1 8 5 1 9 0 7 3 8 2 0 4 9 7 7 4 0 10 0 2 7 0 9 10 6 7 1 5 2 3 8
1 4 7 2 5 8 1 5 9 4 4 3 7 7 9 3 4 7 4 10 0 1 6 6 5 6 3 10 0 0 4 4 1 9 10 9 1 8 5 10 1 8 10 8 3 8 2 10 7 6 9 2 5 5 0 9 9 7 10 6 9 1 10 6 7 6 2 3 1 4 1 3 10 6 10 4 8 9 8 10 0 10 5 4 8 4 4 1 0 6 6 2 10 8 8 4 3 0 4 3
2 1 9 8 7 1 1 5 1 3 9 2 10 1 0 3 10 6 9 4 4 9 7 8 5 9 8 4 10 6 2 10 8 6 5 0 10 7 3 1 3 7 0 6 1 6 2 10 10 10 10 3 8 0 8 7 3 10 2 4 6 9 1 10 7 7 6 6 9 8 7 10 10 9 1 1 9 0 4 0 7 5 4 4 2 7 1 3 0 9 4 4 4 5 2 2 1 9 0 10
4 7 5 1 7 1 0 2 0 6 7 9 1 8 0 4 3 5 6 9 8 9 2 5 9 10 8 5 0 3 6 2 2 7 8 3 2 5 2 1 3 10 10 2 5 1 3 4 10 5 5 6 1 2 10 2 3 4 9 5 1 4 3 7 5 4 10 1 1 10 7 4 8 4 4 8 1 4 3 10 6 5 4 2 0 3 3 3 2 3 0 10 5 7 6 1 5 10 5 8
0 10 0 0 7 4 6 9 2 6 1 8 9 9 7 3 9 9 0 7 5 8 3 5 7 8 9 3 10 2 6 8 1 9 0 2 1 5 10 1 8 2 1 2 0 4 8 6 9 7 6 2 8 6 3 7 5 7 8 1 4 3 5 3 2 2 10 6 2 6 9 6 6 2 8 4 9 10 6 4 6 8 7 2 2 9 0 4 6 2 1 4 0 8 7 7 8 0 4 6
2 6 5 3 8 6 9 5 1 9 8 4 5 0 10 3 8 2 6 1 8 1 8 2 4 3 4 7 1 4 9 3 1 5 7 6 2 4 1 4 3 2 4 8 8 0 3 5 0 5 1 4 3 5 6 10 6 7 6 10 10 1 4 0 1 2 0 8 0 3 5 10 8 4 1 9 1 2 3 6 0 1 0 3 5 2 6 1 5 1 7 1 2 8 6 5 3 6 2 7
6 6 5 7 1 2 3 7 5 7 5 2 1 3 9 5 7 6 2 2 5 9 2 1 2 10 0 9 4 4 0 10 9 4 1 5 2 10 1 7 8 8 3 1 8 8 9 6 10 5 2 9 3 10 5 3 4 0 3 10 4 6 4 10 3 6 1 7 5 5 10 0 8 1 3 4 2 2 9 2 1 7 0 3 8 6 0 1 1 0 4 5 9 1 7 5 4 1 8 3
9 8 9 4 8 3 3 4 10 2 3 6 6 8 7 10 7 6 6 7 10 8 8 9 6 6 8 1 0 4 5 1 8 8 0 6 3 3 2 8 5 2 8 4 7 10 3 10 10 5 3 7 1 7 9 8 9 8 0 3 1 2 8 9 8 5 2 7 8 6 3 0 7 1 7 6 5 10 1 6 0 5 9 3 10 0 1 1 3 9 7 3 6 10 0 3 8 2 0 5
4 9 10 2 0 2 3 8 1 3 2 1 1 2 7 7 9 10 5 6 7 1 5 1 0 2 9 5 1 10 7 7 6 10 8 0 8 1 2 5 7 7 6 6 6 10 1 1 6 1 7 2 5 9 2 8 7 9 1 2 2 5 4 9 6 10 5 10 0 4 3 9 0 3 4 6 7 3 0 8 4 9 9 9 9 9 10 1 6 1 5 6 5 1 1 4 9 7 3 1
3 5 4 1 1 10 2 2 6 10 6 4 6 5 4 10 0 9 2 7 8 4 7 0 5 1 3 3 8 1 2 7 4 2 8 7 1 8 7 8 1 6 0 1 5 6 7 4 10 9 3 7 8 9 8 0 3 7 2 1 5 2 0 9 10 2 5 0 5 9 5 2 4 8 9 9 9 2 8 0 7 5 10 0 8 0 1 6 3 1 6 2 3 4 1 8 0 2 6 9
10 8 7 5 4 3 8 2 10 7 1 4 9 3 2 4 5 10 0 5 4 8 1 5 4 6 10 7 7 4 4 7 2 7 7 10 8 9 5 6 7 6 1 9 0 3 8 4 8 7 2 7 1 1 10 4 9 10 5 4 7 1 3 10 1 10 1 0 3 9 6 5 5 10 6 7 10 4 0 6 1 2 6 9 2 4 9 7 8 2 7 10 4 7 10 10 0 5 2 7
8 9 6 4 1 3 7 1 0 6 5 2 0 9 3 0 1 5 9 10 0 10 2 3 4 4 3 9 3 5 6 7 8 1 10 5 6 9 2 9 9 5 3 5 9 7 7 4 4 4 10 0 1 0 9 1 3 8 6 1 3 1 10 5 8 9 7 1 1 5 8 7 5 10 2 4 10 8 1 4 6 9 10 3 1 9 3 8 6 8 1 2 4 2 3 0 7 6 9 2
3 7 0 1 4 8 2 7 7 7 4 10 5 8 7 10 4 0 3 4 7 10 8 0 9 4 9 5 2 8 4 6 4 6 7 10 5 2 8 6 3 3 7 5 6 0 10 7 0 7 9 10 9 3 8 2 10 7 4 1 6 9 3 8 6 1 8 10 4 4 0 9 3 10 7 1 8 9 7 1 6 6 3 2 10 1 1 3 0 2 7 3 5 1 5 9 7 3 0 1
0 8 0 7 4 7 1 1 1 7 4 2 6 9 2 5 3 5 5 10 1 2 10 8 0 6 2 8 0 3 10 2 5 7 8 8 5 4 0 4 3 5 9 9 2 0 2 3 5 0 8 0 5 0 0 8 1 6 10 6 3 2 6 8 8 6 5 7 4 7 7 2 2 8 2 3 8 3 5 2 8 1 0 3 5 6 4 10 2 4 7 9 8 3 1 6 5 2 5 2
7 6 4 6 4 10 0 5 2 2 6 10 10 9 7 2 7 1 9 4 0 6 9 5 9 0 8 9 8 10 10 5 3 0 6 6 9 6 9 5 7 0 5 7 2 2 1 4 1 5 8 6 5 0 5 1 2 8 3 3 2 7 6 9 6 9 3 10 4 1 2 2 8 6 4 2 3 5 3 1 2 9 7 0 1 9 9 0 0 10 0 2 5 0 2 9 5 8 7 5
8 10 9 0 2 1 7 3 9 2 7 3 4 1 6 2 9 1 9 4 3 7 6 8 5 6 0 10 0 10 5 9 2 5 8 0 10 2 0 6 7 5 2 1 1 1 10 8 6 9 8 0 9 4 4 3 5 4 0 1 6 0 0 8 8 0 1 8 6 6 4 5 7 8 1 3 3 3 4 9 6 2 10 10 3 9 8 4 10 0 10 6 10 10 8 9 3 7 10 5
7 2 5 6 1 3 8 1 8 0 10 3 7 4 4 0 4 9 7 10 0 8 5 6 10 6 10 4 8 0 0 10 3 10 0 8 7 8 4 2 7 6 0 0 5 0 7 8 2 4 3 6 7 10 3 9 8 0 10 2 5 1 3 8 1 2 1 8 2 1 4 7 3 5 0 10 0 8 8 9 8 8 9 4 9 2 4 10 10 8 2 9 7 8 9 5 0 5 5 3
5 10 1 8 5 1 9 4 1 3 6 4 1 4 7 10 9 9 4 2 4 6 9 2 0 1 6 5 4 5 8 3 1 2 5 6 2 9 4 2 9 1 4 1 0 7 5 2 10 2 10 2 9 10 8 8 10 10 1 7 0 5 5 8 9 6 1 3 7 9 4 9 7 8 6 5 5 5 5 2 3 7 1 5 10 10 0 3 3 0 1 7 7 9 6 8 10 4 3 3
10 3 2 6 10 1 2 7 8 6 1 0 1 10 2 4 4 2 7 2 3 1 5 10 2 7 6 2 3 3 4 9 5 1 1 8 2 9 8 10 3 10 8 10 2 5 2 7 0 9 8 9 3 0 7 0 6 8 6 10 5 2 9 7 8 9 1 3 10 9 4 7 1 8 0 4 10 4 7 1 8 4 10 3 1 2 7 2 7 0 5 9 4 9 8 7 4 3 1 8
4 7 7 4 9 3 0 4 3 9 6 8 8 1 6 5 6 0 1 6 4 4 7 3 8 8 6 4 2 7 6 5 9 1 7 9 7 1 4 6 2 2 4 3 2 8 2 4 9 10 9 4 7 2 3 6 3 0 9 5 6 9 8 7 8 10 5 3 1 8 6 1 7 4 6 5 10 5 6 4 0 2 5 1 2 5 9 10 2 4 7 10 2 6 1 5 1 3 9 0
8 3 0 1 5 3 8 2 0 0 1 7 5 2 4 3 10 6 10 7 3 0 1 4 2 0 5 9 6 7 2 9 8 9 8 8 8 7 1 2 1 0 6 3 7 9 5 7 10 4 7 3 8 1 7 0 7 10 9 9 5 3 2 2 9 8 8 3 6 4 2 7 7 3 10 6 8 8 9 6 1 3 9 3 6 1 5 1 0 10 3 3 0 8 8 4 7 7 0 7
7 9 10 10 6 6 4 0 8 4 3 10 4 9 2 4 2 6 3 6 1 1 2 10 6 4 10 1 0 0 6 8 3 5 1 1 9 1 2 7 8 0 6 1 10 8 10 8 1 1 9 10 1 0 2 6 5 0 7 10 7 10 8 7 10 7 1 6 6 10 8 7 0 10 2 10 1 3 1 10 0 6 8 7 9 10 3 9 8 9 0 6 2 1 0 10 7 7 1 4
9 2 1 5 1 2 0 6 2 10 5 6 9 0 1 1 3 2 2 2 4 5 4 7 3 3 10 2 10 8 0 3 5 1 1 6 0 8 2 1 0 6 6 5 5 3 8 9 1 0 5 6 5 7 4 1 4 2 1 7 5 7 8 10 7 3 0 9 8 1 7 3 7 2 9 3 6 7 1 8 10 0 10 9 0 6 7 4 8 6 4 2 4 7 3 9 0 4 0 2
7 6 0 7 9 3 4 7 7 4 1 4 4 9 3 2 2 6 10 8 1 3 8 5 2 9 3 9 10 0 10 10 4 9 3 6 7 7 0 2 2 3 3 6 3 7 0 8 9 6 5 4 10 10 9 6 7 2 10 6 9 1 0 9 4 3 0 10 3 4 2 9 4 8 2 8 6 2 10 10 5 8 3 10 8 10 4 5 0 6 5 5 5 9 6 4 3 6 10 10
6 6 9 9 1 8 8 2 10 3 1 8 3 10 1 5 0 3 4 6 1 7 7 7 10 7 2 0 8 9 1 7 8 1 7 4 9 1 7 1 5 8 9 9 8 6 7 0 10 8 4 2 8 0 5 1 7 2 1 5 2 1 1 10 10 1 4 10 5 8 7 10 8 5 2 1 1 3 8 1 3 5 10 0 7 10 6 7 3 7 0 9 5 10 0 0 2 3 7 7
4 7 10 7 1 8 5 3 8 0 1 6 4 3 4 5 0 6 0 5 0 3 8 6 2 3 3 5 3 10 9 1 2 1 2 6 7 6 2 0 9 9 1 2 10 7 4 0 10 10 6 4 0 5 6 9 7 0 3 4 5 3 10 9 7 3 8 1 8 7 6 5 9 5 6 10 9 3 2 0 10 1 1 10 9 1 9 10 4 0 8 4 10 1 7 8 1 7 9 10
8 4 1 1 4 4 9 1 4 6 0 1 10 3 4 10 1 5 1 3 2 10 0 9 5 2 7 6 3 0 3 9 10 5 1 4 0 3 6 7 6 8 10 7 2 4 10 7 9 2 10 8 1 9 3 10 9 4 1 8 9 8 0 3 8 5 9 9 8 8 8 10 8 8 7 7 6 5 10 10 6 9 2 10 7 5 5 1 9 7 10 2 1 4 4 0 1 4 1 4
3 3 0 9 2 2 7 8 6 0 3 5 6 3 10 8 8 8 9 0 6 5 3 10 1 2 8 7 10 10 1 1 0 9 10 9 5 5 7 7 10 1 0 10 7 6 6 9 3 6 3 5 5 6 2 7 10 6 10 0 1 4 8 9 2 0 1 3 10 2 3 4 3 4 5 8 10 6 1 10 1 5 1 9 4 5 1 2 4 6 9 4 0 4 9 7 1 2 6 5
8 3 2 4 5 3 2 2 3 1 6 4 10 9 3 3 10 6 3 4 10 2 6 5 6 6 7 8 6 10 2 8 2 10 9 7 9 7 0 7 6 3 3 10 9 10 7 0 2 6 10 5 9 2 7 0 5 4 8 1 1 6 2 4 7 6 1 10 2 3 2 10 10 8 5 0 9 2 1 7 2 3 6 3 6 9 0 4 2 4 9 9 3 4 8 8 8 7 7 9
10 8 0 0 9 8 10 9 0 4 2 6 3 0 8 1 0 7 4 9 8 4 9 8 2 6 7 1 10 2 5 8 3 10 0 2 7 7 5 8 1 9 4 4 0 6 6 3 0 5 9 2 4 10 1 0 0 6 5 0 1 3 10 5 4 1 4 6 1 7 1 1 9 1 3 9 5 1 1 6 4 9 7 9 9 5 7 0 9 4 7 6 9 2 9 9 9 7 5 7
9 2 8 7 8 6 9 3 8 9 9 8 2 1 1 7 6 1 10 9 0 3 7 10 7 1 1 9 1 10 1 0 3 9 0 2 9 10 9 9 9 1 8 10 8 1 2 2 10 5 3 7 3 7 4 8 9 10 6 6 2 10 1 2 7 6 5 10 3 8 6 10 10 8 0 5 9 9 1 10 8 3 3 3 2 6 3 3 7 1 3 6 8 6 3 10 1 9 9 4
3 3 1 3 8 6 8 10 6 5 1 6 7 8 10 1 8 4 4 10 1 10 7 6 6 7 7 4 10 7 4 9 7 9 3 2 4 1 7 6 0 1 4 10 1 6 2 5 5 8 5 4 8 9 5 0 6 1 10 0 2 10 1 2 8 9 1 10 7 2 0 3 10 9 10 7 1 8 3 7 4 9 1 1 9 3 2 6 9 1 3 0 9 5 9 0 8 4 9 0
4 0 2 9 6 3 10 8 6 4 9 7 6 3 9 8 5 3 2 9 8 10 0 10 7 1 6 4 7 3 3 4 7 9 6 1 5 2 9 5 7 4 8 1 0 0 0 6 4 6 10 0 2 5 4 1 9 8 2 6 7 0 10 0 1 9 10 6 10 7 1 0 1 9 9 3 7 6 5 0 5 5 5 9 7 5 0 8 4 9 0 3 8 1 4 5 7 9 9 10
3 4 3 10 0 3 4 2 4 4 0 1 6 2 3 1 5 10 8 1 1 0 10 4 9 9 9 3 2 9 3 8 4 10 9 4 4 6 8 6 1 1 4 0 2 7 4 8 0 1 8 5 0 5 1 9 1 7 1 6 4 0 0 8 5 4 8 9 0 9 9 0 3 2 1 8 8 6 2 10 2 10 5 10 1 10 4 6 4 4 10 1 8 0 4 7 3 8 10 3
5 1 0 10 5 2 8 8 10 10 3 1 7 0 3 9 7 9 3 0 0 10 3 6 0 9 7 3 2 2 4 3 7 9 2 9 7 5 1 1 10 7 7 0 7 8 6 1 1 9 2 5 10 5 4 6 0 0 5 7 5 10 0 5 2 6 4 10 10 2 0 4 7 4 0 0 6 4 6 4 7 4 6 6 5 9 0 6 3 2 2 3 7 2 2 2 0 9 8 2
4 4 3 7 5 1 1 1 8 6 5 4 3 4 2 0 0 10 1 5 5 10 8 9 6 9 7 5 2 0 1 3 10 2 0 0 5 6 8 5 1 0 7 6 6 6 1 5 6 4 10 7 0 10 1 1 0 10 10 3 4 4 2 9 2 7 3 1 6 10 2 6 1 7 10 10 5 10 7 5 4 6 6 3 6 9 9 4 0 2 5 2 6 5 4 10 1 4 1 7
6 10 4 7 8 7 7 10 10 3 8 1 1 0 9 8 0 10 1 3 8 4 6 1 4 3 8 3 7 3 1 8 2 0 2 2 2 0 2 7 3 4 9 4 1 6 9 10 4 1 3 7 7 5 1 5 3 3 6 8 10 9 8 4 8 10 0 3 5 5 5 6 5 7 4 0 5 6 6 9 1 7 5 8 0 2 3 1 7 1 7 3 4 2 5 8 3 5 6 3
1 2 7 4 3 9 3 0 4 8 8 2 3 4 6 8 4 4 1 3 5 4 2 2 5 0 9 4 4 7 5 10 0 3 1 1 9 10 1 7 6 3 9 9 9 9 5 3 8 10 2 10 9 2 10 4 8 2 9 5 9 10 5 1 9 0 8 7 3 3 2 6 8 10 2 6 8 4 1 1 1 8 7 9 6 10 8 7 3 5 3 10 3 6 4 0 6 7 1 8
10 4 7 2 3 10 1 4 0 8 5 3 7 6 10 9 2 6 2 3 0 6 7 8 9 2 7 7 0 6 1 7 1 1 1 10 6 10 5 5 7 1 6 6 10 7 4 5 8 10 1 4 2 8 10 3 6 7 3 6 1 2 10 2 3 3 5 10 7 1 4 7 4 7 6 4 8 0 8 10 2 8 10 7 3 1 1 9 4 3 2 6 7 1 6 3 1 6 0 8
10 5 4 6 1 4 7 1 6 7 9 0 1 7 9 10 1 4 7 3 5 10 10 1 8 7 5 0 10 3 8 10 4 1 8 9 10 8 5 2 5 1 6 9 9 3 6 2 3 8 0 4 2 4 9 9 5 5 10 9 2 2 9 2 5 0 10 2 8 8 4 4 5 3 5 6 4 1 2 4 1 5 8 7 6 2 8 5 8 2 3 10 0 7 5 6 10 0 9 4
8 9 9 3 8 8 8 4 0 7 9 4 0 10 2 7 9 7 4 10 7 9 5 4 10 9 7 2 5 1 2 10 2 10 10 1 4 10 8 7 9 2 8 7 0 5 2 1 7 2 2 4 1 7 10 3 0 0 1 0 6 10 6 1 0 9 6 6 2 0 5 4 3 8 2 5 4 1 5 2 0 9 3 5 2 8 2 2 5 8 6 5 4 2 10 6 7 8 6 7
8 8 7 2 3 8 10 5 1 2 2 10 2 6 4 2 7 8 1 1 8 6 2 7 3 6 7 6 5 6 3 5 7 9 3 9 4 4 3 9 9 0 1 3 5 8 2 0 5 6 7 1 4 9 0 2 7 4 3 7 4 10 7 6 6 1 2 3 0 4 5 2 2 10 1 7 5 1 6 7 10 0 7 0 8 6 9 1 8 7 7 2 7 9 6 3 6 1 6 0
7 2 2 5 8 9 4 7 1 8 8 3 8 4 6 1 1 10 9 10 1 0 0 1 3 6 2 2 2 6 2 3 5 10 3 10 0 7 3 4 5 3 4 3 2 9 6 5 0 7 6 8 8 5 3 4 9 5 9 9 5 8 10 5 10 6 7 1 10 7 0 2 7 0 7 10 0 6 4 0 8 4 3 2 8 8 1 5 9 6 10 0 3 5 2 9 2 9 9 9
0 6 2 6 6 2 5 0 2 3 1 7 10 4 6 0 2 7 9 4 10 3 10 1 10 10 4 8 10 7 6 1 10 2 7 3 4 3 7 2 2 2 1 8 3 1 1 4 3 1 10 4 2 7 9 0 9 4 6 7 3 4 1 0 1 2 8 1 10 0 3 1 3 2 1 7 4 4 7 7 10 1 5 0 3 8 2 10 7 1 7 4 7 5 7 9 2 3 10 4
10 0 9 6 8 1 5 1 7 8 10 0 2 6 6 9 8 10 5 7 8 9 8 8 4 9 7 10 8 10 6 4 3 3 10 8 2 4 6 5 6 2 8 2 10 4 0 8 1 2 1 9 6 5 6 10 8 3 8 4 2 1 8 1 1 5 7 10 5 7 1 8 1 8 5 1 9 9 7 3 1 3 10 6 0 6 4 8 5 9 10 3 6 1 9 5 4 9 10 5
2 10 6 1 5 8 8 6 10 0 8 1 7 2 7 1 6 1 4 5 2 4 8 0 0 10 5 6 9 2 3 6 5 10 3 4 5 4 1 6 9 7 6 5 0 1 10 9 8 5 5 9 9 2 2 7 0 8 3 10 9 9 1 6 3 1 9 9 6 0 7 7 1 6 8 6 1 4 6 1 3 10 2 10 8 7 7 10 1 1 2 6 2 6 7 10 10 4 1 1
4 9 8 4 7 5 7 0 10 6 4 10 2 2 3 5 7 1 8 4 7 5 5 6 6 8 1 1 4 4 5 2 4 5 4 2 3 9 10 6 2 5 0 10 7 0 5 7 8 5 6 10 5 2 10 10 5 1 0 3 8 8 10 3 4 10 2 1 7 4 4 9 1 2 2 9 7 5 6 6 8 10 8 1 8 4 4 0 1 3 5 9 9 10 5 7 2 9 2 9
3 3 5 10 8 1 1 1 2 5 4 10 10 2 8 9 7 10 0 8 5 8 2 0 6 6 9 5 2 3 7 5 3 5 1 9 1 10 0 9 8 0 4 3 1 1 10 3 0 6 5 8 8 3 0 1 4 4 2 2 5 10 6 6 6 9 9 10 5 0 7 3 6 6 0 2 10 10 4 1 3 0 0 3 7 5 8 0 10 3 4 0 10 8 7 4 9 2 8 10
4 3 7 9 0 6 7 1 3 3 6 5 7 2 8 4 2 1 4 4 4 3 6 1 8 4 9 7 8 1 0 2 1 7 0 2 3 4 7 2 8 1 5 0 2 9 5 1 2 1 7 5 6 8 10 3 3 8 10 5 8 0 3 3 7 3 6 1 0 8 9 6 4 3 2 6 10 0 3 3 3 4 9 4 8 3 1 10 4 3 7 8 10 2 0 7 8 6 8 9
5 3 9 1 7 5 10 2 9 10 8 6 5 2 4 8 2 10 1 9 4 10 1 5 6 10 5 4 4 5 2 9 10 3 5 6 10 10 4 1 1 1 1 2 1 4 4 5 4 3 9 0 9 3 5 2 5 2 5 0 7 3 2 3 8 4 3 1 5 4 4 3 3 9 2 6 8 10 9 8 2 9 10 10 10 4 5 9 2 3 1 10 10 5 3 8 9 6 0 2
9 10 7 1 0 1 1 1 2 9 0 9 5 6 6 6 1 7 4 7 9 8 3 1 9 5 4 3 7 9 2 9 5 1 6 7 6 9 10 0 4 1 3 0 8 6 6 3 6 8 5 8 4 0 2 0 0 10 9 10 9 4 8 7 6 7 0 0 9 8 1 7 2 7 3 1 6 6 7 0 4 1 7 7 5 1 4 4 5 3 7 6 0 2 4 10 0 6 2 3
9 0 9 10 10 1 3 7 7 0 3 8 1 7 0 8 0 9 10 6 2 7 7 4 8 2 4 8 9 5 6 7 7 0 9 9 10 5 9 5 2 7 5 5 8 4 9 6 1 5 3 10 1 5 7 1 8 6 0 9 9 4 2 7 8 9 4 2 6 8 1 2 1 6 9 10 8 0 0 4 8 6 4 3 9 7 8 10 1 8 6 10 10 0 2 10 8 9 0 4
3 7 7 9 0 9 9 8 1 9 1 4 9 4 10 2 4 2 10 0 10 0 9 0 9 0 0 10 1 10 6 5 4 8 7 7 3 3 3 5 9 2 6 1 2 2 8 3 9 3 5 0 1 3 7 2 3 3 6 8 8 8 6 3 2 9 1 4 10 0 4 4 5 1 2 0 5 3 1 8 4 6 10 0 4 6 9 9 8 8 5 0 0 7 8 9 4 9 0 3
8 3 6 2 8 1 9 1 9 8 9 6 9 6 0 8 0 8 5 6 5 5 7 6 10 5 0 6 9 10 4 8 4 6 9 0 0 6 9 10 0 10 8 1 3 5 4 2 3 6 8 5 4 1 5 7 3 6 1 6 4 2 6 0 8 4 10 10 8 1 6 5 6 9 6 9 6 8 1 6 6 8 4 3 10 5 3 9 6 0 2 8 7 3 7 8 5 0 0 8
5 2 5 6 10 2 8 10 2 1 7 4 3 4 2 5 7 4 3 4 0 3 9 6 5 2 6 0 10 6 4 8 6 6 9 6 8 0 4 1 0 4 5 1 5 7 6 10 0 3 9 4 10 7 0 9 10 2 3 0 9 10 8 4 1 8 5 7 7 0 0 1 4 1 8 3 1 3 6 3 10 10 0 9 9 7 6 1 5 7 9 5 9 10 8 6 1 0 5 3
0 6 10 6 3 6 1 3 3 7 5 2 5 3 9 4 6 5 10 1 0 8 7 4 6 4 10 6 7 7 2 0 3 1 7 0 1 2 4 9 10 5 5 3 6 5 10 8 9 3 5 4 0 2 3 0 4 9 5 8 4 3 9 0 0 8 7 10 10 5 10 3 8 7 6 2 8 6 0 4 7 8 5 3 4 2 0 4 8 7 7 4 4 5 9 8 5 4 2 1
4 10 1 9 1 8 8 4 7 10 5 3 4 8 0 4 8 0 9 8 0 7 3 9 5 9 4 5 7 8 6 4 7 1 8 10 5 9 1 3 10 5 7 0 3 8 7 10 2 10 1 4 4 10 9 6 4 5 6 10 3 5 8 5 7 8 10 8 8 0 7 10 2 10 4 5 0 3 2 9 5 4 2 3 5 0 7 0 5 3 9 5 1 5 4 8 10 7 0 0
9 5 4 7 0 5 10 1 10 8 1 1 1 5 2 1 6 9 7 0 7 3 5 9 10 0 0 5 5 4 8 9 7 0 0 6 1 5 1 0 8 6 1 5 4 4 10 10 1 5 3 7 2 8 6 4 8 2 6 9 8 0 10 3 4 8 2 4 10 9 3 9 10 10 5 9 10 1 6 6 3 6 4 0 2 2 1 0 3 8 2 6 0 0 8 6 8 4 1 8
1 5 1 8 3 6 2 9 0 3 5 8 5 10 7 5 0 0 8 5 10 10 10 4 5 6 6 3 3 1 2 10 9 4 9 1 1 6 0 6 7 0 1 4 8 9 10 8 0 8 0 2 4 1 8 7 9 0 3 2 5 8 8 5 8 8 6 6 7 9 9 0 1 2 9 4 2 7 5 4 10 5 3 2 10 5 1 2 1 4 7 3 1 7 0 5 3 5 8 8
5 4 0 10 10 3 4 0 8 7 10 4 10 8 7 2 3 6 4 2 0 7 6 7 8 10 2 2 2 0 9 2 1 5 2 7 7 9 0 6 8 0 2 3 4 2 1 3 0 5 5 3 0 0 1 7 3 1 4 6 8 8 6 3 4 8 5 1 8 2 1 10 2 8 7 9 9 4 4 10 0 4 1 5 1 7 8 3 3 5 10 6 4 7 1 1 8 7 9 4
5 6 2 8 10 1 3 6 6 3 2 2 0 6 8 5 4 0 10 10 6 7 10 1 5 0 10 4 10 6 0 8 7 3 8 7 4 9 7 4 0 6 1 5 4 1 9 7 4 2 4 4 5 9 6 5 8 2 3 7 1 3 4 6 5 8 10 3 7 9 6 8 6 1 7 3 1 10 7 4 1 2 2 6 3 5 5 4 9 4 1 3 10 2 0 2 9 8 0 4
9 2 0 2 8 4 4 2 8 4 2 6 3 5 1 8 5 8 3 4 1 6 2 2 6 6 6 4 1 0 5 3 5 2 8 4 7 9 3 9 10 0 6 4 8 7 3 9 7 6 9 10 3 9 3 10 2 4 3 5 10 1 0 6 7 2 0 7 8 4 2 2 9 9 5 5 3 7 5 7 6 1 7 7 0 7 0 1 0 5 8 9 6 0 0 3 10 9 3 8
1 3 9 6 0 7 6 6 3 9 5 8 1 0 8 9 1 2 9 4 1 1 4 5 7 2 6 3 3 8 7 1 3 7 10 2 4 10 0 3 9 2 3 10 4 2 1 5 9 6 7 3 2 8 4 7 9 0 9 3 5 7 9 9 2 10 10 2 8 8 9 0 3 9 6 5 7 2 10 0 6 8 4 2 8 10 7 7 2 4 8 9 3 1 6 3 1 7 10 2
7 6 0 6 5 7 8 1 6 1 1 0 3 10 4 9 1 4 5 2 2 7 10 8 10 6 1 6 3 0 4 9 6 4 10 1 10 4 6 3 4 8 9 2 7 3 9 5 6 6 4 5 2 1 5 4 4 1 0 2 10 3 9 0 8 8 5 3 9 10 0 1 9 9 10 4 4 5 7 7 8 3 0 5 6 8 6 3 8 5 4 0 8 0 7 10 7 3 7 0
8 4 9 5 5 3 3 4 7 4 8 2 1 5 7 9 2 6 10 0 2 4 7 10 2 4 6 10 2 6 8 4 6 10 3 5 2 4 5 2 5 0 1 7 9 4 5 8 3 8 6 7 6 3 0 1 8 1 0 0 5 6 2 5 0 6 9 7 7 1 2 7 10 7 9 7 8 3 4 7 5 6 1 4 2 8 10 4 10 1 2 0 3 9 1 9 10 7 9 8
4 0 6 4 9 9 2 3 9 2 2 9 7 2 8 4 6 9 6 6 0 6 2 7 1 6 1 2 6 9 10 4 7 7 4 9 2 5 8 7 4 5 0 2 9 2 2 1 4 4 8 5 0 5 2 10 0 0 6 5 0 1 0 9 3 6 3 5 6 6 0 2 0 6 1 3 2 2 1 2 4 9 6 9 8 6 4 7 3 5 5 2 10 3 4 4 10 9 10 6
2 10 7 7 0 2 4 8 8 2 6 5 0 6 9 9 4 8 10 10 5 0 9 1 10 5 5 3 7 10 6 10 7 7 8 5 6 3 8 4 1 5 0 10 2 8 7 8 10 3 10 5 7 4 7 7 6 0 1 6 9 5 8 9 8 7 1 10 10 2 0 1 8 8 1 0 1 5 9 4 0 8 9 3 1 3 2 7 4 8 9 6 0 6 2 10 6 7 6 7
3 9 4 2 5 3 2 0 5 7 1 1 10 4 2 2 7 2 1 6 5 6 3 8 6 8 4 0 1 0 4 2 6 5 8 10 1 3 7 10 3 5 9 3 10 6 3 6 5 2 3 2 8 4 10 6 7 9 8 3 8 1 0 9 4 2 9 7 4 6 9 6 8 10 2 7 4 4 3 7 10 8 2 10 4 9 5 2 4 4 2 1 2 2 7 7 8 7 5 4
1 4 10 8 8 2 10 7 2 3 9 2 4 0 10 0 7 6 2 3 4 6 7 7 0 1 7 6 7 7 9 2 3 1 6 8 6 1 5 4 4 5 3 3 4 2 2 9 8 3 9 6 5 5 4 6 10 9 1 0 0 7 9 4 9 5 10 8 2 7 7 1 5 10 7 10 8 6 6 4 2 10 7 9 4 5 9 10 7 3 3 0 7 1 6 7 1 1 1 6
2 1 3 0 7 1 8 7 5 10 10 0 1 9 2 1 1 3 10 6 5 9 3 1 7 7 6 9 6 0 6 6 8 5 5 3 10 6 9 5 4 1 3 1 8 10 0 5 10 5 3 3 9 1 9 6 4 10 4 0 6 8 10 10 1 5 3 2 1 7 5 2 4 5 3 7 9 7 6 9 0 9 3 8 2 4 2 7 2 9 2 2 5 5 3 2 6 1 10 0
0 6 1 3 4 4 10 5 6 8 9 10 8 1 2 7 2 6 8 5 6 7 10 2 9 4 3 2 4 9 2 2 10 10 9 3 6 3 0 10 9 7 10 5 3 4 1 1 3 10 7 2 5 8 8 10 2 7 0 10 8 7 5 10 1 1 6 4 3 0 6 0 4 10 6 3 5 4 3 7 8 10 0 10 0 8 2 9 0 7 4 8 1 8 1 7 1 10 7 0
4 0 4 2 6 9 5 6 10 9 5 7 2 6 5 9 0 1 3 8 7 5 7 10 7 6 8 6 4 7 6 1 2 0 1 9 2 5 3 10 1 2 1 1 8 9 10 7 7 2 9 10 9 0 3 5 2 2 2 8 1 8 9 2 3 9 3 2 5 10 4 9 8 4 3 2 2 3 10 3 0 1 5 5 7 1 4 9 0 5 4 8 6 10 4 7 8 8 9 3

1000
solution2/src/grids/1000.txt Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,20 @@
0 0 2 1 1 2 1 0 0 1 2 0 0 2 1 0 1 1 2 1
1 0 2 1 1 0 1 1 2 1 2 0 1 2 1 1 0 2 2 0
2 2 2 0 1 0 0 2 0 0 1 2 0 0 1 2 2 2 2 0
2 2 2 1 2 1 0 1 0 2 0 1 2 2 1 0 2 1 2 1
0 1 0 0 2 1 1 0 2 1 1 2 2 2 1 0 0 2 1 1
0 1 1 0 0 0 2 0 1 2 1 2 2 0 2 0 0 2 2 0
0 2 0 1 2 0 1 1 1 2 2 0 2 0 1 1 1 2 1 2
2 0 1 2 0 2 2 0 0 2 0 1 1 2 1 0 2 0 2 2
0 0 1 2 1 2 0 2 2 0 2 0 1 1 2 1 2 0 0 2
1 1 1 2 0 0 1 1 2 2 0 2 2 2 2 1 1 2 0 2
0 0 1 0 0 1 1 1 2 0 2 2 1 0 1 0 2 0 0 2
2 0 0 0 0 2 0 0 0 1 2 0 1 0 1 0 0 2 0 2
0 0 0 1 1 0 1 1 1 2 0 2 2 0 0 1 1 2 0 2
2 0 0 0 1 1 0 0 0 1 0 1 1 1 1 1 1 2 1 1
2 1 0 0 1 0 2 1 2 2 2 1 0 0 1 0 1 1 1 0
2 1 0 2 2 1 2 2 1 2 2 2 2 2 0 2 1 0 2 0
0 0 1 2 2 0 1 1 0 1 0 2 0 0 2 1 0 1 0 1
0 1 2 1 1 1 1 1 1 2 0 1 0 2 1 0 0 0 1 0
2 0 1 2 2 2 0 0 0 0 2 1 2 1 0 0 1 0 0 1
0 1 1 2 0 0 2 2 0 2 0 2 2 1 1 0 2 2 2 0

108
solution2/src/lib.rs Normal file
View file

@ -0,0 +1,108 @@
use grid::{Grid, Path, Point};
use std::collections::BTreeSet;
use std::time::{Duration, SystemTime};
pub mod grid;
pub fn find_optimal_path(grid: &Grid, t: usize, T: u128, x: u16, y: u16) {
let mut paths_to_consider: BTreeSet<Path> = BTreeSet::new();
let taken_paths: Vec<u64> = vec![];
let path = Path::new(grid, x, y);
let mut max: Path = path.clone(); // sorry
paths_to_consider.insert(path);
let t0 = SystemTime::now();
let mut running = true;
let mut discrete_elapsed = 0;
while running {
let N = grid.size();
let mut current_path = paths_to_consider.pop_last().unwrap(); // assert Some
if current_path.value > max.value {
max = current_path.clone(); // sorry
}
while current_path.length() >= t {
current_path = paths_to_consider.pop_last().unwrap(); // highest
if current_path.value > max.value {
max = current_path.clone(); // sorry
}
}
let head = current_path.head();
let x = head.x;
let y = head.y;
let mut new_directions = vec![];
if y > 0 {
new_directions.push(Point::new(
x,
y - 1,
grid.get_value(x, y - 1, discrete_elapsed),
));
if x < N - 1 {
new_directions.push(Point::new(
x + 1,
y - 1,
grid.get_value(x + 1, y - 1, discrete_elapsed),
));
}
}
if x > 0 {
new_directions.push(Point::new(
x - 1,
y,
grid.get_value(x - 1, y, discrete_elapsed),
));
if y > 0 {
new_directions.push(Point::new(
x - 1,
y - 1,
grid.get_value(x - 1, y - 1, discrete_elapsed),
));
}
}
if x < N - 1 {
new_directions.push(Point::new(
x + 1,
y,
grid.get_value(x + 1, y, discrete_elapsed),
));
if y < N - 1 {
new_directions.push(Point::new(
x + 1,
y + 1,
grid.get_value(x + 1, y + 1, discrete_elapsed),
));
}
}
if y < N - 1 {
new_directions.push(Point::new(
x,
y + 1,
grid.get_value(x, y + 1, discrete_elapsed),
));
if x > 0 {
new_directions.push(Point::new(
x - 1,
y + 1,
grid.get_value(x - 1, y + 1, discrete_elapsed),
));
}
}
// continue?
let t1 = SystemTime::now();
if let Ok(elapsed) = t1.duration_since(t0) {
if elapsed.as_millis() > T {
running = false;
}
}
discrete_elapsed += 1;
}
}

5
solution2/src/main.rs Normal file
View file

@ -0,0 +1,5 @@
use solution2::grid::Grid;
fn main() {
Grid::new(20);
}