From 10aa748a6de7a69e38e030e97e77090ae7467ac8 Mon Sep 17 00:00:00 2001 From: Keenan Gugeler Date: Sun, 29 Dec 2024 15:19:54 -0500 Subject: [PATCH] problem_setting: speed up int validation Integer validation via regex is unfortunately very slow. For now, regex validation for floats will be kept, since custom validation would be very cumbersome, and problems with floats usually have high overhead regardless. --- .../examples/identical_checker.cpp | 22 +++++++++++++++++-- .../examples/standard_interactor.cpp | 22 +++++++++++++++++-- .../problem_setting/examples/validator.cpp | 22 +++++++++++++++++-- .../identical_checker_interactor.cpp | 22 +++++++++++++++++-- .../standard_checker_interactor.cpp | 22 +++++++++++++++++-- sample_files/problem_setting/validator.cpp | 22 +++++++++++++++++-- 6 files changed, 120 insertions(+), 12 deletions(-) diff --git a/sample_files/problem_setting/examples/identical_checker.cpp b/sample_files/problem_setting/examples/identical_checker.cpp index 0afecfd..edfff56 100644 --- a/sample_files/problem_setting/examples/identical_checker.cpp +++ b/sample_files/problem_setting/examples/identical_checker.cpp @@ -75,10 +75,28 @@ std::string readToken(char min_char = 0, char max_char = 127) { return token; } +bool validateInt(const std::string &token) { + if (token == "0") { + return true; + } + auto i = 0u; + if (i < token.size() && token[i] == '-') { + ++i; + } + if (i >= token.size() || token[i] < '1' || '9' < token[i]) { + return false; + } + for (i++; i < token.size(); i++) { + if (token[i] < '0' || '9' < token[i]) { + return false; + } + } + return true; +} + long long readInt(long long lo, long long hi) { - static regex_t re = regex_helpers::compile("^(0|-?[1-9][0-9]*)$"); std::string token = readToken(); - assertWA(regex_helpers::match(re, token)); + assertWA(validateInt(token)); long long parsedInt; try { diff --git a/sample_files/problem_setting/examples/standard_interactor.cpp b/sample_files/problem_setting/examples/standard_interactor.cpp index dbc556f..7e304b7 100644 --- a/sample_files/problem_setting/examples/standard_interactor.cpp +++ b/sample_files/problem_setting/examples/standard_interactor.cpp @@ -129,10 +129,28 @@ std::string readToken(char min_char = 0, char max_char = 127) { return token; } +bool validateInt(const std::string &token) { + if (token == "0") { + return true; + } + auto i = 0u; + if (i < token.size() && token[i] == '-') { + ++i; + } + if (i >= token.size() || token[i] < '1' || '9' < token[i]) { + return false; + } + for (i++; i < token.size(); i++) { + if (token[i] < '0' || '9' < token[i]) { + return false; + } + } + return true; +} + long long readInt(long long lo, long long hi) { - static regex_t re = regex_helpers::compile("^(0|-?[1-9][0-9]*)$"); std::string token = readToken(); - assertWA(regex_helpers::match(re, token)); + assertWA(validateInt(token)); long long parsedInt; try { diff --git a/sample_files/problem_setting/examples/validator.cpp b/sample_files/problem_setting/examples/validator.cpp index cecc6d6..0fafe34 100644 --- a/sample_files/problem_setting/examples/validator.cpp +++ b/sample_files/problem_setting/examples/validator.cpp @@ -37,10 +37,28 @@ std::string readToken(char min_char = 0, char max_char = 127) { return token; } +bool validateInt(const std::string &token) { + if (token == "0") { + return true; + } + auto i = 0u; + if (i < token.size() && token[i] == '-') { + ++i; + } + if (i >= token.size() || token[i] < '1' || '9' < token[i]) { + return false; + } + for (i++; i < token.size(); i++) { + if (token[i] < '0' || '9' < token[i]) { + return false; + } + } + return true; +} + long long readInt(long long lo, long long hi) { - static regex_t re = regex_helpers::compile("^(0|-?[1-9][0-9]*)$"); std::string token = readToken(); - assert(regex_helpers::match(re, token)); + assert(validateInt(token)); long long parsedInt = stoll(token); // May throw. assert(lo <= parsedInt && parsedInt <= hi); diff --git a/sample_files/problem_setting/identical_checker_interactor.cpp b/sample_files/problem_setting/identical_checker_interactor.cpp index b6f1146..20c60fd 100644 --- a/sample_files/problem_setting/identical_checker_interactor.cpp +++ b/sample_files/problem_setting/identical_checker_interactor.cpp @@ -87,10 +87,28 @@ std::string readLine(char min_char = 0, char max_char = 127) { return line; } +bool validateInt(const std::string &token) { + if (token == "0") { + return true; + } + auto i = 0u; + if (i < token.size() && token[i] == '-') { + ++i; + } + if (i >= token.size() || token[i] < '1' || '9' < token[i]) { + return false; + } + for (i++; i < token.size(); i++) { + if (token[i] < '0' || '9' < token[i]) { + return false; + } + } + return true; +} + long long readInt(long long lo, long long hi) { - static regex_t re = regex_helpers::compile("^(0|-?[1-9][0-9]*)$"); std::string token = readToken(); - assertWA(regex_helpers::match(re, token)); + assertWA(validateInt(token)); long long parsedInt; try { diff --git a/sample_files/problem_setting/standard_checker_interactor.cpp b/sample_files/problem_setting/standard_checker_interactor.cpp index 4a20f36..4343ebd 100644 --- a/sample_files/problem_setting/standard_checker_interactor.cpp +++ b/sample_files/problem_setting/standard_checker_interactor.cpp @@ -130,10 +130,28 @@ std::string readToken(char min_char = 0, char max_char = 127) { return token; } +bool validateInt(const std::string &token) { + if (token == "0") { + return true; + } + auto i = 0u; + if (i < token.size() && token[i] == '-') { + ++i; + } + if (i >= token.size() || token[i] < '1' || '9' < token[i]) { + return false; + } + for (i++; i < token.size(); i++) { + if (token[i] < '0' || '9' < token[i]) { + return false; + } + } + return true; +} + long long readInt(long long lo, long long hi) { - static regex_t re = regex_helpers::compile("^(0|-?[1-9][0-9]*)$"); std::string token = readToken(); - assertWA(regex_helpers::match(re, token)); + assertWA(validateInt(token)); long long parsedInt; try { diff --git a/sample_files/problem_setting/validator.cpp b/sample_files/problem_setting/validator.cpp index 75e6362..f8e613c 100644 --- a/sample_files/problem_setting/validator.cpp +++ b/sample_files/problem_setting/validator.cpp @@ -52,10 +52,28 @@ std::string readLine(char min_char = 0, char max_char = 127) { return line; } +bool validateInt(const std::string &token) { + if (token == "0") { + return true; + } + auto i = 0u; + if (i < token.size() && token[i] == '-') { + ++i; + } + if (i >= token.size() || token[i] < '1' || '9' < token[i]) { + return false; + } + for (i++; i < token.size(); i++) { + if (token[i] < '0' || '9' < token[i]) { + return false; + } + } + return true; +} + long long readInt(long long lo, long long hi) { - static regex_t re = regex_helpers::compile("^(0|-?[1-9][0-9]*)$"); std::string token = readToken(); - assert(regex_helpers::match(re, token)); + assert(validateInt(token)); long long parsedInt = stoll(token); // May throw. assert(lo <= parsedInt && parsedInt <= hi);