/** * Copyright 2007 Troy Korjuslommi. * All Rights Reserved. * Released under GNU License version 2. * See http://www.gnu.org/ */ import java.util.List; import java.util.Vector; public class SeatShuffle { private int mVerbose; private List mSeats; private List mPassengers; static public void main(String argv[]) { final int seats = 100; int n = 0; int times = 1; int verbose = 0; for (int i = 0, ii = argv.length; i < ii; i++) { if (argv[i].equals("-v1")) verbose = 1; else if (argv[i].equals("-v2")) verbose = 2; else if (argv[i].equals("-v3")) verbose = 3; else if (argv[i].equals("-t") && i+1 < ii) { try { times = Integer.parseInt(argv[++i]); } catch (NumberFormatException ex) { System.err.println("Bad argument to -t."); System.exit(-1); } } else { System.err.println("Usage: SeatShuffle [-v1 -v2 -v3] [-t number]"); System.err.println("\t-v1 : verbosity level 1."); System.err.println("\t-v2 : verbosity level 2."); System.err.println("\t-v3 : verbosity level 3."); System.err.println("\t-t : number of times to board passengers on the plane."); System.exit(-1); } } for (int i = 0; i < times; i++) { SeatShuffle l = new SeatShuffle(seats, verbose); if (l.play()) n++; } System.err.println("Got the right seat on " + n + "/" + times + " flights."); } public SeatShuffle(int seats, int verbose) { mVerbose = verbose; mSeats = new Vector(seats); mPassengers = new Vector(seats); for (int i = 0; i < seats; i++) { mSeats.add(new Seat(i+1)); } try { for (int i = 0; i < seats; i++) { int sn = getRandomUnreservedSeatNumber(); getSeatByNumber(sn).makeReservation(); mPassengers.add(new Passenger(i == 0, sn)); } } catch (SeatShuffleException ex) { System.err.println("ERROR2: " + ex.getMessage()); } } int getRandomUnreservedSeatNumber() { double seatcount = (double)mSeats.size(); while (true) { int n = (int)Math.floor(Math.random() * seatcount); n++; if (! getSeatByNumber(n).isReserved()) return n; } } int getRandomUnoccupiedSeatNumber() { double seatcount = (double)mSeats.size(); while (true) { int n = (int)Math.floor(Math.random() * seatcount); n++; if (! getSeatByNumber(n).isOccupied()) return n; } } boolean play() { try { for (int i = 0, ii = mPassengers.size(); i < ii; i++) { mPassengers.get(i).sit(); boolean b = mPassengers.get(i).checkSeat(i+1 == ii); if (i+1 == ii) return b; } throw new SeatShuffleException("End of loop?"); } catch (SeatShuffleException ex) { System.err.println("ERROR: " + ex.getMessage()); } return false; } Seat getSeatByNumber(int num) { return mSeats.get(num-1); } class Passenger { private boolean mIsLuny; private int mReservation; private Seat mSeat; Passenger(boolean isluny, int reservation) { mIsLuny = isluny; mReservation = reservation; } void sit() throws SeatShuffleException { Seat seat = getSeatByNumber(mReservation); if (mIsLuny || seat.isOccupied()) { seat = getSeatByNumber(getRandomUnoccupiedSeatNumber()); } seat.occupy(this); mSeat = seat; } boolean checkSeat(boolean islast) { boolean seatRight = mSeat.getNumber() == mReservation; if (mVerbose > 2 || ! seatRight && mVerbose > 1 || (mVerbose > 0 && islast)) { System.err.print("I am passenger nr. " + mReservation + " in seat " + mSeat.getNumber() + ". I am sitting in the " + ((seatRight) ? "right" : "wrong") + " seat."); if (mIsLuny) System.err.print(" I am the LUNY."); if (islast) System.err.println(" I am the LAST passenger in."); else System.err.println(""); } return seatRight; } } class Seat { private int mNumber; private Passenger mPassenger; private boolean mIsReserved; Seat(int num) { mNumber = num; } void makeReservation() throws SeatShuffleException { if (mIsReserved) throw new SeatShuffleException("Seat reserved. Cannot reserve."); mIsReserved = true; } boolean isReserved() { return mIsReserved; } int getNumber() { return mNumber; } void occupy(Passenger p) throws SeatShuffleException { if (mPassenger != null) throw new SeatShuffleException("Cannot occupy. Seat used."); mPassenger = p; } boolean isOccupied() { return (mPassenger != null); } } class SeatShuffleException extends Exception { SeatShuffleException(String msg) { super(msg); } } }