GoForIt回答 - 申告制エレベータ -
引き続きGoForItの回答です。最後まで到達していませんが、せっかくなのでポストしようと思います。
回答はshidasan · GitHubで公開しています。
i)
乗り降りした階、時間、入力データの識別番号をファイルから取得し、出力フォーマット通りに標準出力に出力しています。
ii)
KonohaScriptにはテストケースを作る際に利用するAssert文と呼ばれるものがあります。Assert文中にtrueと見込まれる条件式を書く事で、その時点でプログラムが満たすべき用件について定義します。Assert文がfalseになった場合は例外が発行されます。
using konoha.math.*; MAXCAPACITY=5; DELAY=5; int capacity; int numElevator; @Public dynamic Array.last() { return this[|this|-1]; } class Decl { int id; int requestTime; int onFloor; int offFloor; Decl(Array<String> data) { _id = (int)data[0]; _requestTime = (int)data[1]; _onFloor = (int)data[2]; _offFloor = (int)data[3]; } } class Event { int id; int time; int floor; String eventStr; int[] target; Event(String[] data) { this.id = (to Int)data[0]; this.time = (to Int)data[1]; this.floor = (to Int)data[2]; this.eventStr = data[3]; this.target = []; for (int i = 4; i < |data|; i++) { if (data[i] != "0") { target.add((to Int) data[i]); } } } } int changeFloor(int floor0, int floor1) { return Math.abs(floor0-floor1) * 2; } void confirm(Decl[] decls, Event[] events) { int[][] passenger = new Int[][numElevator+1]; Event[][] chkevents = new Event[][numElevator+1]; int declComfirmed = 0; int result = 0; for (int i = 0; i < numElevator+1; i++) { passenger[i] = []; chkevents[i] = [new Event((i + ",0,1,E,0,0,0,0,0").split(","))]; } Event publicLast = new Event(("1,0,1,E,0,0,0,0,0").split(",")); for (int i = 0; i < |events|; i++) { Event e = events[i]; assert(publicLast.time <= e.time); assert(e.id <= numElevator); assert(e.eventStr == "E" || e.eventStr == "B"); Event last = chkevents[e.id].last(); if (e.eventStr == "B") { assert(last.eventStr == "E"); assert(e.time >= last.time + changeFloor(e.floor, last.floor)); if (|e.target| > 0) { foreach (int p in e.target) { assert(passenger[e.id].indexOf(p) != -1); passenger[e.id].remove(passenger[e.id].indexOf(p)); result += e.time - decls[p].requestTime; declComfirmed++; } } chkevents[e.id].add(e); } else { assert(last.eventStr == "B"); assert(e.time >= last.time + DELAY); assert(e.floor == last.floor); if (|e.target| > 0) { foreach (int p in e.target) { assert(decls[p].requestTime <= e.time); passenger[e.id].add(p); assert(|passenger[e.id]| <= capacity); } } chkevents[e.id].add(e); } publicLast = e; } assert(declComfirmed == |decls|-1); OUT.println("Confirmed"); OUT.println("Total Delay: " + result); } void main(String[] args) { if (|args| != 4) { print "Usage: [input] [output] [capacity] [elevator count]"; return; } InputStream inputdata = new (args[0]); InputStream outputdata = new (args[1]); capacity = (to Int)args[2]; assert(capacity <= MAXCAPACITY); numElevator = (to Int) args[3]; Decl[] decls = [null]; Event[] events = []; String s = ""; while ((s = inputdata.readLine()) != null) { decls.add(new Decl(s.split(","))); } while ((s = outputdata.readLine()) != null) { events.add(new Event(s.split(","))); } confirm(decls, events); }