package icpc.challenge.link; import icpc.challenge.world.AbstractPlayer; import icpc.challenge.world.Bumper; import icpc.challenge.world.Move; import icpc.challenge.world.Puck; import icpc.challenge.world.Sled; import icpc.challenge.world.World; import java.awt.geom.Point2D; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class PipedPlayer implements AbstractPlayer, Runnable { private static final World sentinelWorld = new World(); private World lastWorld = null; private int lastWorldTurn = -1; private Move lastMove = null; private int side; private Process child; private Scanner input; private PrintStream output; private boolean synchronous = false; private ArrayList<Integer> droppedStates = new ArrayList(); private ArrayList<Integer> missedMoves = new ArrayList(); private static double flip(double paramDouble) { return (800.0D - paramDouble); } private static int flip(int paramInt) { if (paramInt == 2) return paramInt; return (1 - paramInt); } public static void encodeState(PrintStream paramPrintStream, int paramInt1, int paramInt2, World paramWorld) { int i; Object localObject; LinkedList localLinkedList; Iterator localIterator; Point2D localPoint2D; if (paramInt1 == 0) { paramPrintStream.printf("%d\n", new Object[] { Integer.valueOf(paramInt2) }); paramPrintStream.printf("%d\n", new Object[] { Integer.valueOf(paramWorld.plist.size()) }); for (i = 0; i < paramWorld.plist.size(); ++i) { localObject = (Puck)paramWorld.plist.get(i); paramPrintStream.printf(" %.2f %.2f %.2f %.2f %d\n", new Object[] { Double.valueOf(((Puck)localObject).pos.getX()), Double.valueOf(((Puck)localObject).pos.getY()), Double.valueOf(((Puck)localObject).vel.getX()), Double.valueOf(((Puck)localObject).vel.getY()), Integer.valueOf(((Puck)localObject).color) }); } paramPrintStream.printf("%d\n", new Object[] { Integer.valueOf(paramWorld.blist.size()) }); for (i = 0; i < paramWorld.blist.size(); ++i) { localObject = (Bumper)paramWorld.blist.get(i); paramPrintStream.printf(" %.2f %.2f %.2f %.2f\n", new Object[] { Double.valueOf(((Bumper)localObject).pos.getX()), Double.valueOf(((Bumper)localObject).pos.getY()), Double.valueOf(((Bumper)localObject).vel.getX()), Double.valueOf(((Bumper)localObject).vel.getY()) }); } paramPrintStream.printf("%d\n", new Object[] { Integer.valueOf(paramWorld.slist.size()) }); for (i = 0; i < paramWorld.slist.size(); ++i) { localObject = (Sled)paramWorld.slist.get(i); localLinkedList = (LinkedList)paramWorld.trail.get(i); paramPrintStream.printf(" %.2f %.2f %.2f\n", new Object[] { Double.valueOf(((Sled)localObject).pos.getX()), Double.valueOf(((Sled)localObject).pos.getY()), Double.valueOf(((Sled)localObject).getDir()) }); paramPrintStream.printf(" %d", new Object[] { Integer.valueOf(localLinkedList.size()) }); for (localIterator = localLinkedList.iterator(); localIterator.hasNext(); ) { localPoint2D = (Point2D)localIterator.next(); paramPrintStream.printf(" %.2f %.2f", new Object[] { Double.valueOf(localPoint2D.getX()), Double.valueOf(localPoint2D.getY()) }); } paramPrintStream.printf("\n", new Object[0]); } } else { paramPrintStream.printf("%d\n", new Object[] { Integer.valueOf(paramInt2) }); paramPrintStream.printf("%d\n", new Object[] { Integer.valueOf(paramWorld.plist.size()) }); for (i = paramWorld.plist.size() - 1; i >= 0; --i) { localObject = (Puck)paramWorld.plist.get(i); paramPrintStream.printf(" %.2f %.2f %.2f %.2f %d\n", new Object[] { Double.valueOf(flip(((Puck)localObject).pos.getX())), Double.valueOf(flip(((Puck)localObject).pos.getY())), Double.valueOf(-((Puck)localObject).vel.getX()), Double.valueOf(-((Puck)localObject).vel.getY()), Integer.valueOf(flip(((Puck)localObject).color)) }); } paramPrintStream.printf("%d\n", new Object[] { Integer.valueOf(paramWorld.blist.size()) }); for (i = paramWorld.blist.size() - 1; i >= 0; --i) { localObject = (Bumper)paramWorld.blist.get(i); paramPrintStream.printf(" %.2f %.2f %.2f %.2f\n", new Object[] { Double.valueOf(flip(((Bumper)localObject).pos.getX())), Double.valueOf(flip(((Bumper)localObject).pos.getY())), Double.valueOf(-((Bumper)localObject).vel.getX()), Double.valueOf(-((Bumper)localObject).vel.getY()) }); } paramPrintStream.printf("%d\n", new Object[] { Integer.valueOf(paramWorld.slist.size()) }); for (i = paramWorld.slist.size() - 1; i >= 0; --i) { localObject = (Sled)paramWorld.slist.get(i); localLinkedList = (LinkedList)paramWorld.trail.get(i); paramPrintStream.printf(" %.2f %.2f %.2f\n", new Object[] { Double.valueOf(flip(((Sled)localObject).pos.getX())), Double.valueOf(flip(((Sled)localObject).pos.getY())), Double.valueOf(((Sled)localObject).getDir() - 3.141592653589793D) }); paramPrintStream.printf(" %d", new Object[] { Integer.valueOf(localLinkedList.size()) }); for (localIterator = localLinkedList.iterator(); localIterator.hasNext(); ) { localPoint2D = (Point2D)localIterator.next(); paramPrintStream.printf(" %.2f %.2f", new Object[] { Double.valueOf(flip(localPoint2D.getX())), Double.valueOf(flip(localPoint2D.getY())) }); } paramPrintStream.printf("\n", new Object[0]); } } } private void decodeMove(Move paramMove) throws IOException { double d1; double d2; if (this.side == 0) { d1 = this.input.nextDouble(); d2 = this.input.nextDouble(); paramMove.accel0.setLocation(d1, d2); d1 = this.input.nextDouble(); d2 = this.input.nextDouble(); paramMove.accel1.setLocation(d1, d2); paramMove.dangle = this.input.nextDouble(); } else { d1 = this.input.nextDouble(); d2 = this.input.nextDouble(); paramMove.accel1.setLocation(-d1, -d2); d1 = this.input.nextDouble(); d2 = this.input.nextDouble(); paramMove.accel0.setLocation(-d1, -d2); paramMove.dangle = this.input.nextDouble(); } } public synchronized void snapshot(double paramDouble, World paramWorld) { if (this.lastWorld != null) this.droppedStates.add(Integer.valueOf(this.lastWorldTurn)); this.lastWorld = paramWorld; this.lastWorldTurn = (int)Math.round(paramDouble / 100.0D); super.notifyAll(); } // ERROR // public void run() { // Byte code: // 0: aload_0 // 1: dup // 2: astore_3 // 3: monitorenter // 4: aload_0 // 5: getfield 50 icpc/challenge/link/PipedPlayer:lastWorld Licpc/challenge/world/World; // 8: ifnonnull +15 -> 23 // 11: aload_0 // 12: invokevirtual 58 java/lang/Object:wait ()V // 15: goto -11 -> 4 // 18: astore 4 // 20: goto -16 -> 4 // 23: aload_0 // 24: getfield 50 icpc/challenge/link/PipedPlayer:lastWorld Licpc/challenge/world/World; // 27: astore_1 // 28: aload_0 // 29: getfield 52 icpc/challenge/link/PipedPlayer:lastWorldTurn I // 32: istore_2 // 33: aload_0 // 34: aconst_null // 35: putfield 50 icpc/challenge/link/PipedPlayer:lastWorld Licpc/challenge/world/World; // 38: aload_3 // 39: monitorexit // 40: goto +10 -> 50 // 43: astore 5 // 45: aload_3 // 46: monitorexit // 47: aload 5 // 49: athrow // 50: aload_1 // 51: getstatic 60 icpc/challenge/link/PipedPlayer:sentinelWorld Licpc/challenge/world/World; // 54: if_acmpne +25 -> 79 // 57: aload_0 // 58: getfield 61 icpc/challenge/link/PipedPlayer:output Ljava/io/PrintStream; // 61: ldc 62 // 63: iconst_0 // 64: anewarray 4 java/lang/Object // 67: invokevirtual 6 java/io/PrintStream:printf (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream; // 70: pop // 71: aload_0 // 72: getfield 61 icpc/challenge/link/PipedPlayer:output Ljava/io/PrintStream; // 75: invokevirtual 63 java/io/PrintStream:flush ()V // 78: return // 79: aload_0 // 80: getfield 61 icpc/challenge/link/PipedPlayer:output Ljava/io/PrintStream; // 83: aload_0 // 84: getfield 43 icpc/challenge/link/PipedPlayer:side I // 87: iload_2 // 88: aload_1 // 89: invokestatic 64 icpc/challenge/link/PipedPlayer:encodeState (Ljava/io/PrintStream;IILicpc/challenge/world/World;)V // 92: aload_0 // 93: getfield 61 icpc/challenge/link/PipedPlayer:output Ljava/io/PrintStream; // 96: invokevirtual 63 java/io/PrintStream:flush ()V // 99: new 65 icpc/challenge/world/Move // 102: dup // 103: invokespecial 66 icpc/challenge/world/Move:<init> ()V // 106: astore_3 // 107: aload_0 // 108: aload_3 // 109: invokespecial 67 icpc/challenge/link/PipedPlayer:decodeMove (Licpc/challenge/world/Move;)V // 112: aload_0 // 113: dup // 114: astore 4 // 116: monitorenter // 117: aload_0 // 118: aload_3 // 119: putfield 68 icpc/challenge/link/PipedPlayer:lastMove Licpc/challenge/world/Move; // 122: aload_0 // 123: invokevirtual 57 java/lang/Object:notifyAll ()V // 126: aload 4 // 128: monitorexit // 129: goto +11 -> 140 // 132: astore 6 // 134: aload 4 // 136: monitorexit // 137: aload 6 // 139: athrow // 140: goto -140 -> 0 // 143: astore_1 // 144: return // // Exception table: // from to target type // 11 15 18 java/lang/InterruptedException // 4 40 43 finally // 43 47 43 finally // 117 129 132 finally // 132 137 132 finally // 0 78 143 IOException // 79 143 143 IOException } public synchronized Move waitForMove(double paramDouble, long paramLong) { long l1 = System.currentTimeMillis() + paramLong; while (this.lastMove == null) { long l2; if (((l2 = System.currentTimeMillis()) >= l1) && (!(this.synchronous))) break; long l3 = l1 - l2; if (this.synchronous) l3 = 1000L; try { if (l3 > 0L) super.wait(l3); } catch (InterruptedException localInterruptedException) { } } if (this.lastMove != null) { Move localMove = this.lastMove; this.lastMove = null; return localMove; } this.missedMoves.add(Integer.valueOf((int)Math.round(paramDouble / 100.0D))); return new Move(); } public PipedPlayer(int paramInt, boolean paramBoolean, List<String> paramList) throws IOException { this.side = paramInt; this.synchronous = paramBoolean; ProcessBuilder localProcessBuilder = new ProcessBuilder(paramList); this.child = localProcessBuilder.start(); this.input = new Scanner(this.child.getInputStream()); this.output = new PrintStream(new BufferedOutputStream(this.child.getOutputStream())); Object localObject = this.child.getErrorStream(); Thread localThread = new Thread(new Runnable(this, (InputStream)localObject) { public void run() { byte[] arrayOfByte = new byte[1024]; try { while ((i = this.val$errorStream.read(arrayOfByte, 0, arrayOfByte.length)) > 0) { int i; System.err.write(arrayOfByte, 0, i); System.err.flush(); } } catch (IOException localIOException) { } } }); localThread.setDaemon(true); localThread.start(); localObject = new Thread(this); ((Thread)localObject).setDaemon(true); ((Thread)localObject).start(); } public void ready() { } public void shutdown() { Integer localInteger; synchronized (this) { this.lastWorld = sentinelWorld; this.lastWorldTurn = -1; super.notifyAll(); } if (this.droppedStates.size() > 0) { System.out.printf("Player %d missed states:", new Object[] { Integer.valueOf(this.side) }); for (??? = this.droppedStates.iterator(); ((Iterator)???).hasNext(); ) { localInteger = (Integer)((Iterator)???).next(); System.out.printf(" %d", new Object[] { Integer.valueOf(localInteger.intValue()) }); } System.out.printf("\n", new Object[0]); } if (this.missedMoves.size() > 0) { System.out.printf("Player %d missed moves:", new Object[] { Integer.valueOf(this.side) }); for (??? = this.missedMoves.iterator(); ((Iterator)???).hasNext(); ) { localInteger = (Integer)((Iterator)???).next(); System.out.printf(" %d", new Object[] { Integer.valueOf(localInteger.intValue()) }); } System.out.printf("\n", new Object[0]); } } public void moveReport(double paramDouble, Move paramMove1, Move paramMove2) { } public void hitWall(double paramDouble1, int paramInt1, int paramInt2, double paramDouble2, double paramDouble3) { } public void sledWrap(double paramDouble1, int paramInt1, int paramInt2, double paramDouble2) { } public void sledLoop(double paramDouble, int paramInt, ArrayList<ArrayList<Point2D>> paramArrayList) { } public void collision(double paramDouble, int paramInt1, int paramInt2) { } public synchronized void finished() { } }