From 8fb37c888104178abb2cc7b6aaa495cbca2e4204 Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Fri, 13 Oct 2023 22:56:42 +0800 Subject: [PATCH] fix a bug of submit_status too short --- src/main.cpp | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0c5da48..427d45a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -110,6 +110,7 @@ template inline void write( #include static_assert(sizeof(int) == 4, "Expect int as a 32-bit integer."); static_assert(sizeof(long long) == 8, "Expect long long as a 64-bit integer."); +const char *current_command; // only for debug namespace ICPCManager { namespace BackEnd { /** @@ -184,6 +185,7 @@ struct RawTeamDataType { kIntInf, kIntInf, kIntInf, kIntInf, kIntInf, kIntInf}; int try_times_before_pass[26] = {0}; + int submissions_during_block[26] = {0}; std::vector submissions; RawTeamDataType() { ; } }; @@ -276,6 +278,7 @@ inline void Submit(char problem_name, char *team_name, if (team_data[team_id].already_passed_before_block[problem_name - 'A'] == 0 && competition_status == kBlocked) { team_data[team_id].is_frozen[problem_name - 'A'] = true; + team_data[team_id].submissions_during_block[problem_name - 'A']++; } switch (status) { case kAC: { @@ -328,7 +331,19 @@ void FreezeScoreBoard() { write("[Info]Freeze scoreboard.\n"); } void ScrollScoreBoard() { ; } -void QueryRanking(char *team_name) { ; } +void QueryRanking(char *team_name) { + if (team_name_to_id.find(team_name) == team_name_to_id.end()) { + write("[Error]Query ranking failed: cannot find the team.\n"); + return; + } + write("[Info]Complete query ranking.\n"); + if (competition_status == kBlocked) + write( + "[Warning]Scoreboard is frozen. The ranking may be inaccurate until it " + "were scrolled.\n"); + write(team_name, " NOW AT RANKING ", + team_data[team_name_to_id[team_name]].rank, "\n"); +} void QuerySubmission(char *team_name, char *problem_name, char *submit_status) { ; } @@ -363,6 +378,15 @@ inline void Submit(char problem_name, char *team_name, char *submit_status, int time) { if (BackEnd::competition_status == BackEnd::kNotStarted) throw "Competition hasn't started yet."; + if (ICPCManager::BackEnd::team_name_to_id.find(team_name) == + ICPCManager::BackEnd::team_name_to_id.end()) { + char *str = new char[1000]; + sprintf(str, + "Team not found when excuting SUBMIT %c BY %s WITH %s AT " + "%d\ncurrent command is [%s]\n", + problem_name, team_name, submit_status, time, current_command); + throw str; + } BackEnd::Submit(problem_name, team_name, submit_status, time); } inline void FlushScoreBoard() { @@ -409,6 +433,7 @@ void EndContest() { */ inline void Excute(const char *const command) { char command_name[1024]; + current_command = command; sscanf(command, "%s", command_name); ICPCManager::BackEnd::CommandType command_type = ICPCManager::BackEnd::CommandParser[command_name]; @@ -428,13 +453,15 @@ inline void Excute(const char *const command) { break; } case ICPCManager::BackEnd::kSUBMIT: { - char problem_name; + char problem_name[10]; char team_name[100]; - char submit_status[10]; + char submit_status[20]; int time; - sscanf(command, "%*s%c%*s%s%*s%s%*s%d", &problem_name, team_name, + sscanf(command, "%*s%s%*s%s%*s%s%*s%d", problem_name, team_name, submit_status, &time); - ICPCManager::API::Submit(problem_name, team_name, submit_status, time); + fprintf(stderr,"command=%s\n",command); + fprintf(stderr,"tname=%s\n",team_name); + ICPCManager::API::Submit(problem_name[0], team_name, submit_status, time); break; } case ICPCManager::BackEnd::kFLUSH: { @@ -460,7 +487,7 @@ inline void Excute(const char *const command) { case ICPCManager::BackEnd::kQUERY_SUBMISSION: { char team_name[100]; char problem_name[10]; - char status[10]; + char status[20]; sscanf(command, "%*s%s%*s%*s%s%*s%*s%s", team_name, problem_name, status); ICPCManager::API::QuerySubmission(team_name, problem_name, status); break;