//program.beh // ============================================================ //rewritten for demjava by Binoy Samuel : 05/15/97 Main { (@ static public void main(String args[]) throws Exception { BusRoute iBusRoute = BusRoute.parse(System.in); int i, stime; // Simulation time is the second argument stime = 30; // Display the initial state of the bus route System.out.println("Initial state of the input bus route : \n\n"); iBusRoute.g_print(); // Do the simulation here for (i=1; i < stime; i++) { System.out.println("\n\nNext state (after " + i + " minutes) : \n\n"); iBusRoute.simulate(); iBusRoute.g_print(); } // Display the final state of the bus route System.out.println("\n\nFinal state of the input bus route (after "); System.out.println( stime + " minutes) : \n\n"); iBusRoute.simulate(); iBusRoute.g_print(); System.out.println("\n\n*** FINISHED ***" ); } @) } //--------------------------------------------------------------------- BusRoute { traversal allBusRouteBuses(v_simulate v) {to Bus;} traversal allBusRouteBusStop(v_busroute_busstop v) {to BusStop;} traversal allBusRouteRouteLen(v_get_len v) {to RouteLen;} traversal toall(v_printall v) {to *;} (@ void simulate() { v_simulate v1 = new v_simulate(this); allBusRouteBuses(v1); } BusStop find_stop(StopId iStopId) { BusStop ret = null; v_busroute_busstop v4 = new v_find_stop( ret , iStopId); allBusRouteBusStop(v4); return ((v_find_stop)v4).get_return_val(); } BusStop any_stop_around(int prevpos, int nextpos) { BusStop b = null; v_busroute_busstop v7 = new v_any_stop_around(b, new Integer(prevpos) , new Integer(nextpos)); allBusRouteBusStop(v7); return ((v_any_stop_around)v7).get_return_val(); } int get_len() { Integer ret = new Integer(0); v_get_len v11 = new v_get_len(ret); allBusRouteRouteLen(v11); ret = v11.get_return_val(); return ret.intValue(); } void g_print() { v_printall v = new v_printall(); toall(v); } @) } //--------------------------------------------------------------------- Bus { traversal allBusPersons(v_bus_person v) {to Person;} traversal allBusPersonList(v_bus_personlist v) {to Person_List;} traversal allBusRouteLoc(v_bus_routeloc v) {to RouteLoc; } traversal allBusBusCapac(v_get_cap v) {to BusCapac; } traversal allBusBusSpeed(v_get_spd v) {to BusSpeed; } (@ void drop_passengers(StopId iStopId) { v_bus_person v2 = new v_drop_passengers(iStopId , new Person_List()); allBusPersons(v2); } void load_passengers(BusStop iStop) { v_bus_personlist v3 = new v_load_passengers(iStop , new Person_List()); allBusPersonList(v3); } int count_passengers() { Integer ret = new Integer(0); v_bus_personlist v5 = new v_count_passengers(ret); allBusPersonList(v5); ret = ((v_count_passengers)v5).get_return_val(); return ret.intValue(); } void proceed_to(int newPos) { v_bus_routeloc v8 = new v_proceed_to(new Integer(newPos)); allBusRouteLoc(v8); } boolean have_stop_request(StopId iStopId) { Integer ret = new Integer(0); v_bus_person v9 = new v_have_stop_request( ret , iStopId); allBusPersons(v9); ret = ((v_have_stop_request)v9).get_return_val(); return (ret.intValue() > 0); } int get_loc() { Integer ret = new Integer(0); v_bus_routeloc v12 = new v_get_loc(ret); allBusRouteLoc(v12); ret = ((v_get_loc)v12).get_return_val(); return ret.intValue(); } int get_cap() { Integer ret = new Integer(0); v_get_cap v13 = new v_get_cap(ret); allBusBusCapac(v13); ret = v13.get_return_val(); return ret.intValue(); } int get_spd() { Integer ret = new Integer(0); v_get_spd v14 = new v_get_spd(ret); allBusBusSpeed(v14); ret = v14.get_return_val(); return ret.intValue(); } @) } //--------------------------------------------------------------------- BusStop { traversal allBusStopPerson(v_give_passengers v) {to Person; } traversal allBusStopPersonList(v_anybody_waiting v) {to Person_List; } traversal allBusStopRouteLoc(v_get_loc v) {to RouteLoc; } (@ Person_List give_passengers(int allowance) { Person_List p = new Person_List(); v_give_passengers v6 = new v_give_passengers(p , new Integer(allowance) , new Person_List()); allBusStopPerson(v6); return p; } boolean anybody_waiting() { Boolean ret = new Boolean(false); v_anybody_waiting v10 = new v_anybody_waiting(ret); allBusStopPersonList(v10); ret=v10.get_return_val(); return ret.booleanValue(); } int get_loc() { Integer ret = new Integer(0); v_get_loc v12 = new v_get_loc(ret); allBusStopRouteLoc(v12); ret=v12.get_return_val(); return ret.intValue(); } @) } //--------------------------------------------------------------------- Person_List { traversal toallPerson(v_person v){to Person;} traversal toallNonemptyPersonList(v_nonempty v){to Nonempty_Person_List; } (@ void append(Person p) { Nonempty_Person_List newlist = new Nonempty_Person_List( p , this.get_first()); this.set_first(newlist); } void concatenate(Person_List pl) { v_nonempty v = new v_nonempty(pl); if(this.get_first() == null) this.set_first( pl.get_first()); else toallNonemptyPersonList(v); } int list_length() { v_person vp = new v_person(); vp.i = 0; toallPerson(vp); return vp.i; } boolean empty() { return !(list_length() > 0); } @) } //--------------------------------------------------------------------- StopId { (@ boolean g_equal(StopId it) { return this.get_v().equals(it.get_v()); } @) } //--------------------------------------------------------------------- v_person { (@ int i; @) before Person(@ i++; @) } //--------------------------------------------------------------------- v_nonempty { before Nonempty_Person_List (@ if(host.get_next() == null) { host.set_next(this.get_ne().get_first()); } @) } //--------------------------------------------------------------------- v_simulate { before Bus (@ StopId stopId = host.get_currentStop(); if (stopId != null) { // waiting at a stop host.drop_passengers(stopId); host.load_passengers( busRoute.find_stop(stopId) ); host.set_currentStop(null); // prepare to move } else { // moving along the route int prevPos = host.get_loc(); int nextPos = (prevPos + host.get_spd()) % busRoute.get_len(); BusStop stop = busRoute.any_stop_around(prevPos, nextPos); if (stop == null) host.proceed_to(nextPos); else if (host.have_stop_request( stop.get_id() )) { host.proceed_to( stop.get_loc() ); host.set_currentStop( stop.get_id() ); // stop here } else { int have_room = host.get_cap() - host.count_passengers(); if ( (have_room > 0) && stop.anybody_waiting() ) { System.out.println("proceeding to stop at " + stop.get_loc()); host.proceed_to( stop.get_loc() ); host.set_currentStop( stop.get_id() ); // stop here } else host.proceed_to(nextPos); } } @) } //--------------------------------------------------------------------- v_drop_passengers { before Person (@ if (!iStopId.g_equal( host.get_destination() )) newPasList.append(host); @) before Bus (@ host.set_passengers(newPasList); @) } //--------------------------------------------------------------------- v_load_passengers { before Bus (@ int allowance = host.get_cap() - host.count_passengers(); newPasList = iStop.give_passengers(allowance); @) before Person_List (@ host.concatenate(newPasList); @) } //--------------------------------------------------------------------- v_find_stop { before BusStop (@ if(return_val == null) if (iStopId.g_equal( host.get_id() )) return_val = host; @) //before -> *,*, BusStop // i think we can do without this // (@ if (return_val) return; @) } //--------------------------------------------------------------------- v_count_passengers { before Person_List (@ return_val = new Integer(host.list_length()); @) } //--------------------------------------------------------------------- v_give_passengers { before Person (@ if (return_val.list_length() < allowance.intValue()) return_val.append(host); else newWaitList.append(host); @) after BusStop (@ host.set_waitingList(newWaitList); @) } //--------------------------------------------------------------------- v_any_stop_around { before BusStop (@ if(return_val==null) { int stopLoc = host.get_loc(); if (prevPos.intValue() < nextPos.intValue()) { if ((stopLoc > prevPos.intValue()) && (stopLoc <= nextPos.intValue())) return_val = host; } else if ((stopLoc > prevPos.intValue()) || (stopLoc <= nextPos.intValue())) return_val = host; } @) //before -> *,*, BusStop //maybe dont want this // (@ if (return_val) return; @) } //--------------------------------------------------------------------- v_proceed_to { before RouteLoc (@ host.set_v(newPos); @) } //--------------------------------------------------------------------- v_have_stop_request { before Person (@ if(return_val.equals(new Integer(0))); if (iStopId.g_equal( host.get_destination() )) return_val = new Integer(1); @) //before -> *,*, Person //dont need this ? //(@ if (return_val) return; @) } //--------------------------------------------------------------------- v_anybody_waiting { before Person_List (@ return_val = new Boolean(! host.empty()); @) } //--------------------------------------------------------------------- v_get_len { before RouteLen (@ return_val = host.get_v(); @) } //--------------------------------------------------------------------- v_get_loc { before RouteLoc (@ return_val = host.get_v(); @) } //--------------------------------------------------------------------- v_get_cap { before BusCapac (@ return_val = host.get_v(); @) } //--------------------------------------------------------------------- v_get_spd { before BusSpeed (@ return_val = host.get_v(); @) } //--------------------------------------------------------------------- //--------------------------------------------------------------------- v_bus_person { before Person (@ @) before Bus (@ @) } //--------------------------------------------------------------------- v_bus_personlist { before Bus (@ @) before Person_List (@ @) } //--------------------------------------------------------------------- v_busroute_busstop { before BusStop (@ @) } //--------------------------------------------------------------------- v_bus_routeloc { before RouteLoc (@ @) } //--------------------------------------------------------------------- //--------------------------------------------------------------------- v_printall { before -> BusRoute,name,RouteName (@ System.out.print("BusRoute: "); @) before -> BusRoute,totalLength,RouteLen (@ System.out.print("total route length: "); @) before -> BusRoute,busStops,BusStop_List (@ System.out.print("\nconsisting of bus stops: \n"); @) before -> BusRoute,buses,Bus_List (@ System.out.print("\nwith assigned busses: "); @) before -> BusStop,location,RouteLoc (@ System.out.print("at: "); @) before -> BusStop,waitingList,Person_List (@ System.out.print("\nwith waiting list: "); @) before -> Bus,position,RouteLoc (@ System.out.print("at: "); @) before -> Bus,currentStop,StopId (@ System.out.print("currently at stop: "); @) before -> Bus,capacity,BusCapac (@ System.out.print("capacity: "); @) before -> Bus,speed,BusSpeed (@ System.out.print("speed: "); @) before -> Bus,passengers,Person_List (@ System.out.print("carrying passenger(s): "); @) before -> Person,destination,StopId (@ System.out.print("destination: "); @) before BusStop_List (@ System.out.print("("); @) after BusStop_List (@ System.out.print(")"); @) before Bus_List (@ System.out.print("("); @) after Bus_List (@ System.out.print(")"); @) before Person_List (@ System.out.print("("); @) after Person_List (@ System.out.print(")\n"); @) before RouteName (@ System.out.print(" " + host.get_v() + " "); @) before RouteLen (@ System.out.print(" " + host.get_v() + " "); @) after RouteLen (@ System.out.print(" ft "); @) before RouteLoc (@ System.out.print(" " + host.get_v() + " "); @) after RouteLoc (@ System.out.print(" ft "); @) before BusCapac (@ System.out.print(" " + host.get_v() + " "); @) after BusCapac (@ System.out.print(" passengers "); @) before BusSpeed (@ System.out.print(" " + host.get_v() + " "); @) after BusSpeed (@ System.out.print(" ft/min "); @) before StopId (@ System.out.print(" " + host.get_v() + " "); @) before BusId (@ System.out.print(" " + host.get_v() + " "); @) before PersonId (@ System.out.print(" " + host.get_v() + " "); @) } //---------------------------------------------------------------------