"yyyy-MM-dd, HH:mm"yyyy is a 4-digit yearMM is a 2-digit month from 01 to 12dd is a 2-digit day of month from 01 to 31HH is a 2-digit hour from 00 to 23 (24-hour clock)mm is a 2-digit minute from 00 to 59"2025-02-11, 14:56""2030-01-03, 13:05"FKDeliveryService String createOrder(String orderName, String pincode, String creationTime)
orderName to be delivered to pincode.creationTime is used for ordering during execute() for non-scheduled orders."ORDER_CREATED" if created successfully"ORDER_ALREADY_EXISTS" if an order with the same orderName already exists String createOrderScheduled(String orderName, String pincode, String scheduledStartTime, int durationMinutes)
scheduledStartTime is the earliest allowed pickup time and is used for ordering during execute().durationMinutes is the time needed to deliver the order."ORDER_CREATED" if created successfully"ORDER_ALREADY_EXISTS" if an order with the same orderName already exists"INVALID_SCHEDULE" if durationMinutes <= 0 String createAgent(String agentName, String pincode)
pincode."AGENT_CREATED" if created successfully"AGENT_ALREADY_EXISTS" if an agent with the same agentName already exists String addAgentPincode(String agentName, String pincode)
pincode to an existing agent."PINCODE_ADDED" if added successfully"AGENT_NOT_FOUND" if agentName does not exist"PINCODE_ALREADY_PRESENT" if the agent already has that pincode List<String> execute()
orderingTime = creationTimeorderingTime = scheduledStartTimeorderingTime (lexicographic string ordering is sufficient).orderingTime, pick lexicographically smaller orderName first.execute() call (first planned order has index 1, then 2, etc.).execute().T only if the agent is free at time T.actualPickupTime until completionTime.completionTime (so picking up another order at the same timestamp is allowed only after completion).agentName.agentName.creationTime is the earliest allowed pickup time.creationTime, pickup is delayed until the earliest time when any eligible agent becomes free.actualPickupTime is determined as described above (at creationTime if possible, otherwise delayed).completionTime = actualPickupTime.actualPickupTime and completionTime).scheduledStartTime is the earliest allowed pickup time.actualPickupTime until completionTime.actualPickupTime is:
scheduledStartTime if there exists at least one eligible agent free at scheduledStartTimecompletionTime = actualPickupTime + durationMinutesexecute())orderName firstagentName firstT and then picks up another at the same time T, the completion log of the earlier assigned order appears before the pickup log of the later assigned order.actualPickupTime (instant), and the timestamp is printed in both log strings.execute() calls.execute() call after agents are added."<agentName> has picked up <orderName> at <actualPickupTime>""<agentName> has delivered <orderName> to <pincode> at <completionTime>""<agentName> has picked up <orderName> at <actualPickupTime>""<agentName> has completed delivery of <orderName> to <pincode> at <completionTime>"1 ≤ orderName.length() ≤ 501 ≤ agentName.length() ≤ 50pincode is a string of digits with 1 ≤ pincode.length() ≤ 10createOrder and createOrderScheduled use unique orderName as the order identifier.createAgent uses unique agentName as the agent identifier."yyyy-MM-dd, HH:mm".durationMinutes > 0 for scheduled orders.FKDeliveryService service = new FKDeliveryService()service.createOrder(orderName="Order A", pincode="560087", creationTime="2025-03-22, 10:00") → "ORDER_CREATED"service.createOrder(orderName="Order B", pincode="560088", creationTime="2025-03-22, 10:01") → "ORDER_CREATED"service.createOrder(orderName="Order C", pincode="560089", creationTime="2025-03-22, 10:02") → "ORDER_CREATED"service.createOrder(orderName="Order D", pincode="560087", creationTime="2025-03-22, 10:03") → "ORDER_CREATED"service.createAgent(agentName="AgentA", pincode="560087") → "AGENT_CREATED"service.createAgent(agentName="AgentB", pincode="560088") → "AGENT_CREATED"service.createAgent(agentName="AgentC", pincode="560089") → "AGENT_CREATED"service.execute() → output below"AgentA has picked up Order A at 2025-03-22, 10:00""AgentA has delivered Order A to 560087 at 2025-03-22, 10:00""AgentB has picked up Order B at 2025-03-22, 10:01""AgentB has delivered Order B to 560088 at 2025-03-22, 10:01""AgentC has picked up Order C at 2025-03-22, 10:02""AgentC has delivered Order C to 560089 at 2025-03-22, 10:02""AgentA has picked up Order D at 2025-03-22, 10:03""AgentA has delivered Order D to 560087 at 2025-03-22, 10:03"FKDeliveryService service = new FKDeliveryService()service.createOrder(orderName="Order B", pincode="560087", creationTime="2025-03-22, 09:00") → "ORDER_CREATED"service.createOrder(orderName="Order A", pincode="560087", creationTime="2025-03-22, 09:00") → "ORDER_CREATED"service.createAgent(agentName="AgentA", pincode="560087") → "AGENT_CREATED"service.execute() → output below"AgentA has picked up Order A at 2025-03-22, 09:00""AgentA has delivered Order A to 560087 at 2025-03-22, 09:00""AgentA has picked up Order B at 2025-03-22, 09:00""AgentA has delivered Order B to 560087 at 2025-03-22, 09:00"FKDeliveryService service = new FKDeliveryService()service.createAgent(agentName="AgentA", pincode="560087") → "AGENT_CREATED"service.createOrderScheduled(orderName="Order A", pincode="560087", scheduledStartTime="2025-03-22, 10:30", durationMinutes=20) → "ORDER_CREATED"service.createOrderScheduled(orderName="Order B", pincode="560087", scheduledStartTime="2025-03-22, 10:30", durationMinutes=30) → "ORDER_CREATED"service.execute() → output below"AgentA has picked up Order A at 2025-03-22, 10:30""AgentA has completed delivery of Order A to 560087 at 2025-03-22, 10:50""AgentA has picked up Order B at 2025-03-22, 10:50""AgentA has completed delivery of Order B to 560087 at 2025-03-22, 11:20"FKDeliveryService service = new FKDeliveryService()service.createAgent(agentName="AgentA", pincode="560087") → "AGENT_CREATED"service.createOrder(orderName="Order X", pincode="560087", creationTime="2025-03-22, 10:15") → "ORDER_CREATED"service.createOrderScheduled(orderName="Order A", pincode="560087", scheduledStartTime="2025-03-22, 10:30", durationMinutes=30) → "ORDER_CREATED"service.execute() → output below"AgentA has picked up Order X at 2025-03-22, 10:15""AgentA has delivered Order X to 560087 at 2025-03-22, 10:15""AgentA has picked up Order A at 2025-03-22, 10:30""AgentA has completed delivery of Order A to 560087 at 2025-03-22, 11:00"