You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by cc...@apache.org on 2015/09/21 09:32:12 UTC
[2/2] incubator-groovy git commit: Added a compiler performance test
module
Added a compiler performance test module
Project: http://git-wip-us.apache.org/repos/asf/incubator-groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-groovy/commit/6dbfae85
Tree: http://git-wip-us.apache.org/repos/asf/incubator-groovy/tree/6dbfae85
Diff: http://git-wip-us.apache.org/repos/asf/incubator-groovy/diff/6dbfae85
Branch: refs/heads/master
Commit: 6dbfae85e537df0ce72471e2027a6d6209bb8834
Parents: 8e97162
Author: Cedric Champeau <cc...@apache.org>
Authored: Mon Sep 21 09:31:34 2015 +0200
Committer: Cedric Champeau <cc...@apache.org>
Committed: Mon Sep 21 09:31:34 2015 +0200
----------------------------------------------------------------------
benchmark/bench/chameneos.java | 266 ++---
benchmark/bench/magicsquares.java | 468 ++++-----
benchmark/bench/mandelbrot.java | 166 ++--
benchmark/bench/message.java | 200 ++--
benchmark/bench/meteor.java | 988 +++++++++----------
benchmark/bench/moments.java | 154 +--
benchmark/bench/wordfreq.groovy | 10 +-
settings.gradle | 9 +-
subprojects/performance/build.gradle | 90 ++
.../groovy/perf/CompilerPerformanceTest.java | 73 ++
.../groovy/perf/ScriptCompilationExecuter.java | 65 ++
11 files changed, 1361 insertions(+), 1128 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/6dbfae85/benchmark/bench/chameneos.java
----------------------------------------------------------------------
diff --git a/benchmark/bench/chameneos.java b/benchmark/bench/chameneos.java
index da7bc67..efd6ceb 100644
--- a/benchmark/bench/chameneos.java
+++ b/benchmark/bench/chameneos.java
@@ -1,133 +1,133 @@
-/* The Computer Language Shootout
- http://shootout.alioth.debian.org/
-
- contributed by Keenan Tims
- modified by Michael Barker
-*/
-
-
-public class chameneos {
-
- private MeetingPlace mp;
-
- public static final Colour[] COLOURS = { Colour.BLUE, Colour.RED, Colour.YELLOW, Colour.BLUE };
-
- private Creature[] creatures = new Creature[COLOURS.length];
-
- public enum Colour {
- RED, BLUE, YELLOW, FADED
- }
-
- public class Creature extends Thread {
-
- private MeetingPlace mp;
- private Colour colour;
- private int met = 0;
- private Colour other;
-
- public Creature(Colour c, MeetingPlace mp) {
- this.colour = c;
- this.mp = mp;
- }
-
- public void run() {
- try {
- while (colour != Colour.FADED) {
- mp.meet(this);
- if (other == Colour.FADED)
- colour = Colour.FADED;
- else {
- met++;
- colour = complement(other);
- }
- }
- } catch (InterruptedException e) {
- // Let the thread exit.
- }
- }
-
- private Colour complement(Colour other) {
- if (colour == other)
- return colour;
- switch (colour) {
- case BLUE:
- return other == Colour.RED ? Colour.YELLOW : Colour.RED;
- case RED:
- return other == Colour.BLUE ? Colour.YELLOW : Colour.BLUE;
- case YELLOW:
- return other == Colour.BLUE ? Colour.RED : Colour.BLUE;
- default:
- return colour;
- }
- }
-
- public int getCreaturesMet() {
- return met;
- }
-
- public Colour getColour() {
- return colour;
- }
-
- public void setOther(Colour other) throws InterruptedException {
- this.other = other;
- }
- }
-
- public class MeetingPlace {
-
- int n;
-
- public MeetingPlace(int n) {
- this.n = n;
- }
-
- Creature other = null;
- public void meet(Creature c) throws InterruptedException {
-
- synchronized (this) {
- if (n > 0) {
- if (other == null) {
- other = c;
- this.wait();
- } else {
- other.setOther(c.getColour());
- c.setOther(other.getColour());
- other = null;
- n--;
- this.notify();
- }
- } else {
- c.setOther(Colour.FADED);
- }
- }
- }
- }
-
- public chameneos(int n) throws InterruptedException {
- int meetings = 0;
- mp = new MeetingPlace(n);
-
- for (int i = 0; i < COLOURS.length; i++) {
- creatures[i] = new Creature(COLOURS[i], mp);
- creatures[i].start();
- }
-
- // wait for all threads to complete
- for (int i = 0; i < COLOURS.length; i++)
- creatures[i].join();
-
- // sum all the meetings
- for (int i = 0; i < COLOURS.length; i++) {
- meetings += creatures[i].getCreaturesMet();
- }
-
- System.out.println(meetings);
- }
-
- public static void main(String[] args) throws Exception {
- if (args.length < 1)
- throw new IllegalArgumentException();
- new chameneos(Integer.parseInt(args[0]));
- }
-}
+/* The Computer Language Shootout
+ http://shootout.alioth.debian.org/
+
+ contributed by Keenan Tims
+ modified by Michael Barker
+*/
+
+
+public class chameneos {
+
+ private MeetingPlace mp;
+
+ public static final Colour[] COLOURS = { Colour.BLUE, Colour.RED, Colour.YELLOW, Colour.BLUE };
+
+ private Creature[] creatures = new Creature[COLOURS.length];
+
+ public enum Colour {
+ RED, BLUE, YELLOW, FADED
+ }
+
+ public class Creature extends Thread {
+
+ private MeetingPlace mp;
+ private Colour colour;
+ private int met = 0;
+ private Colour other;
+
+ public Creature(Colour c, MeetingPlace mp) {
+ this.colour = c;
+ this.mp = mp;
+ }
+
+ public void run() {
+ try {
+ while (colour != Colour.FADED) {
+ mp.meet(this);
+ if (other == Colour.FADED)
+ colour = Colour.FADED;
+ else {
+ met++;
+ colour = complement(other);
+ }
+ }
+ } catch (InterruptedException e) {
+ // Let the thread exit.
+ }
+ }
+
+ private Colour complement(Colour other) {
+ if (colour == other)
+ return colour;
+ switch (colour) {
+ case BLUE:
+ return other == Colour.RED ? Colour.YELLOW : Colour.RED;
+ case RED:
+ return other == Colour.BLUE ? Colour.YELLOW : Colour.BLUE;
+ case YELLOW:
+ return other == Colour.BLUE ? Colour.RED : Colour.BLUE;
+ default:
+ return colour;
+ }
+ }
+
+ public int getCreaturesMet() {
+ return met;
+ }
+
+ public Colour getColour() {
+ return colour;
+ }
+
+ public void setOther(Colour other) throws InterruptedException {
+ this.other = other;
+ }
+ }
+
+ public class MeetingPlace {
+
+ int n;
+
+ public MeetingPlace(int n) {
+ this.n = n;
+ }
+
+ Creature other = null;
+ public void meet(Creature c) throws InterruptedException {
+
+ synchronized (this) {
+ if (n > 0) {
+ if (other == null) {
+ other = c;
+ this.wait();
+ } else {
+ other.setOther(c.getColour());
+ c.setOther(other.getColour());
+ other = null;
+ n--;
+ this.notify();
+ }
+ } else {
+ c.setOther(Colour.FADED);
+ }
+ }
+ }
+ }
+
+ public chameneos(int n) throws InterruptedException {
+ int meetings = 0;
+ mp = new MeetingPlace(n);
+
+ for (int i = 0; i < COLOURS.length; i++) {
+ creatures[i] = new Creature(COLOURS[i], mp);
+ creatures[i].start();
+ }
+
+ // wait for all threads to complete
+ for (int i = 0; i < COLOURS.length; i++)
+ creatures[i].join();
+
+ // sum all the meetings
+ for (int i = 0; i < COLOURS.length; i++) {
+ meetings += creatures[i].getCreaturesMet();
+ }
+
+ System.out.println(meetings);
+ }
+
+ public static void main(String[] args) throws Exception {
+ if (args.length < 1)
+ throw new IllegalArgumentException();
+ new chameneos(Integer.parseInt(args[0]));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/6dbfae85/benchmark/bench/magicsquares.java
----------------------------------------------------------------------
diff --git a/benchmark/bench/magicsquares.java b/benchmark/bench/magicsquares.java
index 2ecc74f..766991f 100644
--- a/benchmark/bench/magicsquares.java
+++ b/benchmark/bench/magicsquares.java
@@ -1,234 +1,234 @@
-/* The Computer Language Shootout
- http://shootout.alioth.debian.org/
-
- benchmark implementation (not optimized)
- JRE 1.5 only
- contributed by Josh Goldfoot */
-
-import java.io.*;
-import java.lang.*;
-import java.util.*;
-
-public class magicsquares {
-
- static int n;
- static int mn;
-
- public static class FfmResult {
- public int x;
- public int y;
- public int[] moves;
- public FfmResult(int ix, int iy, int[] imoves) {
- x = ix;
- y = iy;
- moves = (int[]) imoves.clone();
- }
- }
-
- public static class PQNode implements Comparable {
- public int [] grid;
- boolean priorityCalculated;
- private int priority;
- private FfmResult ffm;
-
- public PQNode() {
- grid = new int [n * n];
- int i;
- for (i = 0; i < n * n; i++)
- grid[i] = 0;
- priorityCalculated = false;
- ffm = null;
- }
- public PQNode(PQNode other) {
- grid = (int[]) other.grid.clone();
- priorityCalculated = false;
- }
-
- public int[] gridRow(int y) {
- int[] r = new int[n];
- int x;
- for (x = 0; x < n; x++)
- r[x] = grid[x + y * n];
- return r;
- }
-
- public int[] gridCol(int x) {
- int[] r = new int[n];
- int y;
- for (y = 0; y < n; y++)
- r[y] = grid[x + y * n];
- return r;
- }
-
- public int[] diagonal(int q) {
- int[] r = new int[n];
- int i;
- for (i = 0; i < n; i++) {
- if (q == 1)
- r[i] = grid[i + i * n];
- else if (q == 2) {
- r[i] = grid[i + (n - 1 - i) * n];
- }
- }
- return r;
- }
-
- public int[] possibleMoves(int x, int y) {
- int zerocount, sum, highest, j, i;
-
- if (grid[x + y * n] != 0)
- return ( new int [] { });
- ArrayList<int[]> cellGroups = new ArrayList<int[]>();
- cellGroups.add(gridCol(x));
- cellGroups.add(gridRow(y));
- if (x == y)
- cellGroups.add(diagonal(1));
- if (x + y == n - 1)
- cellGroups.add(diagonal(2));
- HashSet<Integer> usedNumbers = new HashSet<Integer>();
- for (i = 0; i < grid.length; i++)
- usedNumbers.add(new Integer(grid[i]));
- HashSet<Integer> onePossible = new HashSet<Integer>();
- highest = n * n;
- for (int[] group: cellGroups) {
- zerocount = 0;
- sum = 0;
- for (int num: group) {
- if (num == 0)
- zerocount++;
- sum += num;
- }
- if (zerocount == 1)
- onePossible.add(new Integer(mn - sum));
- if (mn - sum < highest)
- highest = mn - sum;
- }
- if (onePossible.size() == 1) {
- Integer onlyPossibleMove = (Integer) onePossible.iterator().next();
- int opmint = onlyPossibleMove.intValue();
- if (opmint >= 1 &&
- opmint <= n * n &&
- ! usedNumbers.contains(onlyPossibleMove))
- return (new int[] { opmint });
- else
- return ( new int [] { });
- } else if (onePossible.size() > 1)
- return ( new int [] { });
- ArrayList<Integer> moves = new ArrayList<Integer>();
- for (i = 1; i <= highest; i++) {
- Integer ii = new Integer(i);
- if (! usedNumbers.contains(ii))
- moves.add(ii);
- }
- int[] r = new int[moves.size()];
- i = 0;
- for (Integer move: moves) {
- r[i++] = move.intValue();
- }
- return r;
- }
-
- public FfmResult findFewestMoves() {
- if (ffm != null)
- return ffm;
- int x, y, mx, my, ind;
- int[] minmoves = (new int[] { });
- int[] moves;
- mx = my = -1;
- for (y = 0; y < n; y++)
- for (x = 0; x < n; x++) {
- ind = x + y * n;
- if (grid[ind] == 0) {
- moves = possibleMoves(x,y);
- if (mx == -1 || moves.length < minmoves.length) {
- mx = x;
- my = y;
- minmoves = (int[]) moves.clone();
- }
- }
- }
- ffm = new FfmResult(mx, my, minmoves);
- return ffm;
- }
-
- public void calculatePriority()
- {
- int i, zerocount;
- zerocount = 0;
- for (int cell: grid)
- if (cell == 0)
- zerocount++;
- priority = zerocount + findFewestMoves().moves.length;
- priorityCalculated = true;
- }
-
- public int getPriority()
- {
- if (priorityCalculated)
- return priority;
- else {
- calculatePriority();
- return priority;
- }
- }
-
- public int compareTo(Object anotherMSquare) throws ClassCastException {
- if (!(anotherMSquare instanceof PQNode))
- throw new ClassCastException();
- PQNode other = (PQNode) anotherMSquare;
- int c = getPriority() - other.getPriority();
- if (c == 0) {
- int i = 0;
- while (c == 0 && i < n * n) {
- c = grid[i] - other.grid[i];
- i++;
- }
- }
- return c;
- }
-
- public String toString() {
- StringBuilder sb = new StringBuilder();
- int y, x;
- for (y = 0; y < n; y++) {
- for (x = 0; x < n; x++) {
- sb.append(grid[x + y * n]);
- if (x < n-1)
- sb.append(' ');
- }
- if (y < n-1)
- sb.append('\n');
- }
- return sb.toString();
- }
-
-
- }
-
- public magicsquares() { }
-
- public static void main(String[] args) {
- n = 3;
- if (args.length > 0)
- n = Integer.parseInt(args[0]);
- mn = n * (1 + n * n) / 2;
- PriorityQueue<magicsquares.PQNode> pq = new PriorityQueue<magicsquares.PQNode>();
- pq.offer(new magicsquares.PQNode() );
- while (! pq.isEmpty()) {
- PQNode topSquare = pq.poll();
- if (topSquare.getPriority() == 0) {
- System.out.println(topSquare);
- break;
- }
- magicsquares.FfmResult result = topSquare.findFewestMoves();
-
- int ind = result.x + result.y * n;
- for (int move: result.moves) {
- magicsquares.PQNode newSquare = new magicsquares.PQNode(topSquare);
- newSquare.grid[ind] = move;
- pq.offer(newSquare);
- }
- }
-
- }
-}
+/* The Computer Language Shootout
+ http://shootout.alioth.debian.org/
+
+ benchmark implementation (not optimized)
+ JRE 1.5 only
+ contributed by Josh Goldfoot */
+
+import java.io.*;
+import java.lang.*;
+import java.util.*;
+
+public class magicsquares {
+
+ static int n;
+ static int mn;
+
+ public static class FfmResult {
+ public int x;
+ public int y;
+ public int[] moves;
+ public FfmResult(int ix, int iy, int[] imoves) {
+ x = ix;
+ y = iy;
+ moves = (int[]) imoves.clone();
+ }
+ }
+
+ public static class PQNode implements Comparable {
+ public int [] grid;
+ boolean priorityCalculated;
+ private int priority;
+ private FfmResult ffm;
+
+ public PQNode() {
+ grid = new int [n * n];
+ int i;
+ for (i = 0; i < n * n; i++)
+ grid[i] = 0;
+ priorityCalculated = false;
+ ffm = null;
+ }
+ public PQNode(PQNode other) {
+ grid = (int[]) other.grid.clone();
+ priorityCalculated = false;
+ }
+
+ public int[] gridRow(int y) {
+ int[] r = new int[n];
+ int x;
+ for (x = 0; x < n; x++)
+ r[x] = grid[x + y * n];
+ return r;
+ }
+
+ public int[] gridCol(int x) {
+ int[] r = new int[n];
+ int y;
+ for (y = 0; y < n; y++)
+ r[y] = grid[x + y * n];
+ return r;
+ }
+
+ public int[] diagonal(int q) {
+ int[] r = new int[n];
+ int i;
+ for (i = 0; i < n; i++) {
+ if (q == 1)
+ r[i] = grid[i + i * n];
+ else if (q == 2) {
+ r[i] = grid[i + (n - 1 - i) * n];
+ }
+ }
+ return r;
+ }
+
+ public int[] possibleMoves(int x, int y) {
+ int zerocount, sum, highest, j, i;
+
+ if (grid[x + y * n] != 0)
+ return ( new int [] { });
+ ArrayList<int[]> cellGroups = new ArrayList<int[]>();
+ cellGroups.add(gridCol(x));
+ cellGroups.add(gridRow(y));
+ if (x == y)
+ cellGroups.add(diagonal(1));
+ if (x + y == n - 1)
+ cellGroups.add(diagonal(2));
+ HashSet<Integer> usedNumbers = new HashSet<Integer>();
+ for (i = 0; i < grid.length; i++)
+ usedNumbers.add(new Integer(grid[i]));
+ HashSet<Integer> onePossible = new HashSet<Integer>();
+ highest = n * n;
+ for (int[] group: cellGroups) {
+ zerocount = 0;
+ sum = 0;
+ for (int num: group) {
+ if (num == 0)
+ zerocount++;
+ sum += num;
+ }
+ if (zerocount == 1)
+ onePossible.add(new Integer(mn - sum));
+ if (mn - sum < highest)
+ highest = mn - sum;
+ }
+ if (onePossible.size() == 1) {
+ Integer onlyPossibleMove = (Integer) onePossible.iterator().next();
+ int opmint = onlyPossibleMove.intValue();
+ if (opmint >= 1 &&
+ opmint <= n * n &&
+ ! usedNumbers.contains(onlyPossibleMove))
+ return (new int[] { opmint });
+ else
+ return ( new int [] { });
+ } else if (onePossible.size() > 1)
+ return ( new int [] { });
+ ArrayList<Integer> moves = new ArrayList<Integer>();
+ for (i = 1; i <= highest; i++) {
+ Integer ii = new Integer(i);
+ if (! usedNumbers.contains(ii))
+ moves.add(ii);
+ }
+ int[] r = new int[moves.size()];
+ i = 0;
+ for (Integer move: moves) {
+ r[i++] = move.intValue();
+ }
+ return r;
+ }
+
+ public FfmResult findFewestMoves() {
+ if (ffm != null)
+ return ffm;
+ int x, y, mx, my, ind;
+ int[] minmoves = (new int[] { });
+ int[] moves;
+ mx = my = -1;
+ for (y = 0; y < n; y++)
+ for (x = 0; x < n; x++) {
+ ind = x + y * n;
+ if (grid[ind] == 0) {
+ moves = possibleMoves(x,y);
+ if (mx == -1 || moves.length < minmoves.length) {
+ mx = x;
+ my = y;
+ minmoves = (int[]) moves.clone();
+ }
+ }
+ }
+ ffm = new FfmResult(mx, my, minmoves);
+ return ffm;
+ }
+
+ public void calculatePriority()
+ {
+ int i, zerocount;
+ zerocount = 0;
+ for (int cell: grid)
+ if (cell == 0)
+ zerocount++;
+ priority = zerocount + findFewestMoves().moves.length;
+ priorityCalculated = true;
+ }
+
+ public int getPriority()
+ {
+ if (priorityCalculated)
+ return priority;
+ else {
+ calculatePriority();
+ return priority;
+ }
+ }
+
+ public int compareTo(Object anotherMSquare) throws ClassCastException {
+ if (!(anotherMSquare instanceof PQNode))
+ throw new ClassCastException();
+ PQNode other = (PQNode) anotherMSquare;
+ int c = getPriority() - other.getPriority();
+ if (c == 0) {
+ int i = 0;
+ while (c == 0 && i < n * n) {
+ c = grid[i] - other.grid[i];
+ i++;
+ }
+ }
+ return c;
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ int y, x;
+ for (y = 0; y < n; y++) {
+ for (x = 0; x < n; x++) {
+ sb.append(grid[x + y * n]);
+ if (x < n-1)
+ sb.append(' ');
+ }
+ if (y < n-1)
+ sb.append('\n');
+ }
+ return sb.toString();
+ }
+
+
+ }
+
+ public magicsquares() { }
+
+ public static void main(String[] args) {
+ n = 3;
+ if (args.length > 0)
+ n = Integer.parseInt(args[0]);
+ mn = n * (1 + n * n) / 2;
+ PriorityQueue<magicsquares.PQNode> pq = new PriorityQueue<magicsquares.PQNode>();
+ pq.offer(new magicsquares.PQNode() );
+ while (! pq.isEmpty()) {
+ PQNode topSquare = pq.poll();
+ if (topSquare.getPriority() == 0) {
+ System.out.println(topSquare);
+ break;
+ }
+ magicsquares.FfmResult result = topSquare.findFewestMoves();
+
+ int ind = result.x + result.y * n;
+ for (int move: result.moves) {
+ magicsquares.PQNode newSquare = new magicsquares.PQNode(topSquare);
+ newSquare.grid[ind] = move;
+ pq.offer(newSquare);
+ }
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/6dbfae85/benchmark/bench/mandelbrot.java
----------------------------------------------------------------------
diff --git a/benchmark/bench/mandelbrot.java b/benchmark/bench/mandelbrot.java
index 6b7a6cc..988182f 100644
--- a/benchmark/bench/mandelbrot.java
+++ b/benchmark/bench/mandelbrot.java
@@ -1,83 +1,83 @@
-/* The Computer Language Benchmarks Game
- http://shootout.alioth.debian.org/
- contributed by Stefan Krause
- slightly modified by Chad Whipkey
-*/
-
-import java.io.IOException;
-import java.io.PrintStream;
-
-class mandelbrot {
-
- public static void main(String[] args) throws Exception {
- new Mandelbrot(Integer.parseInt(args[0])).compute();
- }
-
- public static class Mandelbrot {
- private static final int BUFFER_SIZE = 8192;
-
- public Mandelbrot(int size) {
- this.size = size;
- fac = 2.0 / size;
- out = System.out;
- shift = size % 8 == 0 ? 0 : (8- size % 8);
- }
- final int size;
- final PrintStream out;
- final byte [] buf = new byte[BUFFER_SIZE];
- int bufLen = 0;
- final double fac;
- final int shift;
-
- public void compute() throws IOException
- {
- out.format("P4\n%d %d\n",size,size);
- for (int y = 0; y<size; y++)
- computeRow(y);
- out.write( buf, 0, bufLen);
- out.close();
- }
-
- private void computeRow(int y) throws IOException
- {
- int bits = 0;
-
- final double Ci = (y*fac - 1.0);
- final byte[] bufLocal = buf;
- for (int x = 0; x<size;x++) {
- double Zr = 0.0;
- double Zi = 0.0;
- double Cr = (x*fac - 1.5);
- int i = 50;
- double ZrN = 0;
- double ZiN = 0;
- do {
- Zi = 2.0 * Zr * Zi + Ci;
- Zr = ZrN - ZiN + Cr;
- ZiN = Zi * Zi;
- ZrN = Zr * Zr;
- } while (!(ZiN + ZrN > 4.0) && --i > 0);
-
- bits = bits << 1;
- if (i == 0) bits++;
-
- if (x%8 == 7) {
- bufLocal[bufLen++] = (byte) bits;
- if ( bufLen == BUFFER_SIZE) {
- out.write(bufLocal, 0, BUFFER_SIZE);
- bufLen = 0;
- }
- bits = 0;
- }
- }
- if (shift!=0) {
- bits = bits << shift;
- bufLocal[bufLen++] = (byte) bits;
- if ( bufLen == BUFFER_SIZE) {
- out.write(bufLocal, 0, BUFFER_SIZE);
- bufLen = 0;
- }
- }
- }
- }
-}
+/* The Computer Language Benchmarks Game
+ http://shootout.alioth.debian.org/
+ contributed by Stefan Krause
+ slightly modified by Chad Whipkey
+*/
+
+import java.io.IOException;
+import java.io.PrintStream;
+
+class mandelbrot {
+
+ public static void main(String[] args) throws Exception {
+ new Mandelbrot(Integer.parseInt(args[0])).compute();
+ }
+
+ public static class Mandelbrot {
+ private static final int BUFFER_SIZE = 8192;
+
+ public Mandelbrot(int size) {
+ this.size = size;
+ fac = 2.0 / size;
+ out = System.out;
+ shift = size % 8 == 0 ? 0 : (8- size % 8);
+ }
+ final int size;
+ final PrintStream out;
+ final byte [] buf = new byte[BUFFER_SIZE];
+ int bufLen = 0;
+ final double fac;
+ final int shift;
+
+ public void compute() throws IOException
+ {
+ out.format("P4\n%d %d\n",size,size);
+ for (int y = 0; y<size; y++)
+ computeRow(y);
+ out.write( buf, 0, bufLen);
+ out.close();
+ }
+
+ private void computeRow(int y) throws IOException
+ {
+ int bits = 0;
+
+ final double Ci = (y*fac - 1.0);
+ final byte[] bufLocal = buf;
+ for (int x = 0; x<size;x++) {
+ double Zr = 0.0;
+ double Zi = 0.0;
+ double Cr = (x*fac - 1.5);
+ int i = 50;
+ double ZrN = 0;
+ double ZiN = 0;
+ do {
+ Zi = 2.0 * Zr * Zi + Ci;
+ Zr = ZrN - ZiN + Cr;
+ ZiN = Zi * Zi;
+ ZrN = Zr * Zr;
+ } while (!(ZiN + ZrN > 4.0) && --i > 0);
+
+ bits = bits << 1;
+ if (i == 0) bits++;
+
+ if (x%8 == 7) {
+ bufLocal[bufLen++] = (byte) bits;
+ if ( bufLen == BUFFER_SIZE) {
+ out.write(bufLocal, 0, BUFFER_SIZE);
+ bufLen = 0;
+ }
+ bits = 0;
+ }
+ }
+ if (shift!=0) {
+ bits = bits << shift;
+ bufLocal[bufLen++] = (byte) bits;
+ if ( bufLen == BUFFER_SIZE) {
+ out.write(bufLocal, 0, BUFFER_SIZE);
+ bufLen = 0;
+ }
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/6dbfae85/benchmark/bench/message.java
----------------------------------------------------------------------
diff --git a/benchmark/bench/message.java b/benchmark/bench/message.java
index 4735b07..30fd122 100644
--- a/benchmark/bench/message.java
+++ b/benchmark/bench/message.java
@@ -1,100 +1,100 @@
-/* The Computer Language Benchmarks Game
- http://shootout.alioth.debian.org/
-
- contributed by Mattias Bergander
- */
-
-import java.util.LinkedList;
-import java.util.List;
-
-public class message {
- public static final int numberOfThreads = 500;
-
- public static int numberOfMessagesToSend;
-
- public static void main(String args[]) {
- numberOfMessagesToSend = Integer.parseInt(args[0]);
-
- MessageThread chain = null;
- for (int i = 0; i < numberOfThreads; i++) {
- chain = new MessageThread(chain);
- new Thread(chain).start();
- }
-
- for (int i = 0; i < numberOfMessagesToSend; i++) {
- chain.enqueue(new MutableInteger(0));
- }
-
- }
-}
-
-class MutableInteger {
- int value;
-
- public MutableInteger() {
- this(0);
- }
-
- public MutableInteger(int value) {
- this.value = value;
- }
-
- public MutableInteger increment() {
- value++;
- return this;
- }
-
- public int intValue() {
- return value;
- }
-}
-
-class MessageThread implements Runnable {
- MessageThread nextThread;
-
- List<MutableInteger> list = new LinkedList<MutableInteger>();
-
- MessageThread(MessageThread nextThread) {
- this.nextThread = nextThread;
- }
-
- public void run() {
- if (nextThread != null) {
- while (true) {
- nextThread.enqueue(dequeue());
- }
- } else {
- int sum = 0;
- int finalSum = message.numberOfThreads * message.numberOfMessagesToSend;
- while (sum < finalSum) {
- sum += dequeue().intValue();
- }
- System.out.println(sum);
- System.exit(0);
- }
- }
-
- /**
- * @param message
- */
- public void enqueue(MutableInteger message) {
- synchronized (list) {
- list.add(message);
- if (list.size() == 1) {
- list.notify();
- }
- }
- }
-
- public MutableInteger dequeue() {
- synchronized (list) {
- while (list.size() == 0) {
- try {
- list.wait();
- } catch (InterruptedException e) {
- }
- }
- return list.remove(0).increment();
- }
- }
-}
+/* The Computer Language Benchmarks Game
+ http://shootout.alioth.debian.org/
+
+ contributed by Mattias Bergander
+ */
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class message {
+ public static final int numberOfThreads = 500;
+
+ public static int numberOfMessagesToSend;
+
+ public static void main(String args[]) {
+ numberOfMessagesToSend = Integer.parseInt(args[0]);
+
+ MessageThread chain = null;
+ for (int i = 0; i < numberOfThreads; i++) {
+ chain = new MessageThread(chain);
+ new Thread(chain).start();
+ }
+
+ for (int i = 0; i < numberOfMessagesToSend; i++) {
+ chain.enqueue(new MutableInteger(0));
+ }
+
+ }
+}
+
+class MutableInteger {
+ int value;
+
+ public MutableInteger() {
+ this(0);
+ }
+
+ public MutableInteger(int value) {
+ this.value = value;
+ }
+
+ public MutableInteger increment() {
+ value++;
+ return this;
+ }
+
+ public int intValue() {
+ return value;
+ }
+}
+
+class MessageThread implements Runnable {
+ MessageThread nextThread;
+
+ List<MutableInteger> list = new LinkedList<MutableInteger>();
+
+ MessageThread(MessageThread nextThread) {
+ this.nextThread = nextThread;
+ }
+
+ public void run() {
+ if (nextThread != null) {
+ while (true) {
+ nextThread.enqueue(dequeue());
+ }
+ } else {
+ int sum = 0;
+ int finalSum = message.numberOfThreads * message.numberOfMessagesToSend;
+ while (sum < finalSum) {
+ sum += dequeue().intValue();
+ }
+ System.out.println(sum);
+ System.exit(0);
+ }
+ }
+
+ /**
+ * @param message
+ */
+ public void enqueue(MutableInteger message) {
+ synchronized (list) {
+ list.add(message);
+ if (list.size() == 1) {
+ list.notify();
+ }
+ }
+ }
+
+ public MutableInteger dequeue() {
+ synchronized (list) {
+ while (list.size() == 0) {
+ try {
+ list.wait();
+ } catch (InterruptedException e) {
+ }
+ }
+ return list.remove(0).increment();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/6dbfae85/benchmark/bench/meteor.java
----------------------------------------------------------------------
diff --git a/benchmark/bench/meteor.java b/benchmark/bench/meteor.java
index c3104b6..b5a46b7 100644
--- a/benchmark/bench/meteor.java
+++ b/benchmark/bench/meteor.java
@@ -1,494 +1,494 @@
-/* The Computer Language Shootout
- http://shootout.alioth.debian.org/
-
- contributed by Tony Seebregts
- modified by
-*/
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/** First hack at a Java solver for the meteor puzzle - just the IBM
- * developerWorks article algorithm optimized with precalculated shapes
- * and bitmasks. Should be possible to optimize it some more to take
- * advantage of reflections but its turning out to be less obvious
- * than expected :-).
- * <p>
- * Notes:
- * <ul>
- * <li>Seems to run faster without the -server switch.
- * <li>Testing for islands seems to be slower than just fitting pieces.
- * </ul>
- *
- * @author Tony Seebregts
- *
- */
-
-public class meteor
- { // CONSTANTS
-
- private static final int[] SHIFT = { 0,6,11,17,22,28,33,39,44,50 };
- private static final long[][] MASK = { { 0x01L, 0x02L, 0x04L, 0x08L, 0x10L },
- { 0x01L << 6, 0x02L << 6, 0x04L << 6, 0x08L << 6,0x10L << 6 },
- { 0x01L << 11,0x02L << 11,0x04L << 11,0x08L << 11,0x10L << 11 },
- { 0x01L << 17,0x02L << 17,0x04L << 17,0x08L << 17,0x10L << 17 },
- { 0x01L << 22,0x02L << 22,0x04L << 22,0x08L << 22,0x10L << 22 },
- { 0x01L << 28,0x02L << 28,0x04L << 28,0x08L << 28,0x10L << 28 },
- { 0x01L << 33,0x02L << 33,0x04L << 33,0x08L << 33,0x10L << 33 },
- { 0x01L << 39,0x02L << 39,0x04L << 39,0x08L << 39,0x10L << 39 },
- { 0x01L << 44,0x02L << 44,0x04L << 44,0x08L << 44,0x10L << 44 },
- { 0x01L << 50,0x02L << 50,0x04L << 50,0x08L << 50,0x10L << 50 }
- };
-
- private static final boolean DEBUG = false;
-
- // CLASS VARIABLES
-
- // INSTANCE VARIABLES
-
- private SortedSet<String> solutions = new TreeSet<String>();
- private Entry[] solution = new Entry[10];
- private int depth = 0;
- private Piece[] pieces = { new Piece(PIECE0),
- new Piece(PIECE1),
- new Piece(PIECE2),
- new Piece(PIECE3),
- new Piece(PIECE4),
- new Piece(PIECE5),
- new Piece(PIECE6),
- new Piece(PIECE7),
- new Piece(PIECE8),
- new Piece(PIECE9)
- };
-
- // CLASS METHODS
-
- /** Application entry point.
- *
- * @param args Command line arguments:
- * <ul>
- * <li> solution limit
- * </ul>
- */
-
- public static void main(String[] args)
- { int N = 2098;
-
- // ... parse command line arguments
-
- if (args.length > 0)
- if (args[0].matches("\\d+"))
- N = Integer.parseInt(args[0]);
-
- // ... solve puzzle
-
- meteor puzzle = new meteor ();
- Date start;
- Date end;
- long time;
- SortedSet<String> solutions;
-
- start = new Date();
- solutions = puzzle.solve();
- end = new Date();
- time = end.getTime() - start.getTime();
-
- // ... print result
-
- if (solutions.size() > N)
- System.out.println("ERROR");
- else if (solutions.size() < N)
- System.out.println("TIMEOUT");
- else
- { if (DEBUG)
- { System.out.println("START : " + start);
- System.out.println("END : " + end);
- System.out.println("TIME : " + time);
- System.out.println("SOLUTIONS: " + solutions.size ());
- System.out.println("FIRST : " + solutions.first());
- System.out.println("LAST : " + solutions.last ());
- System.out.println();
- }
-
- System.out.print(solutions.size () + " solutions found\n\n");
- print(solutions.first());
- System.out.print("\n");
- print(solutions.last ());
- System.out.print("\n");
- }
- }
-
- /** Prints out the puzzle.
- *
- *
- */
-
- private static void print (String solution)
- { System.out.print(solution.replaceAll("(\\d{5})(\\d{5})","$1 $2")
- .replaceAll("(\\d{5})","$1\n")
- .replaceAll("(\\d)","$1 "));
- }
-
- // CONSTRUCTORS
-
- /** Initialises the puzzle.
- *
- */
-
- public meteor ()
- { for (int i=0; i<10; i++)
- solution[i] = new Entry();
- }
-
- // INSTANCE METHODS
-
- /** Initialises the puzzle and solution set at [0,0]
- *
- * @return Sorted list of solution strings.
- */
-
- private SortedSet<String> solve()
- { solve(0x0002004008010020L,0,0);
-
- return solutions;
- }
-
- /** Recursively solves the puzzle by fitting pieces into the
- * next available hexagon.
- *
- * @param puzzle Current puzzle bitmask.
- * @param row Row of next available hexagon.
- * @param col Column next available hexagon.
- *
- */
-
- private void solve (long puzzle,int row,int col)
- { for (int ix=0; ix<pieces.length; ix++)
- { Piece piece;
- Shape[] list;
-
- // ... find shapes that fit
-
- if ((piece = pieces[ix]) == null)
- continue;
- else
- list = pieces[ix].shapes(row,col);
-
- for (Shape shape: list)
- { // ... fits badly ?
-
- if ((shape.bitmap & puzzle) != 0)
- continue;
-
- // ... try piece in puzzle
-
- long clone = puzzle | shape.bitmap;
-
- // ... find next position
-
- int irow = row;
- int icol = col/2 + 1;
-
- next:
- while (irow < 10)
- { while (icol < 5)
- { if ((clone & MASK[irow][icol]) == 0)
- break next;
-
- icol++;
- }
-
- irow++;
- icol = 0;
- }
-
- // ... solve next
-
- Entry entry;
-
- pieces[ix] = null;
- entry = solution[depth++];
- entry.row = row;
- entry.col = col;
- entry.shape = shape;
-
- if (depth == 10)
- solutions.add(serialize(solution));
- else
- solve (clone,irow,2*icol + (irow % 2));
-
- depth--;
- pieces[ix] = piece;
- }
- }
- }
-
- /** Serializes the current solution to a string.
- *
- */
-
- private String serialize (Entry[] solution)
- { char[] puzzle = new char[50];
- Shape shape;
- int row;
- int col;
-
- for (Entry entry: solution)
- { shape = entry.shape;
- row = entry.row;
- col = entry.col;
-
- for (int[] xy: shape.vector)
- puzzle[5 * (row + xy[0]) + (col + xy[1])/2] = shape.symbol;
- }
-
- return new String(puzzle);
- }
-
- // INNER CLASSES
-
- /** Container class for a solution set entry.
- *
- */
-
- private static class Entry
- { public int row;
- public int col;
- public Shape shape;
- }
-
- /** Container class for the shapes for a single puzzle piece.
- *
- *
- */
-
- private static class Piece
- { private Shape[][][] shapes = new Shape[10][10][];
-
- @SuppressWarnings("unchecked")
- private Piece (Shape[] list)
- { // ... initialise
-
- ArrayList[][] array = new ArrayList[10][10];
-
- for (int i=0; i<10; i++)
- for (int j=0; j<10; j++)
- array[i][j] = new ArrayList<Shape>();
-
- // ... generate list
-
- for (Shape mutant: list)
- for (int row=0; row<=mutant.maxRow; row++)
- for (int col=mutant.minCol; col<=mutant.maxCol; col++)
- { if (!mutant.islet)
- array[row][col].add(new Shape(mutant,row,col));
- else if ((row != 0) || (col != 0))
- array[row][col].add(new Shape(mutant,row,col));
- }
-
- for (int row=0; row<10; row++)
- for (int col=0; col<10; col++)
- shapes[row][col] = (Shape[]) array[row][col].toArray(new Shape[0]);
- }
-
- @SuppressWarnings("unchecked")
- private Shape[] shapes(int row,int col)
- { return shapes[row][col];
- }
-
- }
-
- /** Container class for the shape vector and bitmap single puzzle piece mutation.
- *
- *
- */
-
- private static class Shape
- { private char symbol;
- private int[][] vector;
- private long bitmap;
- private int shift;
-
- private boolean islet;
- private int maxRow;
- private int minCol;
- private int maxCol;
-
- private Shape (char symbol,
- int[][] vector,
- long bitmap,
- int shift,
- boolean islet,
- int maxRow,
- int minCol,
- int maxCol)
- { this.symbol = symbol;
- this.vector = vector;
- this.bitmap = bitmap;
- this.shift = shift;
-
- this.islet = islet;
- this.maxRow = maxRow;
- this.minCol = minCol;
- this.maxCol = maxCol;
- }
-
- private Shape (Shape shape,
- int row,
- int col)
- { this.symbol = shape.symbol;
- this.vector = shape.vector;
- this.bitmap = shape.bitmap << ((SHIFT[row] + (col - (row % 2))/2) - shape.shift);
-
- this.islet = shape.islet;
- this.maxRow = shape.maxRow;
- this.minCol = shape.minCol;
- this.maxCol = shape.maxCol;
- }
- }
-
- // PIECES
-
- private static final Shape[] PIECE0 = { new Shape ('0',new int[][] {{3, 5},{2, 4},{1, 3},{0, 2},{0, 0}},0x0000000000082083L,0,false,6,0,4),
- new Shape ('0',new int[][] {{4,-2},{3,-1},{2, 0},{1, 1},{0, 0}},0x0000000000421082L,1,false,5,2,8),
- new Shape ('0',new int[][] {{1,-7},{1,-5},{1,-3},{1,-1},{0, 0}},0x00000000000003D0L,4,false,8,7,9),
- new Shape ('0',new int[][] {{0, 0},{1, 1},{2, 2},{3, 3},{3, 5}},0x00000000000C1041L,0,false,6,0,4),
- new Shape ('0',new int[][] {{0, 0},{1,-1},{2,-2},{3,-3},{4,-2}},0x0000000000821084L,2,false,5,3,9),
- new Shape ('0',new int[][] {{0, 6},{0, 4},{0, 2},{0, 0},{1,-1}},0x000000000000005EL,1,false,8,1,3),
- new Shape ('0',new int[][] {{0, 0},{1, 1},{2, 2},{3, 3},{4, 2}},0x0000000000841041L,0,false,5,0,6),
- new Shape ('0',new int[][] {{0, 0},{1,-1},{2,-2},{3,-3},{3,-5}},0x0000000000062108L,3,false,6,5,9),
- new Shape ('0',new int[][] {{1, 7},{1, 5},{1, 3},{1, 1},{0, 0}},0x00000000000003C1L,0,false,8,0,2),
- new Shape ('0',new int[][] {{4, 2},{3, 1},{2, 0},{1,-1},{0, 0}},0x0000000001041042L,1,false,5,1,7),
- new Shape ('0',new int[][] {{3,-3},{2,-2},{1,-1},{0, 0},{0, 2}},0x000000000002108CL,2,false,6,3,7),
- new Shape ('0',new int[][] {{0, 0},{0, 2},{0, 4},{0, 6},{1, 7}},0x000000000000020FL,0,false,8,0,2)
- };
-
- private static final Shape[] PIECE1 = { new Shape ('1',new int[][] {{0, 2},{0, 0},{1,-1},{2, 0},{3,-1}},0x0000000000021046L,1,false,6,1,7),
- new Shape ('1',new int[][] {{1, 3},{0, 2},{0, 0},{1,-1},{1,-3}},0x00000000000002CCL,2,false,8,3,6),
- new Shape ('1',new int[][] {{3, 3},{2, 4},{1, 3},{1, 1},{0, 0}},0x00000000000420C1L,0,false,6,0,5),
- new Shape ('1',new int[][] {{3,-3},{3,-1},{2, 0},{1,-1},{0, 0}},0x0000000000062084L,2,false,6,3,9),
- new Shape ('1',new int[][] {{0, 0},{1, 1},{1, 3},{0, 4},{0, 6}},0x00000000000000CDL,0,true, 8,0,3),
- new Shape ('1',new int[][] {{0, 0},{1,-1},{2, 0},{2, 2},{3, 3}},0x0000000000083042L,1,false,6,1,6),
- new Shape ('1',new int[][] {{0, 6},{1, 5},{1, 3},{0, 2},{0, 0}},0x000000000000018BL,0,true, 8,0,3),
- new Shape ('1',new int[][] {{3, 3},{3, 1},{2, 0},{1, 1},{0, 0}},0x0000000000060841L,0,false,6,0,6),
- new Shape ('1',new int[][] {{3,-3},{2,-4},{1,-3},{1,-1},{0, 0}},0x00000000000208C4L,2,false,6,4,9),
- new Shape ('1',new int[][] {{1,-1},{0, 0},{0, 2},{1, 3},{1, 5}},0x0000000000000346L,1,false,8,1,4),
- new Shape ('1',new int[][] {{0, 0},{0, 2},{1, 3},{2, 2},{3, 3}},0x0000000000041083L,0,false,6,0,6),
- new Shape ('1',new int[][] {{0, 0},{1, 1},{2, 0},{2,-2},{3,-3}},0x0000000000023104L,2,false,6,3,8)
- };
-
- private static final Shape[] PIECE2 = { new Shape ('2',new int[][] {{1, 1},{0, 0},{2, 0},{2,-2},{2,-4}},0x0000000000003904L,2,false,7,4,8),
- new Shape ('2',new int[][] {{2, 4},{1, 5},{2, 2},{1, 1},{0, 0}},0x0000000000003141L,0,false,7,0,4),
- new Shape ('2',new int[][] {{3,-1},{3, 1},{2,-2},{1,-1},{0, 0}},0x0000000000060842L,1,false,6,2,8),
- new Shape ('2',new int[][] {{1,-1},{2, 0},{0, 0},{0, 2},{0, 4}},0x000000000000104EL,1,false,7,1,5),
- new Shape ('2',new int[][] {{0, 0},{1,-1},{0, 2},{1, 3},{2, 4}},0x0000000000004146L,1,false,7,1,5),
- new Shape ('2',new int[][] {{0, 2},{0, 0},{1, 3},{2, 2},{3, 1}},0x0000000000021083L,0,true, 6,0,6),
- new Shape ('2',new int[][] {{0, 2},{1, 3},{0, 0},{1,-1},{2,-2}},0x0000000000000946L,1,false,7,2,6),
- new Shape ('2',new int[][] {{1, 5},{2, 4},{0, 4},{0, 2},{0, 0}},0x0000000000002107L,0,false,7,0,4),
- new Shape ('2',new int[][] {{3, 1},{3,-1},{2, 2},{1, 1},{0, 0}},0x0000000000062082L,1,false,6,1,7),
- new Shape ('2',new int[][] {{2,-4},{1,-5},{2,-2},{1,-1},{0, 0}},0x0000000000003148L,3,false,7,5,9),
- new Shape ('2',new int[][] {{1,-1},{0, 0},{2, 0},{2, 2},{2, 4}},0x0000000000007042L,1,false,7,1,5),
- new Shape ('2',new int[][] {{0, 0},{0, 2},{1,-1},{2, 0},{3, 1}},0x0000000000041046L,1,false,6,1,7)
- };
-
- private static final Shape[] PIECE3 = { new Shape ('3',new int[][] {{0, 0},{2, 0},{1,-1},{2,-2},{2,-4}},0x0000000000003884L,2,false,7,4,9),
- new Shape ('3',new int[][] {{1, 5},{2, 2},{1, 3},{1, 1},{0, 0}},0x00000000000011C1L,0,false,7,0,4),
- new Shape ('3',new int[][] {{3, 1},{2,-2},{2, 0},{1,-1},{0, 0}},0x0000000000041842L,1,false,6,2,8),
- new Shape ('3',new int[][] {{2, 0},{0, 0},{1, 1},{0, 2},{0, 4}},0x0000000000000847L,0,false,7,0,5),
- new Shape ('3',new int[][] {{1,-3},{0, 0},{1,-1},{1, 1},{2, 2}},0x00000000000041C4L,2,false,7,3,7),
- new Shape ('3',new int[][] {{0, 0},{1, 3},{1, 1},{2, 2},{3, 1}},0x00000000000210C1L,0,true, 6,0,6),
- new Shape ('3',new int[][] {{1, 3},{0, 0},{1, 1},{1,-1},{2,-2}},0x00000000000009C2L,1,false,7,2,6),
- new Shape ('3',new int[][] {{2, 4},{0, 4},{1, 3},{0, 2},{0, 0}},0x0000000000002087L,0,false,7,0,5),
- new Shape ('3',new int[][] {{3,-1},{2, 2},{2, 0},{1, 1},{0, 0}},0x0000000000023082L,1,false,6,1,7),
- new Shape ('3',new int[][] {{1,-5},{2,-2},{1,-3},{1,-1},{0, 0}},0x00000000000021C8L,3,false,7,5,9),
- new Shape ('3',new int[][] {{0, 0},{2, 0},{1, 1},{2, 2},{2, 4}},0x0000000000003841L,0,false,7,0,5),
- new Shape ('3',new int[][] {{0, 0},{1,-3},{1,-1},{2,-2},{3,-1}},0x00000000000410C4L,2,false,6,3,9)
- };
-
- private static final Shape[] PIECE4 = { new Shape ('4',new int[][] {{1, 5},{2, 2},{1, 3},{0, 2},{0, 0}},0x0000000000001183L,0,false,7,0,4),
- new Shape ('4',new int[][] {{3, 1},{2,-2},{2, 0},{1, 1},{0, 0}},0x0000000000041882L,1,false,6,2,8),
- new Shape ('4',new int[][] {{2, 0},{0, 0},{1, 1},{1, 3},{0, 4}},0x00000000000008C5L,0,true, 7,0,5),
- new Shape ('4',new int[][] {{1,-3},{0, 0},{1,-1},{2, 0},{2, 2}},0x00000000000060C4L,2,false,7,3,7),
- new Shape ('4',new int[][] {{0, 0},{1, 3},{1, 1},{2, 0},{3, 1}},0x00000000000208C1L,0,false,6,0,6),
- new Shape ('4',new int[][] {{0, 0},{2, 0},{1,-1},{1,-3},{2,-4}},0x00000000000028C4L,2,false,7,4,9),
- new Shape ('4',new int[][] {{0, 0},{1,-3},{1,-1},{2, 0},{3,-1}},0x00000000000420C4L,2,false,6,3,9),
- new Shape ('4',new int[][] {{1, 3},{0, 0},{1, 1},{2, 0},{2,-2}},0x0000000000001982L,1,false,7,2,6),
- new Shape ('4',new int[][] {{2, 4},{0, 4},{1, 3},{1, 1},{0, 0}},0x00000000000020C5L,0,true, 7,0,5),
- new Shape ('4',new int[][] {{3,-1},{2, 2},{2, 0},{1,-1},{0, 0}},0x0000000000023042L,1,false,6,1,7),
- new Shape ('4',new int[][] {{1,-3},{2, 0},{1,-1},{0, 0},{0, 2}},0x00000000000020CCL,2,false,7,3,7),
- new Shape ('4',new int[][] {{0, 0},{2, 0},{1, 1},{1, 3},{2, 4}},0x00000000000028C1L,0,false,7,0,5)
- };
-
- private static final Shape[] PIECE5 = { new Shape ('5',new int[][] {{0, 2},{1, 1},{0, 0},{1,-1},{2,-2}},0x00000000000008C6L,1,false,7,2,7),
- new Shape ('5',new int[][] {{1, 5},{1, 3},{0, 4},{0, 2},{0, 0}},0x0000000000000187L,0,false,8,0,4),
- new Shape ('5',new int[][] {{3, 1},{2, 0},{2, 2},{1, 1},{0, 0}},0x0000000000021841L,0,false,6,0,7),
- new Shape ('5',new int[][] {{2,-4},{1,-3},{2,-2},{1,-1},{0, 0}},0x00000000000018C4L,2,false,7,4,9),
- new Shape ('5',new int[][] {{0, 0},{0, 2},{1, 1},{1, 3},{1, 5}},0x00000000000001C3L,0,false,8,0,4),
- new Shape ('5',new int[][] {{0, 0},{1, 1},{1,-1},{2, 0},{3, 1}},0x00000000000410C2L,1,false,6,1,8),
- new Shape ('5',new int[][] {{0, 2},{0, 0},{1, 1},{1,-1},{1,-3}},0x00000000000001CCL,2,false,8,3,7),
- new Shape ('5',new int[][] {{2, 4},{1, 3},{2, 2},{1, 1},{0, 0}},0x00000000000030C1L,0,false,7,0,5),
- new Shape ('5',new int[][] {{3,-1},{2, 0},{2,-2},{1,-1},{0, 0}},0x0000000000021842L,1,false,6,2,9),
- new Shape ('5',new int[][] {{1,-1},{1, 1},{0, 0},{0, 2},{0, 4}},0x00000000000000CEL,1,false,8,1,5),
- new Shape ('5',new int[][] {{0, 0},{1, 1},{0, 2},{1, 3},{2, 4}},0x00000000000020C3L,0,false,7,0,5),
- new Shape ('5',new int[][] {{0, 0},{1,-1},{1, 1},{2, 0},{3,-1}},0x00000000000210C2L,1,false,6,1,8)
- };
-
- private static final Shape[] PIECE6 = { new Shape ('6',new int[][] {{1, 1},{0, 0},{1,-1},{1,-3},{2,-4}},0x00000000000009C4L,2,false,7,4,8),
- new Shape ('6',new int[][] {{2, 4},{1, 5},{1, 3},{0, 2},{0, 0}},0x0000000000002183L,0,false,7,0,4),
- new Shape ('6',new int[][] {{3,-1},{3, 1},{2, 0},{1, 1},{0, 0}},0x0000000000061082L,1,false,6,1,8),
- new Shape ('6',new int[][] {{1,-5},{2,-4},{1,-3},{1,-1},{0, 0}},0x00000000000011C8L,3,false,7,5,9),
- new Shape ('6',new int[][] {{0, 0},{1,-1},{1, 1},{2, 2},{2, 4}},0x00000000000060C2L,1,false,7,1,5),
- new Shape ('6',new int[][] {{0, 2},{0, 0},{1, 1},{2, 0},{3, 1}},0x0000000000020843L,0,false,6,0,7),
- new Shape ('6',new int[][] {{0, 0},{1, 1},{1,-1},{2,-2},{2,-4}},0x0000000000001984L,2,false,7,4,8),
- new Shape ('6',new int[][] {{1, 5},{2, 4},{1, 3},{1, 1},{0, 0}},0x00000000000021C1L,0,false,7,0,4),
- new Shape ('6',new int[][] {{3, 1},{3,-1},{2, 0},{1,-1},{0, 0}},0x0000000000061042L,1,false,6,1,8),
- new Shape ('6',new int[][] {{2,-2},{1,-3},{1,-1},{0, 0},{0, 2}},0x00000000000010CCL,2,false,7,3,7),
- new Shape ('6',new int[][] {{1,-1},{0, 0},{1, 1},{1, 3},{2, 4}},0x00000000000041C2L,1,false,7,1,5),
- new Shape ('6',new int[][] {{0, 0},{0, 2},{1, 1},{2, 2},{3, 1}},0x0000000000021043L,0,false,6,0,7)
- };
-
- private static final Shape[] PIECE7 = { new Shape ('7',new int[][] {{0, 2},{1, 1},{0, 0},{2, 0},{2,-2}},0x0000000000001886L,1,false,7,2,7),
- new Shape ('7',new int[][] {{1, 5},{1, 3},{0, 4},{1, 1},{0, 0}},0x00000000000001C5L,0,true, 8,0,4),
- new Shape ('7',new int[][] {{3, 1},{2, 0},{2, 2},{1,-1},{0, 0}},0x0000000000043042L,1,false,6,1,7),
- new Shape ('7',new int[][] {{2,-2},{1,-1},{2, 0},{0, 0},{0, 2}},0x0000000000001846L,1,false,7,2,7),
- new Shape ('7',new int[][] {{0, 0},{0, 2},{1, 1},{0, 4},{1, 5}},0x0000000000000147L,0,false,8,0,4),
- new Shape ('7',new int[][] {{0, 0},{1, 1},{1,-1},{2, 2},{3, 1}},0x00000000000420C2L,1,false,6,1,7),
- new Shape ('7',new int[][] {{0, 4},{0, 2},{1, 3},{0, 0},{1,-1}},0x000000000000014EL,1,false,8,1,5),
- new Shape ('7',new int[][] {{2, 4},{1, 3},{2, 2},{0, 2},{0, 0}},0x0000000000003083L,0,false,7,0,5),
- new Shape ('7',new int[][] {{3,-1},{2, 0},{2,-2},{1, 1},{0, 0}},0x0000000000021882L,1,false,6,2,8),
- new Shape ('7',new int[][] {{1,-1},{1, 1},{0, 0},{1, 3},{0, 4}},0x00000000000001CAL,1,false,8,1,5),
- new Shape ('7',new int[][] {{0, 0},{1, 1},{0, 2},{2, 2},{2, 4}},0x0000000000003043L,0,false,7,0,5),
- new Shape ('7',new int[][] {{0, 0},{1,-1},{1, 1},{2,-2},{3,-1}},0x00000000000208C2L,1,false,6,2,8)
- };
-
- private static final Shape[] PIECE8 = { new Shape ('8',new int[][] {{4, 2},{3, 1},{2, 0},{1, 1},{0, 0}},0x0000000000820841L,0,false,5,0,7),
- new Shape ('8',new int[][] {{3,-5},{2,-4},{1,-3},{1,-1},{0, 0}},0x0000000000021188L,3,false,6,5,9),
- new Shape ('8',new int[][] {{0, 0},{0, 2},{0, 4},{1, 5},{1, 7}},0x0000000000000307L,0,false,8,0,2),
- new Shape ('8',new int[][] {{0, 0},{1, 1},{2, 2},{3, 1},{4, 2}},0x0000000000821041L,0,true, 5,0,7),
- new Shape ('8',new int[][] {{0, 0},{1,-1},{2,-2},{2,-4},{3,-5}},0x0000000000023108L,3,false,6,5,9),
- new Shape ('8',new int[][] {{1, 7},{1, 5},{1, 3},{0, 2},{0, 0}},0x0000000000000383L,0,false,8,0,2),
- new Shape ('8',new int[][] {{0, 0},{1, 1},{2, 2},{2, 4},{3, 5}},0x0000000000083041L,0,false,6,0,4),
- new Shape ('8',new int[][] {{0, 0},{1,-1},{2,-2},{3,-1},{4,-2}},0x0000000000420842L,1,false,5,2,9),
- new Shape ('8',new int[][] {{0, 4},{0, 2},{0, 0},{1,-1},{1,-3}},0x00000000000000DCL,2,false,8,3,5),
- new Shape ('8',new int[][] {{3, 5},{2, 4},{1, 3},{1, 1},{0, 0}},0x00000000000820C1L,0,false,6,0,4),
- new Shape ('8',new int[][] {{4,-2},{3,-1},{2, 0},{1,-1},{0, 0}},0x0000000000421042L,1,false,5,2,9),
- new Shape ('8',new int[][] {{1,-5},{1,-3},{1,-1},{0, 0},{0, 2}},0x00000000000001D8L,3,false,8,5,7)
- };
-
- private static final Shape[] PIECE9 = { new Shape ('9',new int[][] {{3, 3},{2, 2},{1, 1},{0, 0},{0, 2}},0x0000000000041043L,0,false,6,0,6),
- new Shape ('9',new int[][] {{3,-3},{2,-2},{1,-1},{0, 0},{1, 1}},0x0000000000021184L,2,false,6,3,8),
- new Shape ('9',new int[][] {{0, 0},{0, 2},{0, 4},{0, 6},{1, 5}},0x000000000000010FL,0,false,8,0,3),
- new Shape ('9',new int[][] {{0, 0},{1, 1},{2, 2},{3, 3},{3, 1}},0x0000000000061041L,0,true, 6,0,6),
- new Shape ('9',new int[][] {{0, 0},{1,-1},{2,-2},{3,-3},{2,-4}},0x0000000000021884L,2,false,6,4,9),
- new Shape ('9',new int[][] {{1, 5},{1, 3},{1, 1},{1,-1},{0, 0}},0x00000000000003C2L,1,false,8,1,4),
- new Shape ('9',new int[][] {{0, 0},{1, 1},{2, 2},{3, 3},{2, 4}},0x0000000000043041L,0,false,6,0,5),
- new Shape ('9',new int[][] {{0, 0},{1,-1},{2,-2},{3,-3},{3,-1}},0x0000000000061084L,2,false,6,3,9),
- new Shape ('9',new int[][] {{0, 6},{0, 4},{0, 2},{0, 0},{1, 1}},0x000000000000004FL,0,false,8,0,3),
- new Shape ('9',new int[][] {{3, 3},{2, 2},{1, 1},{0, 0},{1,-1}},0x00000000000820C2L,1,false,6,1,6),
- new Shape ('9',new int[][] {{3,-1},{2, 0},{1, 1},{0, 2},{0, 0}},0x0000000000021086L,1,false,6,1,7),
- new Shape ('9',new int[][] {{1,-5},{1,-3},{1,-1},{1, 1},{0, 0}},0x00000000000003C8L,3,false,8,5,8)
- };
-
- }
+/* The Computer Language Shootout
+ http://shootout.alioth.debian.org/
+
+ contributed by Tony Seebregts
+ modified by
+*/
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/** First hack at a Java solver for the meteor puzzle - just the IBM
+ * developerWorks article algorithm optimized with precalculated shapes
+ * and bitmasks. Should be possible to optimize it some more to take
+ * advantage of reflections but its turning out to be less obvious
+ * than expected :-).
+ * <p>
+ * Notes:
+ * <ul>
+ * <li>Seems to run faster without the -server switch.
+ * <li>Testing for islands seems to be slower than just fitting pieces.
+ * </ul>
+ *
+ * @author Tony Seebregts
+ *
+ */
+
+public class meteor
+ { // CONSTANTS
+
+ private static final int[] SHIFT = { 0,6,11,17,22,28,33,39,44,50 };
+ private static final long[][] MASK = { { 0x01L, 0x02L, 0x04L, 0x08L, 0x10L },
+ { 0x01L << 6, 0x02L << 6, 0x04L << 6, 0x08L << 6,0x10L << 6 },
+ { 0x01L << 11,0x02L << 11,0x04L << 11,0x08L << 11,0x10L << 11 },
+ { 0x01L << 17,0x02L << 17,0x04L << 17,0x08L << 17,0x10L << 17 },
+ { 0x01L << 22,0x02L << 22,0x04L << 22,0x08L << 22,0x10L << 22 },
+ { 0x01L << 28,0x02L << 28,0x04L << 28,0x08L << 28,0x10L << 28 },
+ { 0x01L << 33,0x02L << 33,0x04L << 33,0x08L << 33,0x10L << 33 },
+ { 0x01L << 39,0x02L << 39,0x04L << 39,0x08L << 39,0x10L << 39 },
+ { 0x01L << 44,0x02L << 44,0x04L << 44,0x08L << 44,0x10L << 44 },
+ { 0x01L << 50,0x02L << 50,0x04L << 50,0x08L << 50,0x10L << 50 }
+ };
+
+ private static final boolean DEBUG = false;
+
+ // CLASS VARIABLES
+
+ // INSTANCE VARIABLES
+
+ private SortedSet<String> solutions = new TreeSet<String>();
+ private Entry[] solution = new Entry[10];
+ private int depth = 0;
+ private Piece[] pieces = { new Piece(PIECE0),
+ new Piece(PIECE1),
+ new Piece(PIECE2),
+ new Piece(PIECE3),
+ new Piece(PIECE4),
+ new Piece(PIECE5),
+ new Piece(PIECE6),
+ new Piece(PIECE7),
+ new Piece(PIECE8),
+ new Piece(PIECE9)
+ };
+
+ // CLASS METHODS
+
+ /** Application entry point.
+ *
+ * @param args Command line arguments:
+ * <ul>
+ * <li> solution limit
+ * </ul>
+ */
+
+ public static void main(String[] args)
+ { int N = 2098;
+
+ // ... parse command line arguments
+
+ if (args.length > 0)
+ if (args[0].matches("\\d+"))
+ N = Integer.parseInt(args[0]);
+
+ // ... solve puzzle
+
+ meteor puzzle = new meteor ();
+ Date start;
+ Date end;
+ long time;
+ SortedSet<String> solutions;
+
+ start = new Date();
+ solutions = puzzle.solve();
+ end = new Date();
+ time = end.getTime() - start.getTime();
+
+ // ... print result
+
+ if (solutions.size() > N)
+ System.out.println("ERROR");
+ else if (solutions.size() < N)
+ System.out.println("TIMEOUT");
+ else
+ { if (DEBUG)
+ { System.out.println("START : " + start);
+ System.out.println("END : " + end);
+ System.out.println("TIME : " + time);
+ System.out.println("SOLUTIONS: " + solutions.size ());
+ System.out.println("FIRST : " + solutions.first());
+ System.out.println("LAST : " + solutions.last ());
+ System.out.println();
+ }
+
+ System.out.print(solutions.size () + " solutions found\n\n");
+ print(solutions.first());
+ System.out.print("\n");
+ print(solutions.last ());
+ System.out.print("\n");
+ }
+ }
+
+ /** Prints out the puzzle.
+ *
+ *
+ */
+
+ private static void print (String solution)
+ { System.out.print(solution.replaceAll("(\\d{5})(\\d{5})","$1 $2")
+ .replaceAll("(\\d{5})","$1\n")
+ .replaceAll("(\\d)","$1 "));
+ }
+
+ // CONSTRUCTORS
+
+ /** Initialises the puzzle.
+ *
+ */
+
+ public meteor ()
+ { for (int i=0; i<10; i++)
+ solution[i] = new Entry();
+ }
+
+ // INSTANCE METHODS
+
+ /** Initialises the puzzle and solution set at [0,0]
+ *
+ * @return Sorted list of solution strings.
+ */
+
+ private SortedSet<String> solve()
+ { solve(0x0002004008010020L,0,0);
+
+ return solutions;
+ }
+
+ /** Recursively solves the puzzle by fitting pieces into the
+ * next available hexagon.
+ *
+ * @param puzzle Current puzzle bitmask.
+ * @param row Row of next available hexagon.
+ * @param col Column next available hexagon.
+ *
+ */
+
+ private void solve (long puzzle,int row,int col)
+ { for (int ix=0; ix<pieces.length; ix++)
+ { Piece piece;
+ Shape[] list;
+
+ // ... find shapes that fit
+
+ if ((piece = pieces[ix]) == null)
+ continue;
+ else
+ list = pieces[ix].shapes(row,col);
+
+ for (Shape shape: list)
+ { // ... fits badly ?
+
+ if ((shape.bitmap & puzzle) != 0)
+ continue;
+
+ // ... try piece in puzzle
+
+ long clone = puzzle | shape.bitmap;
+
+ // ... find next position
+
+ int irow = row;
+ int icol = col/2 + 1;
+
+ next:
+ while (irow < 10)
+ { while (icol < 5)
+ { if ((clone & MASK[irow][icol]) == 0)
+ break next;
+
+ icol++;
+ }
+
+ irow++;
+ icol = 0;
+ }
+
+ // ... solve next
+
+ Entry entry;
+
+ pieces[ix] = null;
+ entry = solution[depth++];
+ entry.row = row;
+ entry.col = col;
+ entry.shape = shape;
+
+ if (depth == 10)
+ solutions.add(serialize(solution));
+ else
+ solve (clone,irow,2*icol + (irow % 2));
+
+ depth--;
+ pieces[ix] = piece;
+ }
+ }
+ }
+
+ /** Serializes the current solution to a string.
+ *
+ */
+
+ private String serialize (Entry[] solution)
+ { char[] puzzle = new char[50];
+ Shape shape;
+ int row;
+ int col;
+
+ for (Entry entry: solution)
+ { shape = entry.shape;
+ row = entry.row;
+ col = entry.col;
+
+ for (int[] xy: shape.vector)
+ puzzle[5 * (row + xy[0]) + (col + xy[1])/2] = shape.symbol;
+ }
+
+ return new String(puzzle);
+ }
+
+ // INNER CLASSES
+
+ /** Container class for a solution set entry.
+ *
+ */
+
+ private static class Entry
+ { public int row;
+ public int col;
+ public Shape shape;
+ }
+
+ /** Container class for the shapes for a single puzzle piece.
+ *
+ *
+ */
+
+ private static class Piece
+ { private Shape[][][] shapes = new Shape[10][10][];
+
+ @SuppressWarnings("unchecked")
+ private Piece (Shape[] list)
+ { // ... initialise
+
+ ArrayList[][] array = new ArrayList[10][10];
+
+ for (int i=0; i<10; i++)
+ for (int j=0; j<10; j++)
+ array[i][j] = new ArrayList<Shape>();
+
+ // ... generate list
+
+ for (Shape mutant: list)
+ for (int row=0; row<=mutant.maxRow; row++)
+ for (int col=mutant.minCol; col<=mutant.maxCol; col++)
+ { if (!mutant.islet)
+ array[row][col].add(new Shape(mutant,row,col));
+ else if ((row != 0) || (col != 0))
+ array[row][col].add(new Shape(mutant,row,col));
+ }
+
+ for (int row=0; row<10; row++)
+ for (int col=0; col<10; col++)
+ shapes[row][col] = (Shape[]) array[row][col].toArray(new Shape[0]);
+ }
+
+ @SuppressWarnings("unchecked")
+ private Shape[] shapes(int row,int col)
+ { return shapes[row][col];
+ }
+
+ }
+
+ /** Container class for the shape vector and bitmap single puzzle piece mutation.
+ *
+ *
+ */
+
+ private static class Shape
+ { private char symbol;
+ private int[][] vector;
+ private long bitmap;
+ private int shift;
+
+ private boolean islet;
+ private int maxRow;
+ private int minCol;
+ private int maxCol;
+
+ private Shape (char symbol,
+ int[][] vector,
+ long bitmap,
+ int shift,
+ boolean islet,
+ int maxRow,
+ int minCol,
+ int maxCol)
+ { this.symbol = symbol;
+ this.vector = vector;
+ this.bitmap = bitmap;
+ this.shift = shift;
+
+ this.islet = islet;
+ this.maxRow = maxRow;
+ this.minCol = minCol;
+ this.maxCol = maxCol;
+ }
+
+ private Shape (Shape shape,
+ int row,
+ int col)
+ { this.symbol = shape.symbol;
+ this.vector = shape.vector;
+ this.bitmap = shape.bitmap << ((SHIFT[row] + (col - (row % 2))/2) - shape.shift);
+
+ this.islet = shape.islet;
+ this.maxRow = shape.maxRow;
+ this.minCol = shape.minCol;
+ this.maxCol = shape.maxCol;
+ }
+ }
+
+ // PIECES
+
+ private static final Shape[] PIECE0 = { new Shape ('0',new int[][] {{3, 5},{2, 4},{1, 3},{0, 2},{0, 0}},0x0000000000082083L,0,false,6,0,4),
+ new Shape ('0',new int[][] {{4,-2},{3,-1},{2, 0},{1, 1},{0, 0}},0x0000000000421082L,1,false,5,2,8),
+ new Shape ('0',new int[][] {{1,-7},{1,-5},{1,-3},{1,-1},{0, 0}},0x00000000000003D0L,4,false,8,7,9),
+ new Shape ('0',new int[][] {{0, 0},{1, 1},{2, 2},{3, 3},{3, 5}},0x00000000000C1041L,0,false,6,0,4),
+ new Shape ('0',new int[][] {{0, 0},{1,-1},{2,-2},{3,-3},{4,-2}},0x0000000000821084L,2,false,5,3,9),
+ new Shape ('0',new int[][] {{0, 6},{0, 4},{0, 2},{0, 0},{1,-1}},0x000000000000005EL,1,false,8,1,3),
+ new Shape ('0',new int[][] {{0, 0},{1, 1},{2, 2},{3, 3},{4, 2}},0x0000000000841041L,0,false,5,0,6),
+ new Shape ('0',new int[][] {{0, 0},{1,-1},{2,-2},{3,-3},{3,-5}},0x0000000000062108L,3,false,6,5,9),
+ new Shape ('0',new int[][] {{1, 7},{1, 5},{1, 3},{1, 1},{0, 0}},0x00000000000003C1L,0,false,8,0,2),
+ new Shape ('0',new int[][] {{4, 2},{3, 1},{2, 0},{1,-1},{0, 0}},0x0000000001041042L,1,false,5,1,7),
+ new Shape ('0',new int[][] {{3,-3},{2,-2},{1,-1},{0, 0},{0, 2}},0x000000000002108CL,2,false,6,3,7),
+ new Shape ('0',new int[][] {{0, 0},{0, 2},{0, 4},{0, 6},{1, 7}},0x000000000000020FL,0,false,8,0,2)
+ };
+
+ private static final Shape[] PIECE1 = { new Shape ('1',new int[][] {{0, 2},{0, 0},{1,-1},{2, 0},{3,-1}},0x0000000000021046L,1,false,6,1,7),
+ new Shape ('1',new int[][] {{1, 3},{0, 2},{0, 0},{1,-1},{1,-3}},0x00000000000002CCL,2,false,8,3,6),
+ new Shape ('1',new int[][] {{3, 3},{2, 4},{1, 3},{1, 1},{0, 0}},0x00000000000420C1L,0,false,6,0,5),
+ new Shape ('1',new int[][] {{3,-3},{3,-1},{2, 0},{1,-1},{0, 0}},0x0000000000062084L,2,false,6,3,9),
+ new Shape ('1',new int[][] {{0, 0},{1, 1},{1, 3},{0, 4},{0, 6}},0x00000000000000CDL,0,true, 8,0,3),
+ new Shape ('1',new int[][] {{0, 0},{1,-1},{2, 0},{2, 2},{3, 3}},0x0000000000083042L,1,false,6,1,6),
+ new Shape ('1',new int[][] {{0, 6},{1, 5},{1, 3},{0, 2},{0, 0}},0x000000000000018BL,0,true, 8,0,3),
+ new Shape ('1',new int[][] {{3, 3},{3, 1},{2, 0},{1, 1},{0, 0}},0x0000000000060841L,0,false,6,0,6),
+ new Shape ('1',new int[][] {{3,-3},{2,-4},{1,-3},{1,-1},{0, 0}},0x00000000000208C4L,2,false,6,4,9),
+ new Shape ('1',new int[][] {{1,-1},{0, 0},{0, 2},{1, 3},{1, 5}},0x0000000000000346L,1,false,8,1,4),
+ new Shape ('1',new int[][] {{0, 0},{0, 2},{1, 3},{2, 2},{3, 3}},0x0000000000041083L,0,false,6,0,6),
+ new Shape ('1',new int[][] {{0, 0},{1, 1},{2, 0},{2,-2},{3,-3}},0x0000000000023104L,2,false,6,3,8)
+ };
+
+ private static final Shape[] PIECE2 = { new Shape ('2',new int[][] {{1, 1},{0, 0},{2, 0},{2,-2},{2,-4}},0x0000000000003904L,2,false,7,4,8),
+ new Shape ('2',new int[][] {{2, 4},{1, 5},{2, 2},{1, 1},{0, 0}},0x0000000000003141L,0,false,7,0,4),
+ new Shape ('2',new int[][] {{3,-1},{3, 1},{2,-2},{1,-1},{0, 0}},0x0000000000060842L,1,false,6,2,8),
+ new Shape ('2',new int[][] {{1,-1},{2, 0},{0, 0},{0, 2},{0, 4}},0x000000000000104EL,1,false,7,1,5),
+ new Shape ('2',new int[][] {{0, 0},{1,-1},{0, 2},{1, 3},{2, 4}},0x0000000000004146L,1,false,7,1,5),
+ new Shape ('2',new int[][] {{0, 2},{0, 0},{1, 3},{2, 2},{3, 1}},0x0000000000021083L,0,true, 6,0,6),
+ new Shape ('2',new int[][] {{0, 2},{1, 3},{0, 0},{1,-1},{2,-2}},0x0000000000000946L,1,false,7,2,6),
+ new Shape ('2',new int[][] {{1, 5},{2, 4},{0, 4},{0, 2},{0, 0}},0x0000000000002107L,0,false,7,0,4),
+ new Shape ('2',new int[][] {{3, 1},{3,-1},{2, 2},{1, 1},{0, 0}},0x0000000000062082L,1,false,6,1,7),
+ new Shape ('2',new int[][] {{2,-4},{1,-5},{2,-2},{1,-1},{0, 0}},0x0000000000003148L,3,false,7,5,9),
+ new Shape ('2',new int[][] {{1,-1},{0, 0},{2, 0},{2, 2},{2, 4}},0x0000000000007042L,1,false,7,1,5),
+ new Shape ('2',new int[][] {{0, 0},{0, 2},{1,-1},{2, 0},{3, 1}},0x0000000000041046L,1,false,6,1,7)
+ };
+
+ private static final Shape[] PIECE3 = { new Shape ('3',new int[][] {{0, 0},{2, 0},{1,-1},{2,-2},{2,-4}},0x0000000000003884L,2,false,7,4,9),
+ new Shape ('3',new int[][] {{1, 5},{2, 2},{1, 3},{1, 1},{0, 0}},0x00000000000011C1L,0,false,7,0,4),
+ new Shape ('3',new int[][] {{3, 1},{2,-2},{2, 0},{1,-1},{0, 0}},0x0000000000041842L,1,false,6,2,8),
+ new Shape ('3',new int[][] {{2, 0},{0, 0},{1, 1},{0, 2},{0, 4}},0x0000000000000847L,0,false,7,0,5),
+ new Shape ('3',new int[][] {{1,-3},{0, 0},{1,-1},{1, 1},{2, 2}},0x00000000000041C4L,2,false,7,3,7),
+ new Shape ('3',new int[][] {{0, 0},{1, 3},{1, 1},{2, 2},{3, 1}},0x00000000000210C1L,0,true, 6,0,6),
+ new Shape ('3',new int[][] {{1, 3},{0, 0},{1, 1},{1,-1},{2,-2}},0x00000000000009C2L,1,false,7,2,6),
+ new Shape ('3',new int[][] {{2, 4},{0, 4},{1, 3},{0, 2},{0, 0}},0x0000000000002087L,0,false,7,0,5),
+ new Shape ('3',new int[][] {{3,-1},{2, 2},{2, 0},{1, 1},{0, 0}},0x0000000000023082L,1,false,6,1,7),
+ new Shape ('3',new int[][] {{1,-5},{2,-2},{1,-3},{1,-1},{0, 0}},0x00000000000021C8L,3,false,7,5,9),
+ new Shape ('3',new int[][] {{0, 0},{2, 0},{1, 1},{2, 2},{2, 4}},0x0000000000003841L,0,false,7,0,5),
+ new Shape ('3',new int[][] {{0, 0},{1,-3},{1,-1},{2,-2},{3,-1}},0x00000000000410C4L,2,false,6,3,9)
+ };
+
+ private static final Shape[] PIECE4 = { new Shape ('4',new int[][] {{1, 5},{2, 2},{1, 3},{0, 2},{0, 0}},0x0000000000001183L,0,false,7,0,4),
+ new Shape ('4',new int[][] {{3, 1},{2,-2},{2, 0},{1, 1},{0, 0}},0x0000000000041882L,1,false,6,2,8),
+ new Shape ('4',new int[][] {{2, 0},{0, 0},{1, 1},{1, 3},{0, 4}},0x00000000000008C5L,0,true, 7,0,5),
+ new Shape ('4',new int[][] {{1,-3},{0, 0},{1,-1},{2, 0},{2, 2}},0x00000000000060C4L,2,false,7,3,7),
+ new Shape ('4',new int[][] {{0, 0},{1, 3},{1, 1},{2, 0},{3, 1}},0x00000000000208C1L,0,false,6,0,6),
+ new Shape ('4',new int[][] {{0, 0},{2, 0},{1,-1},{1,-3},{2,-4}},0x00000000000028C4L,2,false,7,4,9),
+ new Shape ('4',new int[][] {{0, 0},{1,-3},{1,-1},{2, 0},{3,-1}},0x00000000000420C4L,2,false,6,3,9),
+ new Shape ('4',new int[][] {{1, 3},{0, 0},{1, 1},{2, 0},{2,-2}},0x0000000000001982L,1,false,7,2,6),
+ new Shape ('4',new int[][] {{2, 4},{0, 4},{1, 3},{1, 1},{0, 0}},0x00000000000020C5L,0,true, 7,0,5),
+ new Shape ('4',new int[][] {{3,-1},{2, 2},{2, 0},{1,-1},{0, 0}},0x0000000000023042L,1,false,6,1,7),
+ new Shape ('4',new int[][] {{1,-3},{2, 0},{1,-1},{0, 0},{0, 2}},0x00000000000020CCL,2,false,7,3,7),
+ new Shape ('4',new int[][] {{0, 0},{2, 0},{1, 1},{1, 3},{2, 4}},0x00000000000028C1L,0,false,7,0,5)
+ };
+
+ private static final Shape[] PIECE5 = { new Shape ('5',new int[][] {{0, 2},{1, 1},{0, 0},{1,-1},{2,-2}},0x00000000000008C6L,1,false,7,2,7),
+ new Shape ('5',new int[][] {{1, 5},{1, 3},{0, 4},{0, 2},{0, 0}},0x0000000000000187L,0,false,8,0,4),
+ new Shape ('5',new int[][] {{3, 1},{2, 0},{2, 2},{1, 1},{0, 0}},0x0000000000021841L,0,false,6,0,7),
+ new Shape ('5',new int[][] {{2,-4},{1,-3},{2,-2},{1,-1},{0, 0}},0x00000000000018C4L,2,false,7,4,9),
+ new Shape ('5',new int[][] {{0, 0},{0, 2},{1, 1},{1, 3},{1, 5}},0x00000000000001C3L,0,false,8,0,4),
+ new Shape ('5',new int[][] {{0, 0},{1, 1},{1,-1},{2, 0},{3, 1}},0x00000000000410C2L,1,false,6,1,8),
+ new Shape ('5',new int[][] {{0, 2},{0, 0},{1, 1},{1,-1},{1,-3}},0x00000000000001CCL,2,false,8,3,7),
+ new Shape ('5',new int[][] {{2, 4},{1, 3},{2, 2},{1, 1},{0, 0}},0x00000000000030C1L,0,false,7,0,5),
+ new Shape ('5',new int[][] {{3,-1},{2, 0},{2,-2},{1,-1},{0, 0}},0x0000000000021842L,1,false,6,2,9),
+ new Shape ('5',new int[][] {{1,-1},{1, 1},{0, 0},{0, 2},{0, 4}},0x00000000000000CEL,1,false,8,1,5),
+ new Shape ('5',new int[][] {{0, 0},{1, 1},{0, 2},{1, 3},{2, 4}},0x00000000000020C3L,0,false,7,0,5),
+ new Shape ('5',new int[][] {{0, 0},{1,-1},{1, 1},{2, 0},{3,-1}},0x00000000000210C2L,1,false,6,1,8)
+ };
+
+ private static final Shape[] PIECE6 = { new Shape ('6',new int[][] {{1, 1},{0, 0},{1,-1},{1,-3},{2,-4}},0x00000000000009C4L,2,false,7,4,8),
+ new Shape ('6',new int[][] {{2, 4},{1, 5},{1, 3},{0, 2},{0, 0}},0x0000000000002183L,0,false,7,0,4),
+ new Shape ('6',new int[][] {{3,-1},{3, 1},{2, 0},{1, 1},{0, 0}},0x0000000000061082L,1,false,6,1,8),
+ new Shape ('6',new int[][] {{1,-5},{2,-4},{1,-3},{1,-1},{0, 0}},0x00000000000011C8L,3,false,7,5,9),
+ new Shape ('6',new int[][] {{0, 0},{1,-1},{1, 1},{2, 2},{2, 4}},0x00000000000060C2L,1,false,7,1,5),
+ new Shape ('6',new int[][] {{0, 2},{0, 0},{1, 1},{2, 0},{3, 1}},0x0000000000020843L,0,false,6,0,7),
+ new Shape ('6',new int[][] {{0, 0},{1, 1},{1,-1},{2,-2},{2,-4}},0x0000000000001984L,2,false,7,4,8),
+ new Shape ('6',new int[][] {{1, 5},{2, 4},{1, 3},{1, 1},{0, 0}},0x00000000000021C1L,0,false,7,0,4),
+ new Shape ('6',new int[][] {{3, 1},{3,-1},{2, 0},{1,-1},{0, 0}},0x0000000000061042L,1,false,6,1,8),
+ new Shape ('6',new int[][] {{2,-2},{1,-3},{1,-1},{0, 0},{0, 2}},0x00000000000010CCL,2,false,7,3,7),
+ new Shape ('6',new int[][] {{1,-1},{0, 0},{1, 1},{1, 3},{2, 4}},0x00000000000041C2L,1,false,7,1,5),
+ new Shape ('6',new int[][] {{0, 0},{0, 2},{1, 1},{2, 2},{3, 1}},0x0000000000021043L,0,false,6,0,7)
+ };
+
+ private static final Shape[] PIECE7 = { new Shape ('7',new int[][] {{0, 2},{1, 1},{0, 0},{2, 0},{2,-2}},0x0000000000001886L,1,false,7,2,7),
+ new Shape ('7',new int[][] {{1, 5},{1, 3},{0, 4},{1, 1},{0, 0}},0x00000000000001C5L,0,true, 8,0,4),
+ new Shape ('7',new int[][] {{3, 1},{2, 0},{2, 2},{1,-1},{0, 0}},0x0000000000043042L,1,false,6,1,7),
+ new Shape ('7',new int[][] {{2,-2},{1,-1},{2, 0},{0, 0},{0, 2}},0x0000000000001846L,1,false,7,2,7),
+ new Shape ('7',new int[][] {{0, 0},{0, 2},{1, 1},{0, 4},{1, 5}},0x0000000000000147L,0,false,8,0,4),
+ new Shape ('7',new int[][] {{0, 0},{1, 1},{1,-1},{2, 2},{3, 1}},0x00000000000420C2L,1,false,6,1,7),
+ new Shape ('7',new int[][] {{0, 4},{0, 2},{1, 3},{0, 0},{1,-1}},0x000000000000014EL,1,false,8,1,5),
+ new Shape ('7',new int[][] {{2, 4},{1, 3},{2, 2},{0, 2},{0, 0}},0x0000000000003083L,0,false,7,0,5),
+ new Shape ('7',new int[][] {{3,-1},{2, 0},{2,-2},{1, 1},{0, 0}},0x0000000000021882L,1,false,6,2,8),
+ new Shape ('7',new int[][] {{1,-1},{1, 1},{0, 0},{1, 3},{0, 4}},0x00000000000001CAL,1,false,8,1,5),
+ new Shape ('7',new int[][] {{0, 0},{1, 1},{0, 2},{2, 2},{2, 4}},0x0000000000003043L,0,false,7,0,5),
+ new Shape ('7',new int[][] {{0, 0},{1,-1},{1, 1},{2,-2},{3,-1}},0x00000000000208C2L,1,false,6,2,8)
+ };
+
+ private static final Shape[] PIECE8 = { new Shape ('8',new int[][] {{4, 2},{3, 1},{2, 0},{1, 1},{0, 0}},0x0000000000820841L,0,false,5,0,7),
+ new Shape ('8',new int[][] {{3,-5},{2,-4},{1,-3},{1,-1},{0, 0}},0x0000000000021188L,3,false,6,5,9),
+ new Shape ('8',new int[][] {{0, 0},{0, 2},{0, 4},{1, 5},{1, 7}},0x0000000000000307L,0,false,8,0,2),
+ new Shape ('8',new int[][] {{0, 0},{1, 1},{2, 2},{3, 1},{4, 2}},0x0000000000821041L,0,true, 5,0,7),
+ new Shape ('8',new int[][] {{0, 0},{1,-1},{2,-2},{2,-4},{3,-5}},0x0000000000023108L,3,false,6,5,9),
+ new Shape ('8',new int[][] {{1, 7},{1, 5},{1, 3},{0, 2},{0, 0}},0x0000000000000383L,0,false,8,0,2),
+ new Shape ('8',new int[][] {{0, 0},{1, 1},{2, 2},{2, 4},{3, 5}},0x0000000000083041L,0,false,6,0,4),
+ new Shape ('8',new int[][] {{0, 0},{1,-1},{2,-2},{3,-1},{4,-2}},0x0000000000420842L,1,false,5,2,9),
+ new Shape ('8',new int[][] {{0, 4},{0, 2},{0, 0},{1,-1},{1,-3}},0x00000000000000DCL,2,false,8,3,5),
+ new Shape ('8',new int[][] {{3, 5},{2, 4},{1, 3},{1, 1},{0, 0}},0x00000000000820C1L,0,false,6,0,4),
+ new Shape ('8',new int[][] {{4,-2},{3,-1},{2, 0},{1,-1},{0, 0}},0x0000000000421042L,1,false,5,2,9),
+ new Shape ('8',new int[][] {{1,-5},{1,-3},{1,-1},{0, 0},{0, 2}},0x00000000000001D8L,3,false,8,5,7)
+ };
+
+ private static final Shape[] PIECE9 = { new Shape ('9',new int[][] {{3, 3},{2, 2},{1, 1},{0, 0},{0, 2}},0x0000000000041043L,0,false,6,0,6),
+ new Shape ('9',new int[][] {{3,-3},{2,-2},{1,-1},{0, 0},{1, 1}},0x0000000000021184L,2,false,6,3,8),
+ new Shape ('9',new int[][] {{0, 0},{0, 2},{0, 4},{0, 6},{1, 5}},0x000000000000010FL,0,false,8,0,3),
+ new Shape ('9',new int[][] {{0, 0},{1, 1},{2, 2},{3, 3},{3, 1}},0x0000000000061041L,0,true, 6,0,6),
+ new Shape ('9',new int[][] {{0, 0},{1,-1},{2,-2},{3,-3},{2,-4}},0x0000000000021884L,2,false,6,4,9),
+ new Shape ('9',new int[][] {{1, 5},{1, 3},{1, 1},{1,-1},{0, 0}},0x00000000000003C2L,1,false,8,1,4),
+ new Shape ('9',new int[][] {{0, 0},{1, 1},{2, 2},{3, 3},{2, 4}},0x0000000000043041L,0,false,6,0,5),
+ new Shape ('9',new int[][] {{0, 0},{1,-1},{2,-2},{3,-3},{3,-1}},0x0000000000061084L,2,false,6,3,9),
+ new Shape ('9',new int[][] {{0, 6},{0, 4},{0, 2},{0, 0},{1, 1}},0x000000000000004FL,0,false,8,0,3),
+ new Shape ('9',new int[][] {{3, 3},{2, 2},{1, 1},{0, 0},{1,-1}},0x00000000000820C2L,1,false,6,1,6),
+ new Shape ('9',new int[][] {{3,-1},{2, 0},{1, 1},{0, 2},{0, 0}},0x0000000000021086L,1,false,6,1,7),
+ new Shape ('9',new int[][] {{1,-5},{1,-3},{1,-1},{1, 1},{0, 0}},0x00000000000003C8L,3,false,8,5,8)
+ };
+
+ }