System prototype
The prototype must be able to work with a configuration file and a set of external events of a certain format.
Solution should contain golang (1.22 or newer) source file/files and unit tests (optional)
Description
A player is participating in a challenge. The goal is to completely clear a dungeon. The player navigates through floors and fights monsters. We need to process the events and compile the information into a final report
Rules
- Only registered players are allowed to participate in the challenge
- The challenge ends if:
- The player leaves the dungeon
- The player cannot continue the challenge
- The dungeon opening time has expired
- Player is dead (health drops to 0)
- When entering the boss's floor, the player receives a notification
- The boss floor does not contain any monsters
- The dungeon is considered complete if:
- All floors are cleared of monsters
- The boss is defeated
- A floor is considered complete when all monsters or the boss have been killed; any time spent in that floor is no longer counted
- The player's health cannot exceed 100
Events
- All events occur sequentially in time. (Time of event N+1) >= (Time of event N)
- Time format [HH:MM:SS]. Trailing zeros are required in input and output
- The ExtraParam parameter can be a string containing multiple words.
Incoming events
| EventID |
ExtraParam |
Comment |
| 1 |
|
Player [id] registered |
| 2 |
|
Player [id] entered the dungeon |
| 3 |
|
Player [id] killed the monster |
| 4 |
|
Player [id] went to the next floor |
| 5 |
|
Player [id] went to the previous floor |
| 6 |
|
Player [id] entered the boss's floor |
| 7 |
|
Player [id] killed the boss |
| 8 |
|
Player [id] left the dungeon |
| 9 |
reason |
Player [id] cannot continue due to [reason] |
| 10 |
health |
Player [id] has restored [health] of health |
| 11 |
damage |
Player [id] recieved [damage] of damage |
Outgoing events
| EventID |
ExtraParam |
Comment |
| 31 |
|
Player [id] disqualified |
| 32 |
|
Player [id] is dead |
| 33 |
|
Player [id] makes imposible move [eventID] |
Example
[14:00:00] 1 1
[14:00:00] 2 1
[14:10:00] 2 2
[14:10:00] 3 2
[14:11:00] 2 5
[14:12:00] 3 3
[14:14:00] 2 3
[14:27:00] 2 11 60
[14:29:00] 2 11 50
[14:40:00] 1 2
[14:41:00] 1 3
[14:44:00] 1 11 50
[14:45:00] 1 3
[14:48:00] 1 4
[14:48:00] 1 6
[14:49:00] 1 11 25
[14:49:02] 1 10 80
[14:50:00] 1 11 65
[14:59:00] 1 7
[15:04:00] 1 8
Output
[14:00:00] Player [1] registered
[14:00:00] Player [2] registered
[14:10:00] Player [2] entered the dungeon
[14:10:00] Player [3] is disqualified
[14:11:00] Player [2] makes imposible move [5]
[14:14:00] Player [2] killed the monster
[14:27:00] Player [2] recieved [60] of damage
[14:29:00] Player [2] recieved [50] of damage
[14:29:00] Player [2] is dead
[14:40:00] Player [1] entered the dungeon
[14:41:00] Player [1] killed the monster
[14:44:00] Player [1] recieved [50] of damage
[14:45:00] Player [1] killed the monster
[14:48:00] Player [1] went to the next floor
[14:48:00] Player [1] entered the boss's floor
[14:49:00] Player [1] recieved [25] of damage
[14:49:02] Player [1] has restored [80] of health
[14:50:00] Player [1] recieved [65] of damage
[14:59:00] Player [1] killed the boss
[15:04:00] Player [1] left the dungeon
Configuration (json)
- Floors - Number of floors in the dungeon
- Monsters - Number of monsters on each floor of the dungeon
- OpenAt - Dungeon opening time
- Duration - Time until the dungeon closes in hours
Example
{
"Floors": 2,
"Monsters": 2,
"OpenAt": "14:05:00",
"Duration": 2
}
States
| State |
Comment |
| SUCCESS |
All floors are cleared |
| FAIL |
The player died or the dungeon is not considered completed |
| DISQUAL |
The player cannot continue or has not completed registration |
Final report
- State
SUCCESS/FAIL/DISQUAL
- Player ID
- Time spent in the dungeon (all the time until the player left the dungeon or the dungeon closed)
- Average time to clear a floor of monsters (the boss's floor is not included in the calculation)
- Time to kill the boss
- Player health at the end of the trial
Example
Final report:
[SUCCESS] 1 [00:24:00, 00:05:00, 00:11:00] HP:35
[FAIL] 2 [00:19:00, 00:00:00, 00:00:00] HP:0
[DISQUAL] 3 [00:00:00, 00:00:00, 00:00:00] HP:100