diff options
-rw-r--r-- | src/main/NetworkPacket.java | 83 | ||||
-rw-r--r-- | src/test/NetworkPacketTest.java | 109 |
2 files changed, 163 insertions, 29 deletions
diff --git a/src/main/NetworkPacket.java b/src/main/NetworkPacket.java index 805dcf5..7aeea88 100644 --- a/src/main/NetworkPacket.java +++ b/src/main/NetworkPacket.java @@ -1,49 +1,76 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Deque; +import java.util.LinkedList; import java.util.Scanner; public class NetworkPacket { - public static class Request { - public int arrivalTime; - public int processTime; + static class Request { + int arrivalTime; + int processTime; - public Request(int arrivalTime, int processTime) { + Request(int arrivalTime, int processTime) { this.arrivalTime = arrivalTime; this.processTime = processTime; } } - public static class Response { - public boolean dropped; - public int startTime; + static class Response { + boolean dropped; + int startTime; - public Response(boolean dropped, int startTime) { + Response(boolean dropped, int startTime) { this.dropped = dropped; this.startTime = startTime; } } - public static class Buffer { - private int size; - private ArrayList<Integer> finishTime = new ArrayList<Integer>(); + static class Buffer { + private int capacity; + private Deque<Integer> finishTime; - public Buffer(int size) { - this.size = size; + // My addition to the starter file + private int runningTimeCounter = 0; + // End of my addition to the starter file + + Buffer(int capacity) { + this.capacity = capacity; + this.finishTime = new LinkedList<>(); } - public Response processRequests(Request request) { - // write your code here - if (this.size == 0) - return new Response(false,-1); - else { + + Response processRequest(Request request) { + if (runningTimeCounter < request.arrivalTime) if (finishTime.size() == 0) + runningTimeCounter = request.arrivalTime; + else if (finishTime.getLast() < request.arrivalTime) + runningTimeCounter = request.arrivalTime; + + while (finishTime.size() > 0) { + int j = finishTime.getFirst(); + if (j <= request.arrivalTime) + finishTime.pop(); + else + break; } + + if (finishTime.size() >= capacity) { + return new Response(true, -1); + } + Response response = new Response(false, runningTimeCounter); + runningTimeCounter = runningTimeCounter + request.processTime; + if (finishTime.size() > 0) + finishTime.addLast(finishTime.getLast() + request.processTime); + else + finishTime.addLast(runningTimeCounter); + return response; } } - private static ArrayList<Request> ReadQueries(Scanner scanner) throws IOException { + + private static ArrayList<Request> ReadQueries(Scanner scanner) { int requests_count = scanner.nextInt(); - ArrayList<Request> requests = new ArrayList<Request>(); + ArrayList<Request> requests = new ArrayList<>(); for (int i = 0; i < requests_count; ++i) { int arrival_time = scanner.nextInt(); int process_time = scanner.nextInt(); @@ -52,16 +79,16 @@ public class NetworkPacket { return requests; } - public static ArrayList<Response> processRequests(ArrayList<Request> requests, Buffer buf) { + static ArrayList<Response> processRequests(ArrayList<Request> requests, Buffer buf) { ArrayList<Response> responses = new ArrayList<>(); - for (int i = 0; i < requests.size(); i++) { - responses.add(buf.processRequests(requests.get(i))); + for (Request request : requests) { + responses.add(buf.processRequest(request)); } return responses; } + private static void PrintResponses(ArrayList<Response> responses) { - for (int i = 0; i < responses.size(); ++i) { - Response response = responses.get(i); + for (Response response : responses) { if (response.dropped) { System.out.println(-1); } else { @@ -70,11 +97,11 @@ public class NetworkPacket { } } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { Scanner scanner = new Scanner(System.in); - int buffer_max_size = scanner.nextInt(); - Buffer buffer = new Buffer(buffer_max_size); + int bufferMaxSize = scanner.nextInt(); + Buffer buffer = new Buffer(bufferMaxSize); ArrayList<Request> requests = ReadQueries(scanner); ArrayList<Response> responses = processRequests(requests, buffer); diff --git a/src/test/NetworkPacketTest.java b/src/test/NetworkPacketTest.java index fca3d60..aecd968 100644 --- a/src/test/NetworkPacketTest.java +++ b/src/test/NetworkPacketTest.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -public class NetworkPacketTest { +class NetworkPacketTest { @Test void test() { int bufferMaxSize = 1; @@ -56,4 +56,111 @@ public class NetworkPacketTest { assertFalse(responses.get(1).dropped); assertEquals(1, responses.get(1).startTime); } + + @Test + void test4() { + int bufferMaxSize = 1; + NetworkPacket.Buffer buf = new NetworkPacket.Buffer(bufferMaxSize); + ArrayList<NetworkPacket.Request> requests = new ArrayList<>(); + requests.add(new NetworkPacket.Request(1, 0)); + ArrayList<NetworkPacket.Response> responses = NetworkPacket.processRequests(requests, buf); + assertEquals(1, responses.size()); + assertEquals(1, responses.get(0).startTime); + } + + @Test + void test5() { + int bufferMaxSize = 1; + NetworkPacket.Buffer buf = new NetworkPacket.Buffer(bufferMaxSize); + ArrayList<NetworkPacket.Request> requests = new ArrayList<>(); + requests.add(new NetworkPacket.Request(0, 1)); + requests.add(new NetworkPacket.Request(0, 0)); + ArrayList<NetworkPacket.Response> responses = NetworkPacket.processRequests(requests, buf); + assertEquals(2, responses.size()); + assertEquals(0, responses.get(0).startTime); + assertEquals(-1, responses.get(1).startTime); + } + + @Test + void test6() { + int bufferMaxSize = 2; + NetworkPacket.Buffer buf = new NetworkPacket.Buffer(bufferMaxSize); + ArrayList<NetworkPacket.Request> requests = new ArrayList<>(); + requests.add(new NetworkPacket.Request(0, 1)); + requests.add(new NetworkPacket.Request(0, 1)); + ArrayList<NetworkPacket.Response> responses = NetworkPacket.processRequests(requests, buf); + assertEquals(2, responses.size()); + assertEquals(0, responses.get(0).startTime); + assertEquals(1, responses.get(1).startTime); + } + + @Test + void test7() { + int bufferMaxSize = 2; + NetworkPacket.Buffer buf = new NetworkPacket.Buffer(bufferMaxSize); + ArrayList<NetworkPacket.Request> requests = new ArrayList<>(); + requests.add(new NetworkPacket.Request(0, 1)); + requests.add(new NetworkPacket.Request(0, 1)); + requests.add(new NetworkPacket.Request(0, 1)); + ArrayList<NetworkPacket.Response> responses = NetworkPacket.processRequests(requests, buf); + assertEquals(3, responses.size()); + assertEquals(0, responses.get(0).startTime); + assertEquals(1, responses.get(1).startTime); + assertEquals(-1, responses.get(2).startTime); + } + + @Test + void test8() { + int bufferMaxSize = 3; + NetworkPacket.Buffer buf = new NetworkPacket.Buffer(bufferMaxSize); + ArrayList<NetworkPacket.Request> requests = new ArrayList<>(); + requests.add(new NetworkPacket.Request(0, 2)); + requests.add(new NetworkPacket.Request(1, 2)); + requests.add(new NetworkPacket.Request(2, 2)); + requests.add(new NetworkPacket.Request(3, 2)); + requests.add(new NetworkPacket.Request(4, 2)); + requests.add(new NetworkPacket.Request(5, 2)); + ArrayList<NetworkPacket.Response> responses = NetworkPacket.processRequests(requests, buf); + assertEquals(6, responses.size()); + assertEquals(0, responses.get(0).startTime); + assertEquals(2, responses.get(1).startTime); + assertEquals(4, responses.get(2).startTime); + assertEquals(6, responses.get(3).startTime); + assertEquals(8, responses.get(4).startTime); + assertEquals(-1, responses.get(5).startTime); + } + + @Test + void test9() { + int bufferMaxSize = 1; + NetworkPacket.Buffer buf = new NetworkPacket.Buffer(bufferMaxSize); + ArrayList<NetworkPacket.Request> requests = new ArrayList<>(); + requests.add(new NetworkPacket.Request(0, 1)); + requests.add(new NetworkPacket.Request(1, 1)); + requests.add(new NetworkPacket.Request(2, 1)); + requests.add(new NetworkPacket.Request(3, 1)); + requests.add(new NetworkPacket.Request(3, 1)); + ArrayList<NetworkPacket.Response> responses = NetworkPacket.processRequests(requests, buf); + assertEquals(5, responses.size()); + assertEquals(0, responses.get(0).startTime); + assertEquals(1, responses.get(1).startTime); + assertEquals(2, responses.get(2).startTime); + assertEquals(3, responses.get(3).startTime); + assertEquals(-1, responses.get(4).startTime); + } + + @Test + void test10() { + int bufferMaxSize = 1; + NetworkPacket.Buffer buf = new NetworkPacket.Buffer(bufferMaxSize); + ArrayList<NetworkPacket.Request> requests = new ArrayList<>(); + requests.add(new NetworkPacket.Request(0, 1)); + requests.add(new NetworkPacket.Request(2, 1)); + ArrayList<NetworkPacket.Response> responses = NetworkPacket.processRequests(requests, buf); + assertEquals(2, responses.size()); + assertFalse(responses.get(0).dropped); + assertEquals(0, responses.get(0).startTime); + assertFalse(responses.get(1).dropped); + assertEquals(2, responses.get(1).startTime); + } } |