Initial commit
This commit is contained in:
25
.gitignore
vendored
Normal file
25
.gitignore
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
/target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/build/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
62
pom.xml
Normal file
62
pom.xml
Normal file
@@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.tenvoorde</groupId>
|
||||
<artifactId>geocaching</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>11</source>
|
||||
<target>11</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>de.grundid.opendatalab</groupId>
|
||||
<artifactId>geojson-jackson</artifactId>
|
||||
<version>1.12</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.locationtech.jts</groupId>
|
||||
<artifactId>jts-core</artifactId>
|
||||
<version>1.16.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.wololo</groupId>
|
||||
<artifactId>jts2geojson</artifactId>
|
||||
<version>0.14.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.12</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>28.2-jre</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-math3</artifactId>
|
||||
<version>3.6.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
<version>1.14</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
38
src/main/java/Determinant.java
Normal file
38
src/main/java/Determinant.java
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
public class Determinant {
|
||||
|
||||
static int d1 = det1(7,2,4,2,8,7);
|
||||
static int d2 = det2(7,2,4,2,8,7);
|
||||
|
||||
public static void main(String[] args) {
|
||||
for (int n1 = 0; n1 <= 9; n1++) {
|
||||
for (int n2 = 0; n2 <= 9; n2++) {
|
||||
for (int n3 = 0; n3 <= 9; n3++) {
|
||||
for (int e1 = 0; e1 <= 9; e1++) {
|
||||
for (int e2 = 0; e2 <= 9; e2++) {
|
||||
for (int e3 = 0; e3 <= 9; e3++) {
|
||||
// int det1 = -15 * e1 - 5 * e2 + 40 * e3 + 2 * e2 * n1 - 7 * e3 * n1 - 2 * e1 * n2
|
||||
// + 3 * e3 * n2 + 7 * e1 * n3 - 3 * e2 * n3;
|
||||
// int det2 = 4 + 20 * e1 + 21 * e1 * e2 - 7 * e3 - 6 * e2 * n1 - 10 * e3 * n1 - 10 * n2
|
||||
// - 7 * e2 * n2 + 5 * e2 * n1 * n2 - 6 * e1 * n3 + 3 * e3 * n1 * n3 + 2 * n2 * n3;
|
||||
if (det1(n1,n2,n3,e1,e2,e3) == d1 && det2(n1,n2,n3,e1,e2,e3) == d2) {
|
||||
System.out.println("" + n1 + n2 + n3 + e1 + e2 + e3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int det1(int n1, int n2, int n3, int e1, int e2, int e3) {
|
||||
return -15 * e1 - 5 * e2 + 40 * e3 + 2 * e2 * n1 - 7 * e3 * n1 - 2 * e1 * n2
|
||||
+ 3 * e3 * n2 + 7 * e1 * n3 - 3 * e2 * n3;
|
||||
}
|
||||
|
||||
static int det2(int n1, int n2, int n3, int e1, int e2, int e3) {
|
||||
return 4 + 20 * e1 + 21 * e1 * e2 - 7 * e3 - 6 * e2 * n1 - 10 * e3 * n1 - 10 * n2
|
||||
- 7 * e2 * n2 + 5 * e2 * n1 * n2 - 6 * e1 * n3 + 3 * e3 * n1 * n3 + 2 * n2 * n3;
|
||||
}
|
||||
}
|
||||
16
src/main/java/Grutten.java
Normal file
16
src/main/java/Grutten.java
Normal file
@@ -0,0 +1,16 @@
|
||||
|
||||
public class Grutten {
|
||||
|
||||
|
||||
private static long josephus(long total, int skip) {
|
||||
long g = 1;
|
||||
for (long i = 1; i <= total; i++) {
|
||||
g = ((g + skip - 1) % i) + 1;
|
||||
}
|
||||
return g;
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
System.out.println(josephus(7382786182L, 18));
|
||||
|
||||
}
|
||||
}
|
||||
31
src/main/java/LadderProblem.java
Normal file
31
src/main/java/LadderProblem.java
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
//* @author: 82638882@163.com
|
||||
import java.io.*;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class LadderProblem {
|
||||
public static void main(String[] args) throws IOException {
|
||||
// String[] ss = in.readLine().split(" ");
|
||||
// double x = Double.parseDouble(ss[0]);
|
||||
// double y = Double.parseDouble(ss[1]);
|
||||
// double c = Double.parseDouble(ss[2]);
|
||||
double x = 10;
|
||||
double y = 12;
|
||||
double c = 5;
|
||||
|
||||
double max = Math.min(x, y), min = 0;
|
||||
for (int i = 0; max - min > 0.0000000001; i++) {
|
||||
double mid = (min + max) / 2;
|
||||
double d1 = Math.sqrt(x * x - mid * mid);
|
||||
double d2 = Math.sqrt(y * y - mid * mid);
|
||||
if (c * (d1 + d2) == (d1 * d2)) {
|
||||
min = max = mid;
|
||||
break;
|
||||
} else if (c * (d1 + d2) > (d1 * d2))
|
||||
max = mid;
|
||||
else
|
||||
min = mid;
|
||||
}
|
||||
System.out.printf("%.10f\n", (min + max) / 2);
|
||||
}
|
||||
}
|
||||
26
src/main/java/Slak.java
Normal file
26
src/main/java/Slak.java
Normal file
@@ -0,0 +1,26 @@
|
||||
import java.math.BigDecimal;
|
||||
import java.math.MathContext;
|
||||
|
||||
public class Slak {
|
||||
|
||||
private static final double INIT_LENGTE = 1;
|
||||
private static final double GROEI_PER_DAG = 1;
|
||||
private static final double WANDELING_PER_DAG = 0.12;
|
||||
|
||||
public static void main(String[] args) {
|
||||
double lengte_touw = INIT_LENGTE;
|
||||
//noinspection deprecation
|
||||
BigDecimal positie = new BigDecimal(0).setScale(10, BigDecimal.ROUND_HALF_UP);
|
||||
// double positie = 0;
|
||||
long dag = 0;
|
||||
|
||||
do {
|
||||
dag++;
|
||||
positie = positie.add(new BigDecimal(WANDELING_PER_DAG));
|
||||
if (positie.compareTo(new BigDecimal(lengte_touw)) > 0) break;
|
||||
lengte_touw += GROEI_PER_DAG;
|
||||
positie = positie.multiply(new BigDecimal(lengte_touw / (lengte_touw - GROEI_PER_DAG)));
|
||||
} while (positie.compareTo(new BigDecimal(lengte_touw)) < 0);
|
||||
System.out.println(dag);
|
||||
}
|
||||
}
|
||||
24
src/main/java/SlakJohan.java
Normal file
24
src/main/java/SlakJohan.java
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
public class SlakJohan {
|
||||
|
||||
public static void main(String[] args) {
|
||||
double slak = 0;
|
||||
for (int i = 1; i < 200000000; i++) {
|
||||
slak = (slak + 0.05); // actie 1: schuiven
|
||||
if (slak >= i) { // actie 2: checken
|
||||
System.out.println("Lengte touw = " + (i + 1) + ", slak = " + slak);
|
||||
break;
|
||||
}
|
||||
slak *= ((i + 1) / (double) i); // 3: direct daarna uitrekken
|
||||
if (i < 10) { // debug
|
||||
System.out.println(
|
||||
"Slak[" + i + "] = " + slak + ", lengte touw = " + (i + 1) + ", dif = " + (slak - ((i + 1))));
|
||||
}
|
||||
if (i % 100000 == 0) { // debug
|
||||
System.out.println(
|
||||
"Slak[" + i + "] = " + slak + ", lengte touw = " + (i + 1) + ", dif = " + (slak - ((i + 1))));
|
||||
}
|
||||
}
|
||||
System.out.println("Lengte touw geen uitkomst");
|
||||
}
|
||||
}
|
||||
131
src/main/java/Test.java
Normal file
131
src/main/java/Test.java
Normal file
@@ -0,0 +1,131 @@
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Random;
|
||||
|
||||
public class Test {
|
||||
|
||||
// published: 200479, 468608
|
||||
// cache: 198667, 467811
|
||||
private static final int foost = 108549;
|
||||
private static final int fnoord = 480361;
|
||||
//108549,
|
||||
private static final int min_distance = 3219;
|
||||
private static final int max_distance = 10000;
|
||||
|
||||
private static final String filename = "d:\\temp\\gc6dyy3.txt";
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static void main(String[] args) throws IOException {
|
||||
|
||||
// snail();
|
||||
test();
|
||||
if (0 < 1) return;
|
||||
|
||||
Random generator = new Random();
|
||||
Long oost;
|
||||
Long noord;
|
||||
Long distance;
|
||||
|
||||
int step = 0;
|
||||
|
||||
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), "utf-8"))) {
|
||||
|
||||
do {
|
||||
oost = (long) generator.nextInt(900000) + 100000;
|
||||
noord = (long) generator.nextInt(900000) + 100000;
|
||||
distance = (long) Math.sqrt((oost - foost) * (oost - foost) + (noord - fnoord) * (noord - fnoord));
|
||||
|
||||
if (distance > min_distance && distance < max_distance) {
|
||||
writer.write(oost.toString());
|
||||
writer.write(noord.toString());
|
||||
|
||||
step++;
|
||||
|
||||
if (step % 12 == 0) {
|
||||
writer.newLine();
|
||||
}
|
||||
}
|
||||
} while (step < 12000);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static void test() throws IOException {
|
||||
Path path = Paths.get(filename);
|
||||
byte[] data = Files.readAllBytes(path);
|
||||
int goed = 0;
|
||||
|
||||
for (int pos = 0; pos < data.length - 13; pos++) {
|
||||
String oost = "";
|
||||
String noord = "";
|
||||
int subpos = pos;
|
||||
|
||||
for (int i = 1; i <= 6; i++) {
|
||||
while (data[subpos] == 13 || data[subpos] == 10) {
|
||||
subpos++;
|
||||
}
|
||||
|
||||
oost += Integer.toString(data[subpos] - '0');
|
||||
subpos++;
|
||||
}
|
||||
|
||||
for (int i = 1; i <= 6; i++) {
|
||||
while (data[subpos] == 13 || data[subpos] == 10) {
|
||||
subpos++;
|
||||
}
|
||||
|
||||
noord += Integer.toString(data[subpos] - '0');
|
||||
subpos++;
|
||||
}
|
||||
|
||||
Long lnoord = Long.parseLong(noord);
|
||||
Long loost = Long.parseLong(oost);
|
||||
Long distance = (long) Math.sqrt((loost - foost) * (loost - foost) + (lnoord - fnoord) * (lnoord - fnoord));
|
||||
|
||||
if (distance < min_distance) {
|
||||
System.out.println(oost + " " + noord + " " + distance);
|
||||
} else {
|
||||
goed++;
|
||||
}
|
||||
}
|
||||
System.out.println(goed);
|
||||
}
|
||||
|
||||
private static void snail() {
|
||||
|
||||
double length = 20;
|
||||
double walk = 1;
|
||||
double position = 0;
|
||||
double growth = 20;
|
||||
long step = 0;
|
||||
|
||||
do {
|
||||
step++;
|
||||
position += walk;
|
||||
length += growth;
|
||||
position *= (length / (length - growth));
|
||||
} while (position < length);
|
||||
|
||||
System.out.println(step);
|
||||
}
|
||||
|
||||
private static void test2() {
|
||||
var a = new ArrayList<>();
|
||||
a.size();
|
||||
int[] b;
|
||||
b = new int[5];
|
||||
int c = b.length;
|
||||
String d = "abc";
|
||||
d.length();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
4
src/main/java/TrackableCrawler.java
Normal file
4
src/main/java/TrackableCrawler.java
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
public class TrackableCrawler {
|
||||
|
||||
}
|
||||
155
src/main/java/Traveling.java
Normal file
155
src/main/java/Traveling.java
Normal file
@@ -0,0 +1,155 @@
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
public class Traveling {
|
||||
|
||||
private static double minimum = 100000;
|
||||
private static Map<Pair<City,City>, Double> distances = new HashMap<>();
|
||||
|
||||
class tspThread implements Runnable {
|
||||
List<City> toVisit, visited;
|
||||
|
||||
public tspThread(List<City> toVisit, List<City> visited) {
|
||||
this.toVisit = toVisit;
|
||||
this.visited = visited;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
System.out.println("Thread gestart met begin " + this.visited.get(0));
|
||||
findBestRoute(toVisit, visited);
|
||||
System.out.println("--- thread klaar ---");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void start() {
|
||||
List<City> cities = new ArrayList<>(Arrays.asList(
|
||||
new City("n", 6, 1)
|
||||
, new City("f", 3, 2)
|
||||
, new City("a", 5, 4)
|
||||
, new City("b", 7, 4)
|
||||
, new City("k", 10, 4)
|
||||
, new City("g", 1, 5)
|
||||
, new City("c", 9, 6)
|
||||
, new City("e", 4, 7)
|
||||
, new City("d", 8, 8)
|
||||
, new City("q", 10, 8)
|
||||
, new City("h", 4, 10)
|
||||
, new City("p", 7, 10)
|
||||
, new City("m", 10, 10)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
));
|
||||
|
||||
buildDistancesMap(cities);
|
||||
|
||||
for (City cityToVisit : cities) {
|
||||
List<City> toVisitClone = new ArrayList<>(cities);
|
||||
List<City> visitedClone = new ArrayList<>();
|
||||
toVisitClone.remove(cityToVisit);
|
||||
visitedClone.add(cityToVisit);
|
||||
System.out.println("<" + cityToVisit.getName() + ">");
|
||||
Thread thread = new Thread(new tspThread(toVisitClone, visitedClone));
|
||||
thread.start();
|
||||
//findBestRoute(toVisitClone, visitedClone);
|
||||
}
|
||||
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
new Traveling().start();
|
||||
}
|
||||
|
||||
private static void buildDistancesMap(List<City> cities) {
|
||||
for (City from : cities) {
|
||||
for (City to : cities) {
|
||||
distances.put(Pair.of(from, to), from.distance(to));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void findBestRoute(List<City> toVisit, List<City> visited) {
|
||||
if (toVisit.isEmpty()) {
|
||||
if (distance(visited) <= minimum) {
|
||||
minimum = distance(visited);
|
||||
System.out.format("%s %f%n", visited, minimum);
|
||||
}
|
||||
return;
|
||||
}
|
||||
for (City cityToVisit : toVisit) {
|
||||
List<City> toVisitClone = new ArrayList<>(toVisit);
|
||||
List<City> visitedClone = new ArrayList<>(visited);
|
||||
toVisitClone.remove(cityToVisit);
|
||||
visitedClone.add(cityToVisit);
|
||||
findBestRoute(toVisitClone, visitedClone);
|
||||
}
|
||||
}
|
||||
|
||||
public static double distance(List<City> cities) {
|
||||
double distance = 0.0D;
|
||||
City city1 = null;
|
||||
City city2 = null;
|
||||
for (City city : cities) {
|
||||
city1 = city2;
|
||||
city2 = city;
|
||||
if (city1 != null) {
|
||||
distance += distances.get(Pair.of(city1, city2));
|
||||
}
|
||||
}
|
||||
return distance;
|
||||
}
|
||||
}
|
||||
|
||||
class City {
|
||||
private String name;
|
||||
private int x;
|
||||
private int y;
|
||||
|
||||
public double distance(City that) {
|
||||
return Math.sqrt((this.x - that.x)*(this.x - that.x) + (this.y - that.y)*(this.y - that.y));
|
||||
}
|
||||
|
||||
public City(String name, int x, int y) {
|
||||
super();
|
||||
this.name = name;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public int getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(int x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public int getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setY(int y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.name;
|
||||
}
|
||||
}
|
||||
29
src/main/java/collatz/Collatz.java
Normal file
29
src/main/java/collatz/Collatz.java
Normal file
@@ -0,0 +1,29 @@
|
||||
package collatz;
|
||||
import java.util.Comparator;
|
||||
import java.util.TreeSet;
|
||||
|
||||
public class Collatz {
|
||||
|
||||
public static long collatz(long n) {
|
||||
long steps = 0;
|
||||
while (n > 1) {
|
||||
steps++;
|
||||
if (n % 2 == 0) {
|
||||
n /= 2;
|
||||
} else {
|
||||
n *= 3;
|
||||
n++;
|
||||
}
|
||||
}
|
||||
return steps;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
|
||||
System.out.println(set);
|
||||
|
||||
System.out.println(collatz(27));
|
||||
}
|
||||
}
|
||||
|
||||
18
src/main/java/fibo/Fibo.java
Normal file
18
src/main/java/fibo/Fibo.java
Normal file
@@ -0,0 +1,18 @@
|
||||
package fibo;
|
||||
|
||||
public class Fibo {
|
||||
|
||||
public static void main(String[] args) {
|
||||
int N = 5212034;
|
||||
double phi = (Math.sqrt(5) + 1)/2;
|
||||
|
||||
int M = (int) (N/phi);
|
||||
|
||||
do {
|
||||
System.out.println(M);
|
||||
M = N - M;
|
||||
N = N - M;
|
||||
} while (M > 0 && N > 0);
|
||||
|
||||
}
|
||||
}
|
||||
79
src/main/java/frobenius/FrobeniusNums.java
Normal file
79
src/main/java/frobenius/FrobeniusNums.java
Normal file
@@ -0,0 +1,79 @@
|
||||
package frobenius;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Random;
|
||||
|
||||
public class FrobeniusNums {
|
||||
|
||||
private static final int upperRange = 30;
|
||||
private static final int toSearch = 129;
|
||||
public static void main(String[] args) {
|
||||
int[] numbers;
|
||||
int frob = 0;
|
||||
int frobMax = 0;
|
||||
|
||||
do {
|
||||
numbers = new int[]{getRandomNumberInRange(3, upperRange), getRandomNumberInRange(3, upperRange), getRandomNumberInRange(3, upperRange)};
|
||||
if (numbers[0] == numbers[1] || numbers[0] == numbers[2] || numbers[1] == numbers[2]) continue;
|
||||
frob = frobenius(numbers);
|
||||
if (frob > frobMax) {
|
||||
frobMax = frob;
|
||||
System.out.printf("%d: %s\n", frobMax, Arrays.toString(numbers));
|
||||
}
|
||||
if (frob == toSearch) {
|
||||
System.out.printf("%d: %s\n", toSearch, Arrays.toString(numbers));
|
||||
}
|
||||
} while (frob != 10000);
|
||||
System.out.println(Arrays.toString(numbers));
|
||||
}
|
||||
|
||||
private static int getRandomNumberInRange(int min, int max) {
|
||||
|
||||
if (min >= max) {
|
||||
throw new IllegalArgumentException("max must be greater than min");
|
||||
}
|
||||
|
||||
Random r = new Random();
|
||||
return r.nextInt((max - min) + 1) + min;
|
||||
}
|
||||
|
||||
static int frobenius(int[] nums) {
|
||||
int[] ns = new int[nums[0]];
|
||||
Arrays.fill(ns, -1);
|
||||
ns[0] = 0;
|
||||
for (int i = 1; i < nums.length; i++) {
|
||||
int d = gcd(nums[0], nums[i]);
|
||||
for (int r = 0; r < d; r++) {
|
||||
int n = -1;
|
||||
if (r == 0)
|
||||
n = 0;
|
||||
else {
|
||||
int q = r;
|
||||
while (q < nums[0]) {
|
||||
if (ns[q] != -1 && (ns[q] < n || n == -1))
|
||||
n = ns[q];
|
||||
q += d;
|
||||
}
|
||||
}
|
||||
if (n != -1)
|
||||
for (int j = 0; j < nums[0] / d; j++) {
|
||||
n += nums[i];
|
||||
int p = n % nums[0];
|
||||
if (ns[p] != -1 && (ns[p] < n || n == -1))
|
||||
n = ns[p];
|
||||
ns[p] = n;
|
||||
}
|
||||
}
|
||||
}
|
||||
int max = 0;
|
||||
for (int i = 0; i < nums[0]; i++)
|
||||
if (ns[i] == -1 || ns[i] > max)
|
||||
max = ns[i];
|
||||
if (max == -1) return -1;
|
||||
return max - nums[0];
|
||||
}
|
||||
|
||||
static int gcd(int a, int b) {
|
||||
return (b == 0) ? a : gcd(b, a % b);
|
||||
}
|
||||
}
|
||||
101
src/main/java/gsakpolygons/GSAKPolygons.java
Normal file
101
src/main/java/gsakpolygons/GSAKPolygons.java
Normal file
@@ -0,0 +1,101 @@
|
||||
package gsakpolygons;
|
||||
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.Builder;
|
||||
import org.locationtech.jts.geom.Coordinate;
|
||||
import org.locationtech.jts.geom.Geometry;
|
||||
import org.locationtech.jts.geom.MultiPolygon;
|
||||
import org.locationtech.jts.geom.Polygon;
|
||||
import org.wololo.geojson.Feature;
|
||||
import org.wololo.geojson.FeatureCollection;
|
||||
import org.wololo.jts2geojson.GeoJSONReader;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static java.util.Collections.max;
|
||||
import static java.util.Collections.min;
|
||||
|
||||
public class GSAKPolygons {
|
||||
private static final String PREFIX = "D:\\Nextcloud\\Geocaching\\polygons\\";
|
||||
private static final String OUTPUT_FOLDER = PREFIX + "new\\";
|
||||
private static final boolean USE_NUMERIC_FILENAMES = true;
|
||||
private static final String FILE_EXTENSION = ".txt";
|
||||
|
||||
private static final ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
private static final GeoJSONReader reader = new GeoJSONReader();
|
||||
|
||||
private static int fileCounter = 0;
|
||||
private static List<MetaData> metadata = new ArrayList<>();
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
FileInputStream inputStream = new FileInputStream(PREFIX + "Argentina_AL5.GeoJson");
|
||||
|
||||
FeatureCollection featureCollection = objectMapper.readValue(inputStream, FeatureCollection.class);
|
||||
|
||||
for (Feature feature : featureCollection.getFeatures()) {
|
||||
String gsakName = (String) feature.getProperties().get("name");
|
||||
|
||||
MultiPolygon multiPolygon = (MultiPolygon) reader.read(feature.getGeometry());
|
||||
|
||||
if (multiPolygon.getNumGeometries() > 1) {
|
||||
for (int geomNr = 0; geomNr < multiPolygon.getNumGeometries(); geomNr++) {
|
||||
Geometry geometry = multiPolygon.getGeometryN(geomNr);
|
||||
String fileName = (USE_NUMERIC_FILENAMES ? Integer.toString(++fileCounter) : gsakName + "_" + (geomNr + 1));
|
||||
processPolygon(geometry, gsakName, fileName);
|
||||
}
|
||||
} else {
|
||||
Geometry geometry = multiPolygon.getGeometryN(0);
|
||||
String fileName = (USE_NUMERIC_FILENAMES ? Integer.toString(++fileCounter) : gsakName);
|
||||
processPolygon(geometry, gsakName, fileName);
|
||||
}
|
||||
}
|
||||
|
||||
try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(OUTPUT_FOLDER + "meta.txt")))) {
|
||||
for (MetaData meta : metadata) {
|
||||
writer.write(meta.asCsv());
|
||||
writer.write("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void processPolygon(Geometry geometry, String gsakName, String fileName) throws IOException {
|
||||
System.out.println(fileName);
|
||||
try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(OUTPUT_FOLDER + fileName + FILE_EXTENSION), "utf-8"))) {
|
||||
writer.write("# GsakName=" + gsakName + "\n" +
|
||||
"# This Country polygon is based on data (c) OpenStreetMap contributors\n" +
|
||||
"# The OpenStreetMap data is made available under the Open Database License, see http://www.openstreetmap.org/copyright\n" +
|
||||
"# This polygon file is made available under the same Open Database License: http://opendatacommons.org/licenses/odbl/1.0/.\n");
|
||||
for (Coordinate coordinate : geometry.getCoordinates()) {
|
||||
writer.write(coordinate.y + "," + coordinate.x);
|
||||
writer.write("\n");
|
||||
}
|
||||
|
||||
Polygon boundingBox = (Polygon) geometry.getEnvelope();
|
||||
Coordinate[] coordinates = boundingBox.getCoordinates();
|
||||
List<Double> latitudes = Arrays.stream(coordinates).map(Coordinate::getY).collect(Collectors.toList());
|
||||
List<Double> longitudes = Arrays.stream(coordinates).map(Coordinate::getX).collect(Collectors.toList());
|
||||
metadata.add(MetaData.builder().fileName(fileName).gsakName(gsakName).minLat(min(latitudes)).maxLat(max(latitudes)).minLon(min(longitudes)).maxLon(max(longitudes)).build());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Builder
|
||||
class MetaData {
|
||||
// Filename, maxlat, minlat, maxlon, minlon, gsakname
|
||||
private String fileName;
|
||||
private double maxLat;
|
||||
private double minLat;
|
||||
private double maxLon;
|
||||
private double minLon;
|
||||
private String gsakName;
|
||||
|
||||
public String asCsv() {
|
||||
return String.format(Locale.ROOT, "%s,%f,%f,%f,%f,%s", fileName, maxLat, minLat, maxLon, minLon, gsakName);
|
||||
}
|
||||
}
|
||||
27
src/main/java/hash/Dre1968.java
Normal file
27
src/main/java/hash/Dre1968.java
Normal file
@@ -0,0 +1,27 @@
|
||||
package hash;
|
||||
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
|
||||
public class Dre1968 {
|
||||
|
||||
private static final String template = "N52 %02d.%03d E005 %02d.%03d";
|
||||
private static final String hashToFind = "4E77A87A1E3E9E362625A0A86508E1B8";
|
||||
public static void main(String[] args) {
|
||||
// String digest = DigestUtils.md5Hex("");
|
||||
for (int nMin = 3; nMin <= 8; nMin++) {
|
||||
for (int eMin = 49; eMin <= 57; eMin++) {
|
||||
System.out.println(nMin + " " + eMin);
|
||||
for (int nSec = 0; nSec <= 999; nSec++) {
|
||||
for (int eSec = 0; eSec <= 999; eSec++) {
|
||||
// System.out.println(String.format(template, nMin, nSec, eMin, eSec));
|
||||
if (hashToFind.equalsIgnoreCase(DigestUtils.md5Hex(String.format(template, nMin, nSec, eMin, eSec)))) {
|
||||
System.out.println(String.format(template, nMin, nSec, eMin, eSec));
|
||||
System.exit(0);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
506
src/main/java/hash/Hachee.java
Normal file
506
src/main/java/hash/Hachee.java
Normal file
@@ -0,0 +1,506 @@
|
||||
package hash;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class Hachee {
|
||||
|
||||
private static final List<String> aardappels = Arrays.asList(
|
||||
"DORE",
|
||||
"NIER",
|
||||
"AGRIA",
|
||||
"ALPHA",
|
||||
"IRENE",
|
||||
"KRIEL",
|
||||
"MALTA",
|
||||
"PATAT",
|
||||
"POTER",
|
||||
"RAPER",
|
||||
"RODEN",
|
||||
"ROTJE",
|
||||
"GLORIA",
|
||||
"LEGGER",
|
||||
"ROOSJE",
|
||||
"TOFFEL",
|
||||
"BINTJE",
|
||||
"FURORE",
|
||||
"NICOLA",
|
||||
"PIEPER",
|
||||
"ROOIEN",
|
||||
"ZANDER",
|
||||
"AFKOKER",
|
||||
"ASTARTE",
|
||||
"ELEMENT",
|
||||
"GLIMMER",
|
||||
"SATURNA",
|
||||
"BILDSTAR",
|
||||
"HOORNTJE",
|
||||
"BILTSTAR",
|
||||
"DRIELING",
|
||||
"PREMIERE",
|
||||
"ROODNEUS",
|
||||
"OPPERDOES",
|
||||
"ARNHEMMER",
|
||||
"CHARLOTTE",
|
||||
"KEMPENAAR",
|
||||
"PIMPERNEL",
|
||||
"PREVALENT",
|
||||
"PROMINENT",
|
||||
"BEVELANDER",
|
||||
"EERSTELING",
|
||||
"NEGENWEKER",
|
||||
"EIGENHEIMER",
|
||||
"PAARSPETTEN",
|
||||
"PAARSPITTEN",
|
||||
"LEKKERLANDER");
|
||||
|
||||
private static final List<String> groentes = Arrays.asList(
|
||||
"UI",
|
||||
"LOF",
|
||||
"SLA",
|
||||
"BIET",
|
||||
"EPPE",
|
||||
"ERWT",
|
||||
"MAIS",
|
||||
"OKRA",
|
||||
"PEUL",
|
||||
"UIEN",
|
||||
"BOON",
|
||||
"KNOL",
|
||||
"KOOL",
|
||||
"MOES",
|
||||
"PEEN",
|
||||
"PREI",
|
||||
"RAAP",
|
||||
"BOSUI",
|
||||
"KROOT",
|
||||
"ATJAR",
|
||||
"BONEN",
|
||||
"IJSSLA",
|
||||
"KUSSA",
|
||||
"LATUW",
|
||||
"RADIJS",
|
||||
"TAHOE",
|
||||
"TAUGE",
|
||||
"FRISEE",
|
||||
"KROTEN",
|
||||
"MIELIE",
|
||||
"RUCOLA",
|
||||
"SAVOOI",
|
||||
"SIEPEL",
|
||||
"SJALOT",
|
||||
"SPRUIT",
|
||||
"WORTEL",
|
||||
"BIETEN",
|
||||
"DUNSEL",
|
||||
"LINZEN",
|
||||
"MOLSLA",
|
||||
"PAKSOI",
|
||||
"SAJOER",
|
||||
"SALADE",
|
||||
"SNIJSLA",
|
||||
"TOMAAT",
|
||||
"VENKEL",
|
||||
"VETSLA",
|
||||
"WITLOF",
|
||||
"ZURING",
|
||||
"BOLETEN",
|
||||
"DOPERWT",
|
||||
"KOOLSLA",
|
||||
"LENTEUI",
|
||||
"MEIKNOL",
|
||||
"POMPOEN",
|
||||
"RAMENAS",
|
||||
"SNIJBIET",
|
||||
"SNIJBOON",
|
||||
"TOMATEN",
|
||||
"ALFALFA",
|
||||
"ANDIJVIE",
|
||||
"ASPERGE",
|
||||
"BIETJES",
|
||||
"BOSPEEN",
|
||||
"DOPPERS",
|
||||
"KOPKOOL",
|
||||
"KROPSLA",
|
||||
"KRULSLA",
|
||||
"LAMSOOR",
|
||||
"MEIRAAP",
|
||||
"PAPRIKA",
|
||||
"RETTICH",
|
||||
"SELDERIJ",
|
||||
"SLABOON",
|
||||
"TUINSLA",
|
||||
"VELDSLA",
|
||||
"VOEDSEL",
|
||||
"WARMOES",
|
||||
"WASBOON",
|
||||
"WASPEEN",
|
||||
"WITLOOF",
|
||||
"AKKERSLA",
|
||||
"ARTISJOK",
|
||||
"ASPERGES",
|
||||
"BIESLOOK",
|
||||
"BOTERSLA",
|
||||
"BUISKOOL",
|
||||
"GROENLOF",
|
||||
"KNOFLOOK",
|
||||
"PEENTJES",
|
||||
"PEULTJES",
|
||||
"RAMMENAS",
|
||||
"RODEKOOL",
|
||||
"SPRUITEN",
|
||||
"STOOFSLA",
|
||||
"TUINKERS",
|
||||
"VELDERWT",
|
||||
"WORTELEN",
|
||||
"BROCCOLI",
|
||||
"KNOLRAAP",
|
||||
"KOOLRAAP",
|
||||
"KOOLRABI",
|
||||
"KROPKOOL",
|
||||
"PEULERWT",
|
||||
"PORTULAK",
|
||||
"RABARBER",
|
||||
"SELDERIE",
|
||||
"SLABONEN",
|
||||
"SNIJBONEN",
|
||||
"SPINAZIE",
|
||||
"STOKBOON",
|
||||
"STOKERWT",
|
||||
"TUINBOON",
|
||||
"ZUURKOOL",
|
||||
"APPELMOES",
|
||||
"BLOEMKOOL",
|
||||
"FLAGEOLET",
|
||||
"KAPUCIJNER",
|
||||
"KASTANJES",
|
||||
"KOMKOMMER",
|
||||
"PASTINAAK",
|
||||
"SEPARABEL",
|
||||
"SPITSKOOL",
|
||||
"TUINBONEN",
|
||||
"WATERKERS",
|
||||
"AUBERGINE",
|
||||
"COURGETTE",
|
||||
"DOPERWTEN",
|
||||
"IJSBERGSLA",
|
||||
"MOESKRUID",
|
||||
"POSTELEIN",
|
||||
"SLUITKOOL",
|
||||
"SPRUITJES",
|
||||
"VETSALADE",
|
||||
"WITTEKOOL",
|
||||
"AUBERGINES",
|
||||
"CHAMPIGNON",
|
||||
"DOPERWTJES",
|
||||
"KAPUCIJNERS",
|
||||
"KOOLSTRONK",
|
||||
"PETERSELIE",
|
||||
"RAAPSTELEN",
|
||||
"STOOFPEREN",
|
||||
"SUIKERMAIS",
|
||||
"VENKELKNOL",
|
||||
"WINTERPEEN",
|
||||
"WORTELTJES",
|
||||
"BOERENKOOL",
|
||||
"GROENEKOOL",
|
||||
"KABUISKOOL",
|
||||
"KASANDIJVIE",
|
||||
"KOUSENBAND",
|
||||
"WINTERPREI",
|
||||
"ARTISJOKKEN",
|
||||
"CHAMPIGNONS",
|
||||
"CITROENGRAS",
|
||||
"FLESKALEBAS",
|
||||
"KNOLSELDERIJ",
|
||||
"PUNTPAPRIKA",
|
||||
"SAVOOIEKOOL",
|
||||
"SELDERIJKNOL",
|
||||
"BLADSELDERIJ",
|
||||
"SPERZIEBOON",
|
||||
"BLADSPINAZIE",
|
||||
"BLEEKSELDERIJ",
|
||||
"CANTHARELLEN",
|
||||
"CAYENNEPEPER",
|
||||
"KNOLSELDERIE",
|
||||
"SCHORSENEREN",
|
||||
"SELDERIEKNOL",
|
||||
"SELDERIEKOOL",
|
||||
"SPERZIEBONEN",
|
||||
"STOOFASPERGE",
|
||||
"WINTERWORTEL",
|
||||
"BLADSELDERIE",
|
||||
"EIKENBLADSLA",
|
||||
"SLEEPASPERGE",
|
||||
"WINTERANDIJVIE",
|
||||
"WINTERWORTELS",
|
||||
"BLEEKSELDERIE",
|
||||
"MUSKAATPOMPOEN",
|
||||
"PRINSESSENBONEN",
|
||||
"WINTERPOSTELEIN");
|
||||
|
||||
private static final List<String> vlezen = Arrays.asList(
|
||||
"KIP",
|
||||
"HAM",
|
||||
"BASK",
|
||||
"HESP",
|
||||
"SATE",
|
||||
"BIEF",
|
||||
"PATE",
|
||||
"PORK",
|
||||
"ROTI",
|
||||
"STEW",
|
||||
"TONG",
|
||||
"ZULT",
|
||||
"GYROS",
|
||||
"KEBAK",
|
||||
"ASPIC",
|
||||
"BACON",
|
||||
"KEBAB",
|
||||
"SPIES",
|
||||
"STEAK",
|
||||
"WORST",
|
||||
"PASTEI",
|
||||
"POELET",
|
||||
"SALAMI",
|
||||
"BAKLAP",
|
||||
"GEHAKT",
|
||||
"HACHEE",
|
||||
"HAMLAP",
|
||||
"RAGOUT",
|
||||
"REERUG",
|
||||
"RIBLAP",
|
||||
"ROLHAM",
|
||||
"SAUCIJS",
|
||||
"BEENHAM",
|
||||
"BIEFLAP",
|
||||
"CERVELA",
|
||||
"GOULASH",
|
||||
"LAMSRUG",
|
||||
"PERSKOP",
|
||||
"STOVERIJ",
|
||||
"WORSTJE",
|
||||
"GEBRAAD",
|
||||
"KOTELET",
|
||||
"LAMSRIB",
|
||||
"PRESKOP",
|
||||
"REEBOUT",
|
||||
"RIBSTUK",
|
||||
"ROLLADE",
|
||||
"ROLPENS",
|
||||
"ROSBIEF",
|
||||
"SHOARMA",
|
||||
"SLAVINK",
|
||||
"SOEPKIP",
|
||||
"SPEKLAP",
|
||||
"TARTAAR",
|
||||
"HAMLAPJE",
|
||||
"METWORST",
|
||||
"MOUSSAKA",
|
||||
"OSSETONG",
|
||||
"OSSOBUCO",
|
||||
"PARMAHAM",
|
||||
"ROOKSPEK",
|
||||
"ROOMPATE",
|
||||
"ROOMSATE",
|
||||
"SJASLIEK",
|
||||
"SPARERIB",
|
||||
"TAGLIATA",
|
||||
"ZWEZERIK",
|
||||
"BERLINER",
|
||||
"BIEFSTUK",
|
||||
"ESCALOPE",
|
||||
"FRIKADEL",
|
||||
"KLAPSTUK",
|
||||
"LAMSBOUT",
|
||||
"NIERSTUK",
|
||||
"NIERTJES",
|
||||
"ROLLENDE",
|
||||
"SAUCISSE",
|
||||
"SHOWARMA",
|
||||
"STOOFLAP",
|
||||
"ANDOUILLE",
|
||||
"BALKENBRIJ",
|
||||
"CASSEROLE",
|
||||
"CASSOULET",
|
||||
"KALFSTONG",
|
||||
"KIPBURGER",
|
||||
"LAMSZADEL",
|
||||
"LEVERKAAS",
|
||||
"OSSENTONG",
|
||||
"EENDVOGEL",
|
||||
"ENTRECOTE",
|
||||
"FRICASSEE",
|
||||
"GALANTINE",
|
||||
"GEHAKTBAL",
|
||||
"HAMBURGER",
|
||||
"HOOFDKAAS",
|
||||
"KARBONADE",
|
||||
"KATENSPEK",
|
||||
"KNAKWORST",
|
||||
"OSSENHAAS",
|
||||
"PLOKWORST",
|
||||
"ROASTBEEF",
|
||||
"ROOKWORST",
|
||||
"RUNDERLAP",
|
||||
"RUNDVLEES",
|
||||
"SCHNITZEL",
|
||||
"SPARERIBS",
|
||||
"SUDDERLAP",
|
||||
"SUKADELAP",
|
||||
"TOURNEDOS",
|
||||
"UIERBOORD",
|
||||
"BLINDEVINK",
|
||||
"BLOEDWORST",
|
||||
"EENDENBOUT",
|
||||
"FRICANDEAU",
|
||||
"HAZENPEPER",
|
||||
"KALFSLAPJE",
|
||||
"LAMSGEHAKT",
|
||||
"LAMSOESTER",
|
||||
"LEVERWORST",
|
||||
"PEKELVLEES",
|
||||
"PEPERSTEAK",
|
||||
"SUKADESTUK",
|
||||
"WILDPASTEI",
|
||||
"BOERENPATE",
|
||||
"BRAADVLEES",
|
||||
"BRAADWORST",
|
||||
"KIPROLLADE",
|
||||
"LENDENSTUK",
|
||||
"OSSENVLEES",
|
||||
"REEGEBRAAD",
|
||||
"RUNDERHAAS",
|
||||
"STOOFLAPJE",
|
||||
"GEHAKTBROOD",
|
||||
"LAMSSCHOTEL",
|
||||
"LEVERPASTEI",
|
||||
"TONGENWORST",
|
||||
"VOGELNESTJE",
|
||||
"CASSELERRIB",
|
||||
"KALFSGEHAKT",
|
||||
"KALFSOESTER",
|
||||
"KASSELERRIB",
|
||||
"LAMSKOTELET",
|
||||
"RUNDERLEVER",
|
||||
"SCHAPENBOUT",
|
||||
"KALFSROLLADE",
|
||||
"KIPSCHNITZEL",
|
||||
"RIBKARBONADE",
|
||||
"GEHAKTBALLEN",
|
||||
"KALFSKOTELET",
|
||||
"RUNDERGEHAKT",
|
||||
"VARKENSLEVER",
|
||||
"VARKENSVLEES",
|
||||
"BOOMSTAMMETJE",
|
||||
"CHATEAUBRIAND",
|
||||
"LENDEBIEFSTUK",
|
||||
"GEHAKTSCHOTEL",
|
||||
"HAASKARBONADE",
|
||||
"LAMSKARBONADE",
|
||||
"RUNDERROLLADE",
|
||||
"VARKENSGEHAKT",
|
||||
"VARKENSOESTER",
|
||||
"KALFSFRICANDEAU",
|
||||
"WIENERSCHNITZEL",
|
||||
"PAARDENROOKVLEES",
|
||||
"STRUISVOGELBIEFSTUK");
|
||||
|
||||
private static final List<String> sauzen = Arrays.asList(
|
||||
"AIOLI",
|
||||
"ANDALOUSESAUS",
|
||||
"BEARNAISESAUS",
|
||||
"BECHAMELSAUS",
|
||||
"BLACKWELLSAUS",
|
||||
"BOLOGNESESAUS",
|
||||
"CHUTNEY",
|
||||
"CHIMICHURRI",
|
||||
"COCKTAILSAUS",
|
||||
"CURRY",
|
||||
"CURRYKETCHUP",
|
||||
"DIPSAUS",
|
||||
"DRESSING",
|
||||
"FRITESSAUS",
|
||||
"GUACAMOLE",
|
||||
"GROENE SAUS",
|
||||
"HARISSA",
|
||||
"HOLLANDAISESAUS",
|
||||
"CHINESE HOISINSAUS",
|
||||
"HUMMUS",
|
||||
"JOPPIESAUS",
|
||||
"KAASSAUS",
|
||||
"KETJAP",
|
||||
"KNOFLOOKSAUS",
|
||||
"MADERASAUS",
|
||||
"MAMMOETSAUS",
|
||||
"MANGOCHUTNEY",
|
||||
"MAYONAISE",
|
||||
"MOJO",
|
||||
"MOSTERD",
|
||||
"OESTERSAUS",
|
||||
"PESTO",
|
||||
"PINDASAUS",
|
||||
"PICCALILLY",
|
||||
"PIRIPIRI",
|
||||
"ROUX",
|
||||
"SALSA",
|
||||
"SALSA VERDE",
|
||||
"SAMBAL",
|
||||
"SAMOERAISAUS",
|
||||
"SATESAUS",
|
||||
"ROQUEFORTSAUS",
|
||||
"STOOFVLEESSAUS",
|
||||
"STROGANOFFSAUS",
|
||||
"TABASCO",
|
||||
"TAHINI",
|
||||
"TAPENADE",
|
||||
"TARTAARSAUS",
|
||||
"TOMATENKETCHUP",
|
||||
"TOMATENSAUS",
|
||||
"TOMOTTOSAUS",
|
||||
"TZATZIKI",
|
||||
"VINAIGRETTE",
|
||||
"VISSAUS",
|
||||
"VLAMMENSAUS",
|
||||
"VLEESJUS",
|
||||
"WHISKYSAUS",
|
||||
"WITTE SAUS",
|
||||
"WORCESTERSAUS",
|
||||
"ZULUSAUS");
|
||||
|
||||
private static final String GOAL = "818028943427c1157af2aa007a4ab802cb53312a";
|
||||
|
||||
public static void main(String[] args) throws NoSuchAlgorithmException {
|
||||
System.out.println(str2hash("92.111.40.218 AARDAPPEL GROENTE VLEES SAUS"));
|
||||
|
||||
for (String aardappel : aardappels) {
|
||||
System.out.println("@" + aardappel);
|
||||
for (String groente : groentes) {
|
||||
for (String vlees : vlezen) {
|
||||
for (String saus : sauzen) {
|
||||
if (str2hash(String.format("92.111.40.218 %s %s %s %s", aardappel, groente, vlees, saus)).equals(GOAL)) {
|
||||
System.out.println(aardappel);
|
||||
System.out.println(groente);
|
||||
System.out.println(vlees);
|
||||
System.out.println(saus);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String str2hash(String s) throws NoSuchAlgorithmException {
|
||||
// MessageDigest md5 = MessageDigest.getInstance("SHA256");
|
||||
// md5.update(s.getBytes());
|
||||
//byte[] digest = md5.digest();
|
||||
// return String.format("%032x", new BigInteger(1, md5.digest()));
|
||||
|
||||
byte[] digest = Ripemd160.getHash(s.getBytes());
|
||||
return String.format("%032x", new BigInteger(1, digest));
|
||||
|
||||
}
|
||||
}
|
||||
157
src/main/java/hash/Ripemd160.java
Normal file
157
src/main/java/hash/Ripemd160.java
Normal file
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Bitcoin cryptography library
|
||||
* Copyright (c) Project Nayuki
|
||||
*
|
||||
* https://www.nayuki.io/page/bitcoin-cryptography-library
|
||||
* https://github.com/nayuki/Bitcoin-Cryptography-Library
|
||||
*/
|
||||
|
||||
package hash;
|
||||
|
||||
import static java.lang.Integer.rotateLeft;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
/**
|
||||
* Computes the RIPEMD-160 hash of an array of bytes. Not instantiable.
|
||||
*/
|
||||
public final class Ripemd160 {
|
||||
|
||||
private static final int BLOCK_LEN = 64; // In bytes
|
||||
|
||||
|
||||
|
||||
/*---- Static functions ----*/
|
||||
|
||||
/**
|
||||
* Computes and returns a 20-byte (160-bit) hash of the specified binary message.
|
||||
* Each call will return a new byte array object instance.
|
||||
* @param msg the message to compute the hash of
|
||||
* @return a 20-byte array representing the message's RIPEMD-160 hash
|
||||
* @throws NullPointerException if the message is {@code null}
|
||||
*/
|
||||
public static byte[] getHash(byte[] msg) {
|
||||
// Compress whole message blocks
|
||||
Objects.requireNonNull(msg);
|
||||
int[] state = {0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0};
|
||||
int off = msg.length / BLOCK_LEN * BLOCK_LEN;
|
||||
compress(state, msg, off);
|
||||
|
||||
// Final blocks, padding, and length
|
||||
byte[] block = new byte[BLOCK_LEN];
|
||||
System.arraycopy(msg, off, block, 0, msg.length - off);
|
||||
off = msg.length % block.length;
|
||||
block[off] = (byte)0x80;
|
||||
off++;
|
||||
if (off + 8 > block.length) {
|
||||
compress(state, block, block.length);
|
||||
Arrays.fill(block, (byte)0);
|
||||
}
|
||||
long len = (long)msg.length << 3;
|
||||
for (int i = 0; i < 8; i++)
|
||||
block[block.length - 8 + i] = (byte)(len >>> (i * 8));
|
||||
compress(state, block, block.length);
|
||||
|
||||
// Int32 array to bytes in little endian
|
||||
byte[] result = new byte[state.length * 4];
|
||||
for (int i = 0; i < result.length; i++)
|
||||
result[i] = (byte)(state[i / 4] >>> (i % 4 * 8));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*---- Private functions ----*/
|
||||
|
||||
private static void compress(int[] state, byte[] blocks, int len) {
|
||||
if (len % BLOCK_LEN != 0)
|
||||
throw new IllegalArgumentException();
|
||||
for (int i = 0; i < len; i += BLOCK_LEN) {
|
||||
|
||||
// Message schedule
|
||||
int[] schedule = new int[16];
|
||||
for (int j = 0; j < BLOCK_LEN; j++)
|
||||
schedule[j / 4] |= (blocks[i + j] & 0xFF) << (j % 4 * 8);
|
||||
|
||||
// The 80 rounds
|
||||
int al = state[0], ar = state[0];
|
||||
int bl = state[1], br = state[1];
|
||||
int cl = state[2], cr = state[2];
|
||||
int dl = state[3], dr = state[3];
|
||||
int el = state[4], er = state[4];
|
||||
for (int j = 0; j < 80; j++) {
|
||||
int temp;
|
||||
temp = rotateLeft(al + f(j, bl, cl, dl) + schedule[RL[j]] + KL[j / 16], SL[j]) + el;
|
||||
al = el;
|
||||
el = dl;
|
||||
dl = rotateLeft(cl, 10);
|
||||
cl = bl;
|
||||
bl = temp;
|
||||
temp = rotateLeft(ar + f(79 - j, br, cr, dr) + schedule[RR[j]] + KR[j / 16], SR[j]) + er;
|
||||
ar = er;
|
||||
er = dr;
|
||||
dr = rotateLeft(cr, 10);
|
||||
cr = br;
|
||||
br = temp;
|
||||
}
|
||||
int temp = state[1] + cl + dr;
|
||||
state[1] = state[2] + dl + er;
|
||||
state[2] = state[3] + el + ar;
|
||||
state[3] = state[4] + al + br;
|
||||
state[4] = state[0] + bl + cr;
|
||||
state[0] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static int f(int i, int x, int y, int z) {
|
||||
assert 0 <= i && i < 80;
|
||||
if (i < 16) return x ^ y ^ z;
|
||||
if (i < 32) return (x & y) | (~x & z);
|
||||
if (i < 48) return (x | ~y) ^ z;
|
||||
if (i < 64) return (x & z) | (y & ~z);
|
||||
return x ^ (y | ~z);
|
||||
}
|
||||
|
||||
|
||||
/*---- Class constants ----*/
|
||||
|
||||
private static final int[] KL = {0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E}; // Round constants for left line
|
||||
private static final int[] KR = {0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000}; // Round constants for right line
|
||||
|
||||
private static final int[] RL = { // Message schedule for left line
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
|
||||
3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
|
||||
1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
|
||||
4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13};
|
||||
|
||||
private static final int[] RR = { // Message schedule for right line
|
||||
5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
|
||||
6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
|
||||
15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
|
||||
8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
|
||||
12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11};
|
||||
|
||||
private static final int[] SL = { // Left-rotation for left line
|
||||
11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
|
||||
7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
|
||||
11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
|
||||
11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
|
||||
9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6};
|
||||
|
||||
private static final int[] SR = { // Left-rotation for right line
|
||||
8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
|
||||
9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
|
||||
9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
|
||||
15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
|
||||
8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11};
|
||||
|
||||
|
||||
|
||||
/*---- Miscellaneous ----*/
|
||||
|
||||
private Ripemd160() {} // Not instantiable
|
||||
|
||||
}
|
||||
110
src/main/java/lingbeek/LingbeekBirthday.java
Normal file
110
src/main/java/lingbeek/LingbeekBirthday.java
Normal file
@@ -0,0 +1,110 @@
|
||||
package lingbeek;
|
||||
|
||||
public class LingbeekBirthday {
|
||||
|
||||
public static void main(String[] args) {
|
||||
puzzel2();
|
||||
}
|
||||
|
||||
public static void puzzel2() {
|
||||
String getal = "718221388361140459273845060881935892202463276395185767703202931844979553404160205473165154807716047721360387093977836573461869078903866177517609401066995933056937641429822696075026042708998059408245652909668617234963230159004523361922445118939939425246591630178718041250790393911485448198886968520292419143016465413331107690345523662227756770090925212522853663683587115889316348412482481435850444765959813967931241192116530004379144859416555126822428355054939181176327053123262208427234806432042801083591095061910485620434178736995513637382640868397650863502002563325892782309465718819728901067970753170885152774767519324699535246704946474908543771629786109206017292416056868587459999802797209566648129905865161668379298914522843344050237568463975430764997329482907540684058754472128156434536314672907436279703636811174767549267019613087844658170533886775690229572515615825038183957272309738331226296504597797142318758354872756609064068357178635668850213496389401828224429501408463336955800619499038431637344375259571562615451815648323843802309260072491322883789721070700813804934145478570772226861124445569426679549892906002113429532043386726315834027769929259745736978918570066127364472548758413479889126261314951579365554009611739580747480367882483804688653102749852533773280287182213883611404592738450608819358922024632763951857677032029318449795534041602054731651548077160477213603870939778365734618690789038661775176094010669959330569376414298226960750260427089980594082456529096686172349632301590045233619224451189399394252465916301787180412507903939114854481988869685202924191430164654133311076903455236622277567700909252125228536636835871158893163484124824814358504447659598139679312411921165300043791448594165551268224283550549391811763270531232622084272348064320428010835910950619104856204341787369955136373826408683976508635020025633258927823094657188197289010679707531708851527747675193246995352467049464749085437716297861092060172924160568685874599998027972095666481299058651616683792989145228433440502375684639754307649973294829075406840587544721281564345363146729074362797036368111747675492670196130878446581705338867756902295725156158250381839572723097383312262965045977971423187583548727566090640683571786356688502134963894018282244295014084633369558006194990384316373443752595715626154518156483238438023092600724913228837897210707008138049341454785707722268611244455694266795498929";
|
||||
getal += "0600211342953204338672631583402776992925974573697891857006612736447254875841347988912626131495157936555400961173958074748036788248380468865310274985253377328028718221388361140459273845060881935892202463276395185767703202931844979553404160205473165154807716047721360387093977836573461869078903866177517609401066995933056937641429822696075026042708998059408245652909668617234963230159004523361922445118939939425246591630178718041250790393911485448198886968520292419143016465413331107690345523662227756770090925212522853663683587115889316348412482481435850444765959813967931241192116530004379144859416555126822428355054939181176327053123262208427234806432042801083591095061910485620434178736995513637382640868397650863502002563325892782309465718819728901067970753170885152774767519324699535246704946474908543771629786109206017292416056868587459999802797209566648129905865161668379298914522843344050237568463975430764997329482907540684058754472128156434536314672907436279703636811174767549267019613087844658170533886775690229572515615825038183957272309738331226296504597797142318758354872756609064068357178635668850213496389401828224429501408463336955800619499038431637344375259571562615451815648323843802309260072491322883789721070700813804934145478570772226861124445569426679549892906002113429532043386726315834027769929259745736978918570066127364472548758413479889126261314951579365554009611739580747480367882483804688653102749852533773280287182213883611404592738450608819358922024632763951857677032029318449795534041602054731651548077160477213603870939778365734618690789038661775176094010669959330569376414298226960750260427089980594082456529096686172349632301590045233619224451189399394252465916301787180412507903939114854481988869685202924191430164654133311076903455236622277567700909252125228536636835871158893163484124824814358504447659598139679312411921165300043791448594165551268224283550549391811763270531232622084272348064320428010835910950619104856204341787369955136373826408683976508635020025633258927823094657188197289010679707531708851527747675193246995352467049464749085437716297861092060172924160568685874599998027972095666481299058651616683792989145228433440502375684639754307649973294829075406840587544721281564345363146729074362797036368111747675492670196130878446581705338867756902295725156158250381839572723097383312262965045977971423187583548727566090640683571786356688502134963894018282";
|
||||
getal += "2442950140846333695580061949903843163734437525957156261545181564832384380230926007249132288378972107070081380493414547857077222686112444556942667954989290600211342953204338672631583402776992925";
|
||||
|
||||
char[] chars = getal.toCharArray();
|
||||
long max = 0;
|
||||
for (int i=0; i < (chars.length - 12); i++) {
|
||||
long prod = 1;
|
||||
for (int j=0; j<13; j++) {
|
||||
prod *= (chars[i+j] - '0');
|
||||
if (prod > max) max = prod;
|
||||
}
|
||||
System.out.println(prod);
|
||||
}
|
||||
|
||||
System.out.println(max);
|
||||
}
|
||||
public static void puzzel1() {
|
||||
|
||||
int[][] grid = {
|
||||
{34,9,22,97,58,34,9,40,44,74,4,4,7,68,42,32,40,77,83,8},
|
||||
{49,49,99,40,37,83,38,47,60,87,37,40,98,45,69,48,4,46,62,0},
|
||||
{83,49,53,75,41,79,34,29,95,73,40,67,45,88,50,5,49,35,56,64},
|
||||
{42,70,94,25,4,60,33,42,69,24,68,46,3,52,46,73,57,2,56,93},
|
||||
{22,53,36,73,43,67,65,99,43,92,56,14,22,40,40,28,66,55,35,80},
|
||||
{24,47,52,60,99,5,44,32,44,74,55,45,68,56,84,20,54,37,32,40},
|
||||
{52,28,83,28,64,25,67,30,96,58,40,67,49,44,70,66,38,58,64,70},
|
||||
{67,56,22,68,2,62,32,20,94,65,94,59,65,8,40,93,66,49,94,23},
|
||||
{24,84,48,4,66,75,99,26,97,37,70,68,96,86,34,88,54,89,65,72},
|
||||
{23,56,25,9,74,0,76,44,20,44,54,34,50,63,55,97,54,53,55,94},
|
||||
{68,37,45,28,22,74,53,67,34,93,25,80,4,62,36,34,9,45,46,92},
|
||||
{36,59,34,42,96,54,53,47,44,48,88,24,30,37,41,24,56,29,84,47},
|
||||
{86,46,14,77,54,73,89,7,4,41,44,57,41,60,23,48,43,44,37,48},
|
||||
{39,80,83,68,4,94,47,69,28,75,92,35,86,42,37,77,4,89,44,40},
|
||||
{4,42,8,85,83,54,99,36,7,97,47,52,36,26,26,79,55,27,98,66},
|
||||
{88,56,68,87,47,62,20,72,5,46,55,67,46,44,32,52,65,95,45,69},
|
||||
{4,42,36,75,58,24,59,33,24,94,72,38,8,46,29,52,40,62,76,56},
|
||||
{20,69,56,43,72,50,25,88,54,62,99,69,82,67,49,84,74,44,56,36},
|
||||
{20,75,54,29,68,53,90,3,74,53,49,73,48,86,83,36,25,47,4,14},
|
||||
{3,70,44,73,85,43,44,69,36,82,55,48,63,15,42,3,99,29,67,48}
|
||||
};
|
||||
int max = 0, result;
|
||||
|
||||
for (int row = 0; row < grid.length; row++ ) {
|
||||
for (int col = 0; col < grid[row].length; col++) {
|
||||
if (col < 17) {
|
||||
result = grid[row][col] * grid [row][col+1] * grid[row][col+2] * grid[row][col+3];
|
||||
if (result > max) {
|
||||
System.out.println("["+row+"]["+col+"] 1");
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
if (row < 17) {
|
||||
result = grid[row][col] * grid [row+1][col] * grid[row+2][col] * grid[row+3][col];
|
||||
if (result > max) {
|
||||
System.out.println("["+row+"]["+col+"] 2 " + grid[row][col]);
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
|
||||
if (col < 17 && row > 2) {
|
||||
result = grid[row][col] * grid [row-1][col+1] * grid[row-2][col+2] * grid[row-3][col+3];
|
||||
if (result > max) {
|
||||
System.out.println("["+row+"]["+col+"] 3");
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
|
||||
if (col < 17 && row < 17) {
|
||||
result = grid[row][col] * grid [row+1][col+1] * grid[row+2][col+2] * grid[row+3][col+3];
|
||||
if (result > max) {
|
||||
System.out.println("["+row+"]["+col+"] 4");
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
|
||||
if (col > 2 && row < 17) {
|
||||
result = grid[row][col] * grid [row+1][col-1] * grid[row+2][col-2] * grid[row+3][col-3];
|
||||
if (result > max) {
|
||||
System.out.println("["+row+"]["+col+"] 5");
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
|
||||
if (col > 2 && row > 2) {
|
||||
result = grid[row][col] * grid [row-1][col-1] * grid[row-2][col-2] * grid[row-3][col-3];
|
||||
if (result > max) {
|
||||
System.out.println("["+row+"]["+col+"]");
|
||||
max = result;
|
||||
}
|
||||
}
|
||||
|
||||
//System.out.print(grid[row][col]);
|
||||
}
|
||||
//System.out.println();
|
||||
}
|
||||
|
||||
System.out.println(max);
|
||||
|
||||
}
|
||||
}
|
||||
196
src/main/java/logistics/LogisticsPuzzle.java
Normal file
196
src/main/java/logistics/LogisticsPuzzle.java
Normal file
@@ -0,0 +1,196 @@
|
||||
package logistics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
//interface Node {
|
||||
// boolean visited = false;
|
||||
// void addNode(Node node, int distance);
|
||||
// Map<Node, Integer> getNodes();
|
||||
// String getName();
|
||||
//}
|
||||
|
||||
abstract class Node {
|
||||
private String name;
|
||||
private Map<Node, Integer> connectedNodes = new HashMap<>();
|
||||
private boolean visited;
|
||||
|
||||
public void addNode(Node node, int distance) {
|
||||
connectedNodes.put(node, distance);
|
||||
}
|
||||
|
||||
public Map<Node, Integer> getNodes() {
|
||||
return connectedNodes;
|
||||
}
|
||||
|
||||
public boolean isVisited() {
|
||||
return visited;
|
||||
}
|
||||
|
||||
public void setVisited(boolean visited) {
|
||||
this.visited = visited;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
void enter(Car car) {
|
||||
this.visited = true;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
class Stop extends Node {
|
||||
|
||||
Stop(String name) {
|
||||
this.setName(name);
|
||||
}
|
||||
}
|
||||
|
||||
class GasStation extends Node {
|
||||
private int gasAdded;
|
||||
|
||||
GasStation(String name, int gasAdded) {
|
||||
this.setName(name);
|
||||
this.gasAdded = gasAdded;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enter(Car car) {
|
||||
super.enter(car);
|
||||
car.addGas(this.gasAdded);
|
||||
}
|
||||
}
|
||||
|
||||
class Car {
|
||||
private int fuel;
|
||||
private int distance = 0;
|
||||
private Node position;
|
||||
|
||||
public void addGas(int gasAdded) {
|
||||
this.fuel += gasAdded;
|
||||
}
|
||||
|
||||
public void driveTo(Node node, int distance) {
|
||||
this.position = node;
|
||||
this.fuel -= distance;
|
||||
this.distance += distance;
|
||||
node.enter(this);
|
||||
}
|
||||
|
||||
public int getFuel() {
|
||||
return fuel;
|
||||
}
|
||||
|
||||
public void setFuel(int fuel) {
|
||||
this.fuel = fuel;
|
||||
}
|
||||
|
||||
public Node getPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
public void setPosition(Node position) {
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
public int getDistance() {
|
||||
return distance;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class LogisticsPuzzle {
|
||||
static Car car = new Car();
|
||||
static List<Node> allNodes;
|
||||
public static void main(String[] args) {
|
||||
car.setFuel(30);
|
||||
// Node s1 = new Stop("s1");
|
||||
// Node s2 = new Stop("s2");
|
||||
// Node s3 = new Stop("s3");
|
||||
// Node g1 = new GasStation("g1", 30);
|
||||
// s1.addNode(s2, 10);
|
||||
// s1.addNode(s3, 5);
|
||||
// s2.addNode(s3, 20);
|
||||
// s3.addNode(s1, 5);
|
||||
// s3.addNode(g1, 10);
|
||||
// g1.addNode(s2, 12);
|
||||
|
||||
Node node;
|
||||
for (Integer n = 1; n <= 10; n++) {
|
||||
if (new Random().nextInt(5) == 0) {
|
||||
node = new GasStation(n.toString(), 20 + new Random().nextInt(25));
|
||||
} else {
|
||||
node = new Stop(n.toString());
|
||||
}
|
||||
allNodes.add(node);
|
||||
}
|
||||
|
||||
//allNodes = Arrays.asList(new Node[] { s1, s2, s3, g1} );
|
||||
|
||||
// car.driveTo(s1, 0);
|
||||
|
||||
System.out.println("Position Fuel Dist Nodes");
|
||||
|
||||
printState();
|
||||
|
||||
do {
|
||||
Map<Node,Integer> nodes = car.getPosition().getNodes();
|
||||
Iterator<Node> iterator = nodes.keySet().iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
/*Node*/ node = iterator.next();
|
||||
if (nodes.get(node) > car.getFuel()) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
if (nodes.isEmpty()) {
|
||||
System.out.println("Geen benzine meer.");
|
||||
break;
|
||||
}
|
||||
|
||||
Random random = new Random();
|
||||
List<Node> keys = new ArrayList<Node>(nodes.keySet());
|
||||
Node nextStop = keys.get( random.nextInt(keys.size()) );
|
||||
int distance = nodes.get(nextStop);
|
||||
|
||||
car.driveTo(nextStop, distance);
|
||||
printState();
|
||||
if (allNodesVisited()) {
|
||||
System.out.println("Klaar");
|
||||
break;
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
|
||||
static boolean allNodesVisited() {
|
||||
boolean allVisited = true;
|
||||
for (Node node : allNodes) {
|
||||
// System.out.println(node.getName() + node.isVisited());
|
||||
allVisited = allVisited && node.isVisited();
|
||||
}
|
||||
return allVisited;
|
||||
|
||||
}
|
||||
|
||||
static void printState() {
|
||||
System.out.print(car.getPosition().getName() + " " + car.getFuel() + " " + car.getDistance() + " ");
|
||||
for (Node node : car.getPosition().getNodes().keySet()) {
|
||||
System.out.print(node.getName() + " ");
|
||||
}
|
||||
System.out.println();
|
||||
};
|
||||
}
|
||||
132
src/main/java/numbersquare/NumberSquarePuzzle.java
Normal file
132
src/main/java/numbersquare/NumberSquarePuzzle.java
Normal file
@@ -0,0 +1,132 @@
|
||||
package numbersquare;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
enum Direction {
|
||||
UP, LEFT, DOWN, RIGHT;
|
||||
}
|
||||
|
||||
public class NumberSquarePuzzle {
|
||||
|
||||
public static final int SIZE = 7;
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
int [][] square = {
|
||||
// {4,2,2,3,3},
|
||||
// {2,2,2,2,2},
|
||||
// {3,2,2,2,2},
|
||||
// {1,2,3,2,3},
|
||||
// {3,2,2,2,0}
|
||||
{6,3,2,4,6,2,5},
|
||||
{3,5,2,4,4,4,1},
|
||||
{3,3,2,3,3,4,2},
|
||||
{3,4,1,2,2,5,3},
|
||||
{4,4,4,2,3,2,4},
|
||||
{2,5,4,2,3,2,5},
|
||||
{3,5,2,1,4,4,0}
|
||||
};
|
||||
|
||||
// 6 (0,0) => 3 (6,0)
|
||||
// 3 (6,0) => 1 (6,3)
|
||||
// 1 (6,3) => 2 (6,2)
|
||||
// 2 (6,2) => 4 (4,2)
|
||||
// 4 (4,2) => 2 (0,2)
|
||||
// 2 (0,2) => 2 (2,2)
|
||||
// 2 (2,2) => 3 (2,0)
|
||||
// 3 (2,0) => 2 (5,0)
|
||||
// 2 (5,0) => 4 (5,2)
|
||||
// 4 (5,2) => 2 (1,2)
|
||||
// 2 (1,2) => 4 (1,4)
|
||||
// 4 (1,4) => 3 (1,0)
|
||||
// 3 (1,0) => 4 (4,0)
|
||||
// 4 (4,0) => 3 (4,4)
|
||||
// 3 (4,4) => 4 (4,1)
|
||||
// 4 (4,1) => 2 (4,5)
|
||||
// 2 (4,5) => 4 (6,5)
|
||||
// 4 (6,5) => 5 (6,1)
|
||||
// 5 (6,1) => 0 (6,6)
|
||||
|
||||
// 6 (0,0) => 3 (6,0)
|
||||
// 3 (6,0) => 1 (6,3)
|
||||
// 1 (6,3) => 2 (6,2)
|
||||
// 2 (6,2) => 4 (4,2)
|
||||
// 4 (4,2) => 2 (0,2)
|
||||
// 2 (0,2) => 2 (2,2)
|
||||
// 2 (2,2) => 3 (2,0)
|
||||
// 3 (2,0) => 2 (5,0)
|
||||
// 2 (5,0) => 4 (5,2)
|
||||
// 4 (5,2) => 2 (1,2)
|
||||
// 2 (1,2) => 3 (1,0)
|
||||
// 3 (1,0) => 4 (4,0)
|
||||
// 4 (4,0) => 3 (4,4)
|
||||
// 3 (4,4) => 4 (4,1)
|
||||
// 4 (4,1) => 2 (4,5)
|
||||
// 2 (4,5) => 4 (2,5)
|
||||
// 4 (2,5) => 4 (6,5)
|
||||
// 4 (6,5) => 5 (6,1)
|
||||
// 5 (6,1) => 0 (6,6)
|
||||
|
||||
boolean [][] visited;
|
||||
|
||||
int posRow;
|
||||
int posCol;
|
||||
int curVal;
|
||||
|
||||
int attempt = 0;
|
||||
|
||||
do {
|
||||
attempt++;
|
||||
posRow = 0;
|
||||
posCol = 0;
|
||||
List<Direction> directions;
|
||||
visited = new boolean[SIZE][SIZE];
|
||||
|
||||
do {
|
||||
directions = new ArrayList<>();
|
||||
visited[posRow][posCol] = true;
|
||||
|
||||
curVal = square[posRow][posCol];
|
||||
|
||||
if ((posCol + curVal) < SIZE) {
|
||||
directions.add(Direction.RIGHT);
|
||||
}
|
||||
if ((posCol - curVal) >= 0) {
|
||||
directions.add(Direction.LEFT);
|
||||
}
|
||||
if ((posRow + curVal) < SIZE) {
|
||||
directions.add(Direction.DOWN);
|
||||
}
|
||||
if ((posRow - curVal) >= 0) {
|
||||
directions.add(Direction.UP);
|
||||
}
|
||||
|
||||
Direction direction = directions.get(new Random().nextInt(directions.size()));
|
||||
|
||||
System.out.print(curVal + " (" + posRow + "," + posCol + ") => ");
|
||||
|
||||
if (direction == Direction.RIGHT) {
|
||||
posCol += curVal;
|
||||
}
|
||||
if (direction == Direction.LEFT) {
|
||||
posCol -= curVal;
|
||||
}
|
||||
if (direction == Direction.DOWN) {
|
||||
posRow += curVal;
|
||||
}
|
||||
if (direction == Direction.UP) {
|
||||
posRow -= curVal;
|
||||
}
|
||||
|
||||
System.out.println(square[posRow][posCol] + " (" + posRow + "," + posCol + ")");
|
||||
|
||||
if (visited[posRow][posCol]) {
|
||||
System.out.println("Visited " + attempt);
|
||||
break;
|
||||
}
|
||||
} while (posRow != (SIZE - 1) || posCol != (SIZE - 1));
|
||||
} while (posRow != (SIZE - 1) || posCol != (SIZE - 1));
|
||||
}
|
||||
}
|
||||
61
src/main/java/polygons/PolygonConverter.java
Normal file
61
src/main/java/polygons/PolygonConverter.java
Normal file
@@ -0,0 +1,61 @@
|
||||
package polygons;
|
||||
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.locationtech.jts.geom.Coordinate;
|
||||
import org.locationtech.jts.geom.Geometry;
|
||||
import org.locationtech.jts.geom.MultiPolygon;
|
||||
import org.wololo.geojson.Feature;
|
||||
import org.wololo.geojson.FeatureCollection;
|
||||
import org.wololo.jts2geojson.GeoJSONReader;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
public class PolygonConverter {
|
||||
private static final String prefix = "D:\\Nextcloud\\Geocaching\\polygons\\";
|
||||
private static final String outputFolder = prefix + "new\\";
|
||||
private static final ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
private static final GeoJSONReader reader = new GeoJSONReader();
|
||||
private static final boolean USE_NUMERIC_FILENAMES = true;
|
||||
private static int FILE_COUNTER = 0;
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
FileInputStream inputStream = new FileInputStream(prefix + "russia_counties.GeoJson");
|
||||
|
||||
FeatureCollection featureCollection = objectMapper.readValue(inputStream, FeatureCollection.class);
|
||||
|
||||
for (Feature feature : featureCollection.getFeatures()) {
|
||||
String baseName = (String) feature.getProperties().get("name");
|
||||
|
||||
MultiPolygon multiPolygon = (MultiPolygon) reader.read(feature.getGeometry());
|
||||
if (multiPolygon.getNumGeometries() > 1) {
|
||||
for (int geomNr = 0; geomNr < multiPolygon.getNumGeometries(); geomNr++) {
|
||||
Geometry geometry = multiPolygon.getGeometryN(geomNr);
|
||||
String fileName = (USE_NUMERIC_FILENAMES ? Integer.toString(++FILE_COUNTER) : baseName + "_" + (geomNr + 1)) + ".txt";
|
||||
processPolygon(geometry, baseName, fileName);
|
||||
}
|
||||
} else {
|
||||
Geometry geometry = multiPolygon.getGeometryN(0);
|
||||
String fileName = (USE_NUMERIC_FILENAMES ? Integer.toString(++FILE_COUNTER) : baseName) + ".txt";
|
||||
processPolygon(geometry, baseName, fileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void processPolygon(Geometry geometry, String name, String fileName) throws IOException {
|
||||
System.out.println(fileName);
|
||||
try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFolder + fileName), "utf-8"))) {
|
||||
writer.write("# GsakName=" + name + "\n" +
|
||||
"# This Country polygon is based on data (c) OpenStreetMap contributors\n" +
|
||||
"# The OpenStreetMap data is made available under the Open Database License, see http://www.openstreetmap.org/copyright\n" +
|
||||
"# This polygon file is made available under the same Open Database License: http://opendatacommons.org/licenses/odbl/1.0/.\n");
|
||||
// Geometry reducedPolygon = reducePolygon(polygon);
|
||||
//geometry.getBoundary()
|
||||
for (Coordinate coordinate : geometry.getCoordinates()) {
|
||||
writer.write(coordinate.y + "," + coordinate.x);
|
||||
writer.write("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
76
src/main/java/setGame/Card.java
Normal file
76
src/main/java/setGame/Card.java
Normal file
@@ -0,0 +1,76 @@
|
||||
package setGame;
|
||||
|
||||
class Card {
|
||||
P1 p1;
|
||||
P2 p2;
|
||||
P3 p3;
|
||||
P4 p4;
|
||||
P5 p5;
|
||||
|
||||
public P1 getP1() {
|
||||
return p1;
|
||||
}
|
||||
|
||||
public void setP1(P1 p1) {
|
||||
this.p1 = p1;
|
||||
}
|
||||
|
||||
public P2 getP2() {
|
||||
return p2;
|
||||
}
|
||||
|
||||
public void setP2(P2 p2) {
|
||||
this.p2 = p2;
|
||||
}
|
||||
|
||||
public P3 getP3() {
|
||||
return p3;
|
||||
}
|
||||
|
||||
public void setP3(P3 p3) {
|
||||
this.p3 = p3;
|
||||
}
|
||||
|
||||
|
||||
public P4 getP4() {
|
||||
return p4;
|
||||
}
|
||||
|
||||
public void setP4(P4 p4) {
|
||||
this.p4 = p4;
|
||||
}
|
||||
|
||||
public P5 getP5() {
|
||||
return p5;
|
||||
}
|
||||
|
||||
public void setP5(P5 p5) {
|
||||
this.p5 = p5;
|
||||
}
|
||||
|
||||
public Card(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
||||
super();
|
||||
this.p1 = p1;
|
||||
this.p2 = p2;
|
||||
this.p3 = p3;
|
||||
this.p4 = p4;
|
||||
this.p5 = p5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
Card that = (Card) o;
|
||||
return this.p1 == that.p1 && this.p2 == that.p2 && this.p3 == that.p3 && this.p4 == that.p4 && this.p5 == that.p5;
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 1;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return p1 + " " + p2 + " " + p3 + " " + p4 + " " + p5;
|
||||
}
|
||||
public static Card randomCard() {
|
||||
return new Card(P1.randomP1(), P2.randomP2(), P3.randomP3(), P4.randomP4(), P5.randomP5());
|
||||
}
|
||||
}
|
||||
18
src/main/java/setGame/P1.java
Normal file
18
src/main/java/setGame/P1.java
Normal file
@@ -0,0 +1,18 @@
|
||||
package setGame;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
enum P1 {
|
||||
A1, A2, A3, A4, A5;
|
||||
|
||||
private static final List<P1> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
|
||||
private static final int SIZE = VALUES.size();
|
||||
private static final Random RANDOM = new Random();
|
||||
|
||||
public static P1 randomP1() {
|
||||
return VALUES.get(RANDOM.nextInt(SIZE));
|
||||
}
|
||||
}
|
||||
18
src/main/java/setGame/P2.java
Normal file
18
src/main/java/setGame/P2.java
Normal file
@@ -0,0 +1,18 @@
|
||||
package setGame;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
enum P2 {
|
||||
B1, B2, B3, B4, B5;
|
||||
|
||||
private static final List<P2> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
|
||||
private static final int SIZE = VALUES.size();
|
||||
private static final Random RANDOM = new Random();
|
||||
|
||||
public static P2 randomP2() {
|
||||
return VALUES.get(RANDOM.nextInt(SIZE));
|
||||
}
|
||||
}
|
||||
18
src/main/java/setGame/P3.java
Normal file
18
src/main/java/setGame/P3.java
Normal file
@@ -0,0 +1,18 @@
|
||||
package setGame;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
enum P3 {
|
||||
C1, C2, C3, C4, C5;
|
||||
|
||||
private static final List<P3> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
|
||||
private static final int SIZE = VALUES.size();
|
||||
private static final Random RANDOM = new Random();
|
||||
|
||||
public static P3 randomP3() {
|
||||
return VALUES.get(RANDOM.nextInt(SIZE));
|
||||
}
|
||||
}
|
||||
18
src/main/java/setGame/P4.java
Normal file
18
src/main/java/setGame/P4.java
Normal file
@@ -0,0 +1,18 @@
|
||||
package setGame;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
enum P4 {
|
||||
D1, D2, D3, D4, D5;
|
||||
|
||||
private static final List<P4> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
|
||||
private static final int SIZE = VALUES.size();
|
||||
private static final Random RANDOM = new Random();
|
||||
|
||||
public static P4 randomP4() {
|
||||
return VALUES.get(RANDOM.nextInt(SIZE));
|
||||
}
|
||||
}
|
||||
18
src/main/java/setGame/P5.java
Normal file
18
src/main/java/setGame/P5.java
Normal file
@@ -0,0 +1,18 @@
|
||||
package setGame;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
enum P5 {
|
||||
E1, E2, E3, E4, E5;
|
||||
|
||||
private static final List<P5> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
|
||||
private static final int SIZE = VALUES.size();
|
||||
private static final Random RANDOM = new Random();
|
||||
|
||||
public static P5 randomP5() {
|
||||
return VALUES.get(RANDOM.nextInt(SIZE));
|
||||
}
|
||||
}
|
||||
14
src/main/java/setGame/SearchResult.java
Normal file
14
src/main/java/setGame/SearchResult.java
Normal file
@@ -0,0 +1,14 @@
|
||||
package setGame;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
class SearchResult {
|
||||
public Set<Card> cards;
|
||||
public List<Set<Card>> sets;
|
||||
public SearchResult(Set<Card> cards, List<Set<Card>> sets) {
|
||||
super();
|
||||
this.cards = cards;
|
||||
this.sets = sets;
|
||||
}
|
||||
}
|
||||
232
src/main/java/setGame/SetGame.java
Normal file
232
src/main/java/setGame/SetGame.java
Normal file
@@ -0,0 +1,232 @@
|
||||
package setGame;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
import javax.sound.sampled.LineEvent;
|
||||
import javax.sound.sampled.LineListener;
|
||||
import javax.sound.sampled.LineUnavailableException;
|
||||
import javax.swing.Timer;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class SetGame {
|
||||
|
||||
private static final int SET_SIZE = 5;
|
||||
|
||||
public static void main(String[] args) {
|
||||
SearchResult sr;
|
||||
int size;
|
||||
int record = 85;
|
||||
do {
|
||||
sr = tryRandom();
|
||||
|
||||
size = sr.cards.size();
|
||||
if (size >= record && sr.sets.size() == 1) {
|
||||
record = size;
|
||||
try {
|
||||
beep(3000, 200);
|
||||
} catch (InterruptedException | LineUnavailableException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
System.out.println(size + " " + sr.sets.size());
|
||||
for (Card card : sr.cards) {
|
||||
System.out.println(card);
|
||||
}
|
||||
// System.out.println("Met " + sr.sets.size() + " sets.");
|
||||
System.out.println(sr.sets);
|
||||
}
|
||||
} while (true);
|
||||
|
||||
}
|
||||
|
||||
private static SearchResult tryRandom() {
|
||||
Set<Card> cards = new HashSet<>();
|
||||
// int sets = 0;
|
||||
do {
|
||||
cards.add(Card.randomCard());
|
||||
} while (cards.size() < SET_SIZE);
|
||||
do {
|
||||
cards.add(Card.randomCard());
|
||||
List<Set<Card>> sets = sets(cards, false);
|
||||
if (sets.size() > 0) {
|
||||
return new SearchResult(cards, sets);
|
||||
}
|
||||
} while (true);
|
||||
|
||||
}
|
||||
|
||||
private static List<Set<Card>> sets(Set<Card> cards, boolean debug) {
|
||||
|
||||
List<Set<Card>> sets = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < cards.size() - 4; i++) {
|
||||
for (int j = i + 1; j < cards.size() - 3; j++) {
|
||||
for (int k = j + 1; k < cards.size() - 2; k++) {
|
||||
for (int l = k + 1; l < cards.size() - 1; l++) {
|
||||
for (int m = l + 1; m < cards.size(); m++) {
|
||||
|
||||
boolean result = false;
|
||||
List<Card> cardsList = new ArrayList<>(cards);
|
||||
Set<P1> p1s = new HashSet<P1>();
|
||||
p1s.add(cardsList.get(i).getP1());
|
||||
p1s.add(cardsList.get(j).getP1());
|
||||
p1s.add(cardsList.get(k).getP1());
|
||||
p1s.add(cardsList.get(l).getP1());
|
||||
p1s.add(cardsList.get(m).getP1());
|
||||
|
||||
Set<P2> p2s = new HashSet<P2>();
|
||||
p2s.add(cardsList.get(i).getP2());
|
||||
p2s.add(cardsList.get(j).getP2());
|
||||
p2s.add(cardsList.get(k).getP2());
|
||||
p2s.add(cardsList.get(l).getP2());
|
||||
p2s.add(cardsList.get(m).getP2());
|
||||
|
||||
Set<P3> p3s = new HashSet<P3>();
|
||||
p3s.add(cardsList.get(i).getP3());
|
||||
p3s.add(cardsList.get(j).getP3());
|
||||
p3s.add(cardsList.get(k).getP3());
|
||||
p3s.add(cardsList.get(l).getP3());
|
||||
p3s.add(cardsList.get(m).getP3());
|
||||
|
||||
Set<P4> p4s = new HashSet<P4>();
|
||||
p4s.add(cardsList.get(i).getP4());
|
||||
p4s.add(cardsList.get(j).getP4());
|
||||
p4s.add(cardsList.get(k).getP4());
|
||||
p4s.add(cardsList.get(l).getP4());
|
||||
p4s.add(cardsList.get(m).getP4());
|
||||
|
||||
Set<P5> p5s = new HashSet<P5>();
|
||||
p5s.add(cardsList.get(i).getP5());
|
||||
p5s.add(cardsList.get(j).getP5());
|
||||
p5s.add(cardsList.get(k).getP5());
|
||||
p5s.add(cardsList.get(l).getP5());
|
||||
p5s.add(cardsList.get(m).getP5());
|
||||
|
||||
result |= (p1s.size() >= 2 && p1s.size() <= (SET_SIZE - 1));
|
||||
result |= (p2s.size() >= 2 && p2s.size() <= (SET_SIZE - 1));
|
||||
result |= (p3s.size() >= 2 && p3s.size() <= (SET_SIZE - 1));
|
||||
result |= (p4s.size() >= 2 && p4s.size() <= (SET_SIZE - 1));
|
||||
result |= (p5s.size() >= 2 && p5s.size() <= (SET_SIZE - 1));
|
||||
|
||||
/* System.out.println("Kaarten " + i+","+j+","+k+","+l+":");
|
||||
System.out.println(cardsList.get(i));
|
||||
System.out.println(cardsList.get(j));
|
||||
System.out.println(cardsList.get(k));
|
||||
System.out.println(cardsList.get(l));
|
||||
System.out.println("Verschillende P1s: " + p1s.size());
|
||||
System.out.println("Verschillende P2s: " + p2s.size());
|
||||
System.out.println("Verschillende P3s: " + p3s.size());
|
||||
System.out.println("Verschillende P4s: " + p4s.size());
|
||||
*/
|
||||
if (result == false) {
|
||||
sets.add(Stream.of(cardsList.get(i), cardsList.get(j), cardsList.get(k), cardsList.get(l), cardsList.get(m)).collect(Collectors.toSet()));
|
||||
if (debug) {
|
||||
System.out.println(cardsList.get(i) + " " + i);
|
||||
System.out.println(cardsList.get(j) + " " + j);
|
||||
System.out.println(cardsList.get(k) + " " + k);
|
||||
System.out.println(cardsList.get(l) + " " + l);
|
||||
System.out.println(cardsList.get(m) + " " + m);
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sets;
|
||||
}
|
||||
|
||||
public static void beep(double freq, final double millis) throws InterruptedException, LineUnavailableException {
|
||||
|
||||
final Clip clip = AudioSystem.getClip();
|
||||
/**
|
||||
* AudioFormat of the reclieved clip. Probably you can alter it
|
||||
* someway choosing proper Line.
|
||||
*/
|
||||
AudioFormat af = clip.getFormat();
|
||||
|
||||
/**
|
||||
* We assume that encoding uses signed shorts. Probably we could
|
||||
* make this code more generic but who cares.
|
||||
*/
|
||||
if (af.getEncoding() != AudioFormat.Encoding.PCM_SIGNED){
|
||||
throw new UnsupportedOperationException("Unknown encoding");
|
||||
}
|
||||
|
||||
if (af.getSampleSizeInBits() != 16) {
|
||||
System.err.println("Weird sample size. Dunno what to do with it.");
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of bytes in a single frame
|
||||
*/
|
||||
int bytesPerFrame = af.getFrameSize();
|
||||
/**
|
||||
* Number of frames per second
|
||||
*/
|
||||
double fps = af.getFrameRate();
|
||||
/**
|
||||
* Number of frames during the clip .
|
||||
*/
|
||||
int frames = (int)(fps * (millis / 1000));
|
||||
|
||||
/**
|
||||
* Data
|
||||
*/
|
||||
ByteBuffer data = ByteBuffer.allocate(frames * bytesPerFrame);
|
||||
|
||||
/**
|
||||
* We will emit sinus, which needs to be scaled so it has proper
|
||||
* frequency --- here is the scaling factor.
|
||||
*/
|
||||
double freqFactor = (Math.PI / 2) * freq / fps;
|
||||
/**
|
||||
* This sinus must also be scaled so it fills short.
|
||||
*/
|
||||
double ampFactor = Short.MAX_VALUE;
|
||||
|
||||
short sample;
|
||||
|
||||
for (int frame = 0; frame < frames; frame++) {
|
||||
sample = (short) (ampFactor * Math.sin(frame * freqFactor));
|
||||
data.putShort(sample);
|
||||
}
|
||||
clip.open(af, data.array(), 0, data.position());
|
||||
|
||||
// This is so Clip releases its data line when done. Otherwise at 32 clips it breaks.
|
||||
clip.addLineListener(new LineListener() {
|
||||
@Override
|
||||
public void update(LineEvent event) {
|
||||
if (event.getType() == LineEvent.Type.START) {
|
||||
Timer t = new Timer((int)millis + 1, new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
clip.close();
|
||||
}
|
||||
});
|
||||
t.setRepeats(false);
|
||||
t.start();
|
||||
}
|
||||
}
|
||||
});
|
||||
clip.start();
|
||||
|
||||
Thread.sleep((long)millis);
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
81
src/main/java/stamps/Stamps.java
Normal file
81
src/main/java/stamps/Stamps.java
Normal file
@@ -0,0 +1,81 @@
|
||||
package stamps;
|
||||
|
||||
import org.apache.commons.lang3.RandomUtils;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class Stamps {
|
||||
|
||||
private static final int SUM = 100;
|
||||
private static final int CHOOSE = 5;
|
||||
private static final int UPPER_STAMP = 36;
|
||||
private static final int LOWER_STAMP = 4;
|
||||
private static final int TOTAL_STAMPS = 5;
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
for (int j = 0; j < 1000; j++) {
|
||||
TreeSet<Integer> stamps = null;
|
||||
for (int i = 0; i < 1000; i++) {
|
||||
stamps = poging();
|
||||
if (stamps != null) break;
|
||||
}
|
||||
|
||||
SortedMap<Integer, Integer> sums = new TreeMap<>();
|
||||
|
||||
int minSum = 1000;
|
||||
int maxSum = 0;
|
||||
|
||||
for (Set<Integer> set : Sets.combinations(stamps, CHOOSE)) {
|
||||
int sumSet = set.stream().mapToInt(Integer::intValue).sum();
|
||||
int sum = sums.containsKey(sumSet) ? sums.get(sumSet) : 0;
|
||||
sums.put(sumSet, sum + 1);
|
||||
}
|
||||
|
||||
int sumsBeforeGoal = 0;
|
||||
int sumsAfterGoal = 0;
|
||||
|
||||
for (int s : sums.keySet()) {
|
||||
if (s < SUM) sumsBeforeGoal += sums.get(s);
|
||||
if (s > SUM) sumsAfterGoal += sums.get(s);
|
||||
}
|
||||
|
||||
if (sumsBeforeGoal > 100 && sumsAfterGoal > 100) {
|
||||
System.out.println(stamps);
|
||||
System.out.println(sumsBeforeGoal + " << " + SUM + " >> " + sumsAfterGoal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static TreeSet<Integer> poging() {
|
||||
var stamps = Sets.newHashSet(8, 12, 22, 23, 35);
|
||||
var triedStamps = new HashSet<Integer>();
|
||||
|
||||
for (int i = 0; i < TOTAL_STAMPS; i++) {
|
||||
int newStamp;
|
||||
do {
|
||||
if (triedStamps.size() == (UPPER_STAMP - LOWER_STAMP + 1)) {
|
||||
// System.out.println("Mislukt");
|
||||
return null;
|
||||
}
|
||||
newStamp = RandomUtils.nextInt(LOWER_STAMP, UPPER_STAMP + 1);
|
||||
triedStamps.add(newStamp);
|
||||
} while (stamps.contains(newStamp) || !testNewStamp(stamps, newStamp));
|
||||
stamps.add(newStamp);
|
||||
// System.out.println(newStamp + " toegevoegd.");
|
||||
}
|
||||
TreeSet<Integer> sortStamps = new TreeSet<>(stamps);
|
||||
return sortStamps;
|
||||
}
|
||||
|
||||
private static boolean testNewStamp(Set<Integer> stamps, int newStamp) {
|
||||
for (Set<Integer> set : Sets.combinations(stamps, CHOOSE - 1)) {
|
||||
if (set.stream().mapToInt(Integer::intValue).sum() + newStamp == SUM) {
|
||||
// System.out.println(newStamp + " valt af.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
99
src/main/java/stamps/Stamps2.java
Normal file
99
src/main/java/stamps/Stamps2.java
Normal file
@@ -0,0 +1,99 @@
|
||||
package stamps;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import org.apache.commons.lang3.RandomUtils;
|
||||
import org.apache.commons.math3.util.CombinatoricsUtils;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class Stamps2 {
|
||||
|
||||
private static final int SUM = 100;
|
||||
private static final int CHOOSE = 6;
|
||||
private static final int UPPER_STAMP = 40;
|
||||
private static final int LOWER_STAMP = 2;
|
||||
private static final int TOTAL_STAMPS = 11;
|
||||
private static final int THRESHOLD = (int) ((CombinatoricsUtils.binomialCoefficient(TOTAL_STAMPS, CHOOSE) / 2) * 0.5);
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
outerloop:
|
||||
for (int j = 0; j < 50000000; j++) {
|
||||
TreeSet<Integer> stamps = null;
|
||||
stamps = poging();
|
||||
|
||||
SortedMap<Integer, Integer> sums = new TreeMap<>();
|
||||
|
||||
int minSum = 1000;
|
||||
int maxSum = 0;
|
||||
Set<Integer> solutionSet = null;
|
||||
|
||||
for (Set<Integer> set : Sets.combinations(stamps, CHOOSE)) {
|
||||
int sumSet = set.stream().mapToInt(Integer::intValue).sum();
|
||||
int sum = sums.containsKey(sumSet) ? sums.get(sumSet) : 0;
|
||||
sums.put(sumSet, sum + 1);
|
||||
if (sumSet == SUM) {
|
||||
solutionSet = new TreeSet<Integer>(set);
|
||||
}
|
||||
}
|
||||
|
||||
int sumsBeforeGoal = 0;
|
||||
int sumsAfterGoal = 0;
|
||||
|
||||
for (int s : sums.keySet()) {
|
||||
if (s < SUM) sumsBeforeGoal += sums.get(s);
|
||||
if (s > SUM) sumsAfterGoal += sums.get(s);
|
||||
}
|
||||
|
||||
boolean success = true;
|
||||
|
||||
|
||||
|
||||
if (success && sumsBeforeGoal > THRESHOLD && sumsAfterGoal > THRESHOLD && sums.containsKey(SUM) && sums.get(SUM) == 1) {
|
||||
|
||||
|
||||
for (int choose = 1; choose <= TOTAL_STAMPS; choose++) {
|
||||
if (choose == CHOOSE) {
|
||||
continue;
|
||||
}
|
||||
for (Set<Integer> set : Sets.combinations(stamps, choose)) {
|
||||
int sumSet = set.stream().mapToInt(Integer::intValue).sum();
|
||||
if (sumSet == SUM) {
|
||||
success = false;
|
||||
// System.out.println(set + " spoils the party.");
|
||||
continue outerloop;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println(stamps);
|
||||
System.out.println(sumsBeforeGoal + " << " + SUM + " >> " + sumsAfterGoal);
|
||||
System.out.println("Solution: " + solutionSet);
|
||||
System.out.println();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//private static int threshold()
|
||||
|
||||
private static TreeSet<Integer> poging() {
|
||||
var stamps = new HashSet<Integer>();
|
||||
var triedStamps = new HashSet<Integer>();
|
||||
|
||||
for (int i = 0; i < TOTAL_STAMPS; i++) {
|
||||
int newStamp;
|
||||
do {
|
||||
|
||||
newStamp = RandomUtils.nextInt(LOWER_STAMP, UPPER_STAMP + 1);
|
||||
triedStamps.add(newStamp);
|
||||
} while (stamps.contains(newStamp));
|
||||
stamps.add(newStamp);
|
||||
|
||||
}
|
||||
TreeSet<Integer> sortStamps = new TreeSet<>(stamps);
|
||||
return sortStamps;
|
||||
}
|
||||
|
||||
}
|
||||
47
src/main/java/tsp/City.java
Normal file
47
src/main/java/tsp/City.java
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* City.java
|
||||
* Models a city
|
||||
*/
|
||||
|
||||
package tsp;
|
||||
|
||||
public class City {
|
||||
int x;
|
||||
int y;
|
||||
|
||||
// Constructs a randomly placed city
|
||||
public City(){
|
||||
this.x = (int)(Math.random()*200);
|
||||
this.y = (int)(Math.random()*200);
|
||||
}
|
||||
|
||||
// Constructs a city at chosen x, y location
|
||||
public City(int x, int y){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
// Gets city's x coordinate
|
||||
public int getX(){
|
||||
return this.x;
|
||||
}
|
||||
|
||||
// Gets city's y coordinate
|
||||
public int getY(){
|
||||
return this.y;
|
||||
}
|
||||
|
||||
// Gets the distance to given city
|
||||
public double distanceTo(City city){
|
||||
int xDistance = Math.abs(getX() - city.getX());
|
||||
int yDistance = Math.abs(getY() - city.getY());
|
||||
double distance = Math.sqrt( (xDistance*xDistance) + (yDistance*yDistance) );
|
||||
|
||||
return distance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return getX()+", "+getY();
|
||||
}
|
||||
}
|
||||
120
src/main/java/tsp/GA.java
Normal file
120
src/main/java/tsp/GA.java
Normal file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* GA.java
|
||||
* Manages algorithms for evolving population
|
||||
*/
|
||||
|
||||
package tsp;
|
||||
|
||||
public class GA {
|
||||
|
||||
/* GA parameters */
|
||||
private static final double mutationRate = 0.015;
|
||||
private static final int tournamentSize = 5;
|
||||
private static final boolean elitism = true;
|
||||
|
||||
// Evolves a population over one generation
|
||||
public static Population evolvePopulation(Population pop) {
|
||||
Population newPopulation = new Population(pop.populationSize(), false);
|
||||
|
||||
// Keep our best individual if elitism is enabled
|
||||
int elitismOffset = 0;
|
||||
if (elitism) {
|
||||
newPopulation.saveTour(0, pop.getFittest());
|
||||
elitismOffset = 1;
|
||||
}
|
||||
|
||||
// Crossover population
|
||||
// Loop over the new population's size and create individuals from
|
||||
// Current population
|
||||
for (int i = elitismOffset; i < newPopulation.populationSize(); i++) {
|
||||
// Select parents
|
||||
Tour parent1 = tournamentSelection(pop);
|
||||
Tour parent2 = tournamentSelection(pop);
|
||||
// Crossover parents
|
||||
Tour child = crossover(parent1, parent2);
|
||||
// Add child to new population
|
||||
newPopulation.saveTour(i, child);
|
||||
}
|
||||
|
||||
// Mutate the new population a bit to add some new genetic material
|
||||
for (int i = elitismOffset; i < newPopulation.populationSize(); i++) {
|
||||
mutate(newPopulation.getTour(i));
|
||||
}
|
||||
|
||||
return newPopulation;
|
||||
}
|
||||
|
||||
// Applies crossover to a set of parents and creates offspring
|
||||
public static Tour crossover(Tour parent1, Tour parent2) {
|
||||
// Create new child tour
|
||||
Tour child = new Tour();
|
||||
|
||||
// Get start and end sub tour positions for parent1's tour
|
||||
int startPos = (int) (Math.random() * parent1.tourSize());
|
||||
int endPos = (int) (Math.random() * parent1.tourSize());
|
||||
|
||||
// Loop and add the sub tour from parent1 to our child
|
||||
for (int i = 0; i < child.tourSize(); i++) {
|
||||
// If our start position is less than the end position
|
||||
if (startPos < endPos && i > startPos && i < endPos) {
|
||||
child.setCity(i, parent1.getCity(i));
|
||||
} // If our start position is larger
|
||||
else if (startPos > endPos) {
|
||||
if (!(i < startPos && i > endPos)) {
|
||||
child.setCity(i, parent1.getCity(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Loop through parent2's city tour
|
||||
for (int i = 0; i < parent2.tourSize(); i++) {
|
||||
// If child doesn't have the city add it
|
||||
if (!child.containsCity(parent2.getCity(i))) {
|
||||
// Loop to find a spare position in the child's tour
|
||||
for (int ii = 0; ii < child.tourSize(); ii++) {
|
||||
// Spare position found, add city
|
||||
if (child.getCity(ii) == null) {
|
||||
child.setCity(ii, parent2.getCity(i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return child;
|
||||
}
|
||||
|
||||
// Mutate a tour using swap mutation
|
||||
private static void mutate(Tour tour) {
|
||||
// Loop through tour cities
|
||||
for(int tourPos1=0; tourPos1 < tour.tourSize(); tourPos1++){
|
||||
// Apply mutation rate
|
||||
if(Math.random() < mutationRate){
|
||||
// Get a second random position in the tour
|
||||
int tourPos2 = (int) (tour.tourSize() * Math.random());
|
||||
|
||||
// Get the cities at target position in tour
|
||||
City city1 = tour.getCity(tourPos1);
|
||||
City city2 = tour.getCity(tourPos2);
|
||||
|
||||
// Swap them around
|
||||
tour.setCity(tourPos2, city1);
|
||||
tour.setCity(tourPos1, city2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Selects candidate tour for crossover
|
||||
private static Tour tournamentSelection(Population pop) {
|
||||
// Create a tournament population
|
||||
Population tournament = new Population(tournamentSize, false);
|
||||
// For each place in the tournament get a random candidate tour and
|
||||
// add it
|
||||
for (int i = 0; i < tournamentSize; i++) {
|
||||
int randomId = (int) (Math.random() * pop.populationSize());
|
||||
tournament.saveTour(i, pop.getTour(randomId));
|
||||
}
|
||||
// Get the fittest tour
|
||||
Tour fittest = tournament.getFittest();
|
||||
return fittest;
|
||||
}
|
||||
}
|
||||
53
src/main/java/tsp/Population.java
Normal file
53
src/main/java/tsp/Population.java
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Population.java
|
||||
* Manages a population of candidate tours
|
||||
*/
|
||||
|
||||
package tsp;
|
||||
|
||||
public class Population {
|
||||
|
||||
// Holds population of tours
|
||||
Tour[] tours;
|
||||
|
||||
// Construct a population
|
||||
public Population(int populationSize, boolean initialise) {
|
||||
tours = new Tour[populationSize];
|
||||
// If we need to initialise a population of tours do so
|
||||
if (initialise) {
|
||||
// Loop and create individuals
|
||||
for (int i = 0; i < populationSize(); i++) {
|
||||
Tour newTour = new Tour();
|
||||
newTour.generateIndividual();
|
||||
saveTour(i, newTour);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Saves a tour
|
||||
public void saveTour(int index, Tour tour) {
|
||||
tours[index] = tour;
|
||||
}
|
||||
|
||||
// Gets a tour from population
|
||||
public Tour getTour(int index) {
|
||||
return tours[index];
|
||||
}
|
||||
|
||||
// Gets the best tour in the population
|
||||
public Tour getFittest() {
|
||||
Tour fittest = tours[0];
|
||||
// Loop through individuals to find fittest
|
||||
for (int i = 1; i < populationSize(); i++) {
|
||||
if (fittest.getFitness() <= getTour(i).getFitness()) {
|
||||
fittest = getTour(i);
|
||||
}
|
||||
}
|
||||
return fittest;
|
||||
}
|
||||
|
||||
// Gets population size
|
||||
public int populationSize() {
|
||||
return tours.length;
|
||||
}
|
||||
}
|
||||
71
src/main/java/tsp/TSP_GA.java
Normal file
71
src/main/java/tsp/TSP_GA.java
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* TSP_GA.java
|
||||
* Create a tour and evolve a solution
|
||||
*/
|
||||
|
||||
package tsp;
|
||||
|
||||
public class TSP_GA {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
|
||||
// Create and add our cities
|
||||
City city = new City(60, 200);
|
||||
TourManager.addCity(city);
|
||||
City city2 = new City(180, 200);
|
||||
TourManager.addCity(city2);
|
||||
City city3 = new City(80, 180);
|
||||
TourManager.addCity(city3);
|
||||
City city4 = new City(140, 180);
|
||||
TourManager.addCity(city4);
|
||||
City city5 = new City(20, 160);
|
||||
TourManager.addCity(city5);
|
||||
City city6 = new City(100, 160);
|
||||
TourManager.addCity(city6);
|
||||
City city7 = new City(200, 160);
|
||||
TourManager.addCity(city7);
|
||||
City city8 = new City(140, 140);
|
||||
TourManager.addCity(city8);
|
||||
City city9 = new City(40, 120);
|
||||
TourManager.addCity(city9);
|
||||
City city10 = new City(100, 120);
|
||||
TourManager.addCity(city10);
|
||||
City city11 = new City(180, 100);
|
||||
TourManager.addCity(city11);
|
||||
City city12 = new City(60, 80);
|
||||
TourManager.addCity(city12);
|
||||
City city13 = new City(120, 80);
|
||||
TourManager.addCity(city13);
|
||||
City city14 = new City(180, 60);
|
||||
TourManager.addCity(city14);
|
||||
City city15 = new City(20, 40);
|
||||
TourManager.addCity(city15);
|
||||
City city16 = new City(100, 40);
|
||||
TourManager.addCity(city16);
|
||||
City city17 = new City(200, 40);
|
||||
TourManager.addCity(city17);
|
||||
City city18 = new City(20, 20);
|
||||
TourManager.addCity(city18);
|
||||
City city19 = new City(60, 20);
|
||||
TourManager.addCity(city19);
|
||||
City city20 = new City(160, 20);
|
||||
TourManager.addCity(city20);
|
||||
|
||||
// Initialize population
|
||||
Population pop = new Population(50, true);
|
||||
System.out.println("Initial distance: " + pop.getFittest().getDistance());
|
||||
|
||||
// Evolve population for 100 generations
|
||||
pop = GA.evolvePopulation(pop);
|
||||
for (int i = 0; i < 10000; i++) {
|
||||
pop = GA.evolvePopulation(pop);
|
||||
}
|
||||
|
||||
// Print final results
|
||||
System.out.println("Finished");
|
||||
System.out.println("Final distance: " + pop.getFittest().getDistance());
|
||||
System.out.println("Solution:");
|
||||
System.out.println(pop.getFittest());
|
||||
}
|
||||
}
|
||||
105
src/main/java/tsp/Tour.java
Normal file
105
src/main/java/tsp/Tour.java
Normal file
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Tour.java
|
||||
* Stores a candidate tour
|
||||
*/
|
||||
|
||||
package tsp;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
||||
public class Tour{
|
||||
|
||||
// Holds our tour of cities
|
||||
private ArrayList tour = new ArrayList<City>();
|
||||
// Cache
|
||||
private double fitness = 0;
|
||||
private int distance = 0;
|
||||
|
||||
// Constructs a blank tour
|
||||
public Tour(){
|
||||
for (int i = 0; i < TourManager.numberOfCities(); i++) {
|
||||
tour.add(null);
|
||||
}
|
||||
}
|
||||
|
||||
public Tour(ArrayList tour){
|
||||
this.tour = tour;
|
||||
}
|
||||
|
||||
// Creates a random individual
|
||||
public void generateIndividual() {
|
||||
// Loop through all our destination cities and add them to our tour
|
||||
for (int cityIndex = 0; cityIndex < TourManager.numberOfCities(); cityIndex++) {
|
||||
setCity(cityIndex, TourManager.getCity(cityIndex));
|
||||
}
|
||||
// Randomly reorder the tour
|
||||
Collections.shuffle(tour);
|
||||
}
|
||||
|
||||
// Gets a city from the tour
|
||||
public City getCity(int tourPosition) {
|
||||
return (City)tour.get(tourPosition);
|
||||
}
|
||||
|
||||
// Sets a city in a certain position within a tour
|
||||
public void setCity(int tourPosition, City city) {
|
||||
tour.set(tourPosition, city);
|
||||
// If the tours been altered we need to reset the fitness and distance
|
||||
fitness = 0;
|
||||
distance = 0;
|
||||
}
|
||||
|
||||
// Gets the tours fitness
|
||||
public double getFitness() {
|
||||
if (fitness == 0) {
|
||||
fitness = 1/(double)getDistance();
|
||||
}
|
||||
return fitness;
|
||||
}
|
||||
|
||||
// Gets the total distance of the tour
|
||||
public int getDistance(){
|
||||
if (distance == 0) {
|
||||
int tourDistance = 0;
|
||||
// Loop through our tour's cities
|
||||
for (int cityIndex=0; cityIndex < tourSize(); cityIndex++) {
|
||||
// Get city we're travelling from
|
||||
City fromCity = getCity(cityIndex);
|
||||
// City we're travelling to
|
||||
City destinationCity;
|
||||
// Check we're not on our tour's last city, if we are set our
|
||||
// tour's final destination city to our starting city
|
||||
if(cityIndex+1 < tourSize()){
|
||||
destinationCity = getCity(cityIndex+1);
|
||||
}
|
||||
else{
|
||||
destinationCity = getCity(0);
|
||||
}
|
||||
// Get the distance between the two cities
|
||||
tourDistance += fromCity.distanceTo(destinationCity);
|
||||
}
|
||||
distance = tourDistance;
|
||||
}
|
||||
return distance;
|
||||
}
|
||||
|
||||
// Get number of cities on our tour
|
||||
public int tourSize() {
|
||||
return tour.size();
|
||||
}
|
||||
|
||||
// Check if the tour contains a city
|
||||
public boolean containsCity(City city){
|
||||
return tour.contains(city);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String geneString = "|";
|
||||
for (int i = 0; i < tourSize(); i++) {
|
||||
geneString += getCity(i)+"|";
|
||||
}
|
||||
return geneString;
|
||||
}
|
||||
}
|
||||
29
src/main/java/tsp/TourManager.java
Normal file
29
src/main/java/tsp/TourManager.java
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* TourManager.java
|
||||
* Holds the cities of a tour
|
||||
*/
|
||||
|
||||
package tsp;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class TourManager {
|
||||
|
||||
// Holds our cities
|
||||
private static ArrayList destinationCities = new ArrayList<City>();
|
||||
|
||||
// Adds a destination city
|
||||
public static void addCity(City city) {
|
||||
destinationCities.add(city);
|
||||
}
|
||||
|
||||
// Get a city
|
||||
public static City getCity(int index){
|
||||
return (City)destinationCities.get(index);
|
||||
}
|
||||
|
||||
// Get the number of destination cities
|
||||
public static int numberOfCities(){
|
||||
return destinationCities.size();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user