From a872f92f2c37977ce418a57de4587f84b4b474e2 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Thu, 18 May 2023 11:23:08 +0300 Subject: [PATCH 01/19] delete file using in metrics tests --- .../metrics/tests/src/text_metrics_tests.cpp | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/server/internal/metrics/tests/src/text_metrics_tests.cpp b/server/internal/metrics/tests/src/text_metrics_tests.cpp index aae644d..2e79320 100644 --- a/server/internal/metrics/tests/src/text_metrics_tests.cpp +++ b/server/internal/metrics/tests/src/text_metrics_tests.cpp @@ -5,9 +5,6 @@ #include #include -#include -#include - #include "TextMetricsLib.h" class LevDistTextMetricTest : public ::testing::Test { @@ -29,14 +26,8 @@ protected: }; TEST_F(LevDistTextMetricTest, check_eq_progs) { - std::ifstream fin1; - fin1.open("src/test-codes/code1.txt"); - - std::string text1( (std::istreambuf_iterator(fin1) ), - (std::istreambuf_iterator() ) ); - fin1.close(); - levDistTextMetric->setData(text1, text1); + levDistTextMetric->setData("a b c d e f", "a b c d e f"); EXPECT_EQ(levDistTextMetric->getMetric(), 1); } @@ -56,14 +47,8 @@ TEST_F(LevDistTextMetricTest, test_with_empty_prog) { } TEST_F(JaccardTextMetricTest, check_eq_progs){ - std::ifstream fin1; - fin1.open("src/test-codes/code1.txt"); - - std::string text1( (std::istreambuf_iterator(fin1) ), - (std::istreambuf_iterator() ) ); - fin1.close(); - jaccardTextMetric->setData(text1, text1); + jaccardTextMetric->setData("a b c d e f", "d e a b c f"); EXPECT_EQ(jaccardTextMetric->getMetric(), 1); } -- GitLab From 81d856363d1115374d98a563a1ef3addeb55d307 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Thu, 18 May 2023 21:31:51 +0300 Subject: [PATCH 02/19] some realiz fix, add new tests --- server/cmd/main.cpp | 7 +++ .../internal/metrics/src/TokenMetricImpl.cpp | 6 +-- .../metrics/tests/src/token_metrics_tests.cpp | 43 +++++++++++++++++-- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index 132040d..0e2da95 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -37,5 +37,12 @@ int main(int argc, const char* argv[]) { fin1.close(); fin2.close(); + std::vector tokens3 = {9, 45, 132, 85, 86, 89, 78, 45, 132, 128, 45, 132, 101, 1, + 128, 132, 127, 132, 103, 103, 132, 128, 84, 85, 132, 115, 1, 86, + 89, 43, 85, 132, 97, 1, 86, 132, 120, 128, 132, 113, 1, 128, 90, + 132, 127, 132, 102, 102, 132, 128, 59, 1, 128, 90, -1}; + + wsh.setData(tokens3, tokens3); + std::cout << wsh.getMetric() << std::endl; return 0; } \ No newline at end of file diff --git a/server/internal/metrics/src/TokenMetricImpl.cpp b/server/internal/metrics/src/TokenMetricImpl.cpp index 70cba71..0db790d 100644 --- a/server/internal/metrics/src/TokenMetricImpl.cpp +++ b/server/internal/metrics/src/TokenMetricImpl.cpp @@ -31,7 +31,7 @@ double LevDistTokenMetric::getMetric() { if (n == 0 || m == 0) return 0; double res = 1.0 - static_cast (lev[n-1][m-1]) / static_cast (std::max(n ,m)); - return res; + return res; } double WShinglingTokenMetric::getMetric() { @@ -44,10 +44,10 @@ double WShinglingTokenMetric::getMetric() { std::vector > sh1; std::vector > sh2; - for (size_t i = 0; i < n - 3; i++){ + for (size_t i = 0; i < n - 2; i++){ sh1.emplace_back(tokens1[i], tokens1[i+1], tokens1[i+2]); } - for (size_t i = 0; i < m - 3; i++){ + for (size_t i = 0; i < m - 2; i++){ sh2.emplace_back(tokens2[i], tokens2[i+1], tokens2[i+2]); } diff --git a/server/internal/metrics/tests/src/token_metrics_tests.cpp b/server/internal/metrics/tests/src/token_metrics_tests.cpp index 0e50eed..e023d6b 100644 --- a/server/internal/metrics/tests/src/token_metrics_tests.cpp +++ b/server/internal/metrics/tests/src/token_metrics_tests.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include "TokenMetricLib.h" @@ -70,9 +69,9 @@ TEST_F(WShinglingTokenMetricTest, check_eq_progs){ TEST_F(WShinglingTokenMetricTest, check_absolutely_not_eq_progs) { std::vector tokens1 = {1, 2, 3}; - std::vector tokens2 = {4, 5, 6, 1}; + std::vector tokens2 = {4, 5, 6}; - wShinglingTokenMetric->setData(tokens1, tokens1); + wShinglingTokenMetric->setData(tokens1, tokens2); EXPECT_EQ(wShinglingTokenMetric->getMetric(), 0); } @@ -82,11 +81,47 @@ TEST_F(WShinglingTokenMetricTest, test_with_empty_prog) { std::vector tokens1 = {1, 2, 3}; std::vector tokens2 = {}; - wShinglingTokenMetric->setData(tokens1, tokens1); + wShinglingTokenMetric->setData(tokens1, tokens2); EXPECT_EQ(wShinglingTokenMetric->getMetric(), 0); } +TEST_F(WShinglingTokenMetricTest, test_with_empty_progs) { + + std::vector tokens1 = {}; + std::vector tokens2 = {}; + + wShinglingTokenMetric->setData(tokens1, tokens2); + + EXPECT_EQ(wShinglingTokenMetric->getMetric(), 0); +} + +TEST_F(WShinglingTokenMetricTest, test_with_small_size) { + + std::vector tokens1 = {1}; + std::vector tokens2 = {2, 3}; + + wShinglingTokenMetric->setData(tokens1, tokens2); + + double res = wShinglingTokenMetric->getMetric(); + EXPECT_EQ(res, 0); +} + +TEST_F(WShinglingTokenMetricTest, test_with_big_size) { + + std::vector tokens = {9, 45, 132, 85, 86, 89, 78, 45, 132, 128, 45, 132, 101, 1, + 128, 132, 127, 132, 103, 103, 132, 128, 84, 85, 132, 115, 1, 86, + 89, 43, 85, 132, 97, 1, 86, 132, 120, 128, 132, 113, 1, 128, 90, + 132, 127, 132, 102, 102, 132, 128, 59, 1, 128, 90, -1}; + + wShinglingTokenMetric->setData(tokens, tokens); + + double res = wShinglingTokenMetric->getMetric(); + EXPECT_EQ(res, 1); +} + + + -- GitLab From 9e84c9e0aaefb81046266a44b8a5089acf2490f8 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Fri, 19 May 2023 01:06:58 +0300 Subject: [PATCH 03/19] fix bug --- server/internal/metrics/src/TokenMetricImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/internal/metrics/src/TokenMetricImpl.cpp b/server/internal/metrics/src/TokenMetricImpl.cpp index 0db790d..5c92a85 100644 --- a/server/internal/metrics/src/TokenMetricImpl.cpp +++ b/server/internal/metrics/src/TokenMetricImpl.cpp @@ -38,7 +38,7 @@ double WShinglingTokenMetric::getMetric() { unsigned long n = tokens1.size(); unsigned long m = tokens2.size(); - if (n == 0 || m == 0 || (n < 3 && m < 3)) + if (n == 0 || m == 0 || (n < 3 || m < 3)) return 0; std::vector > sh1; -- GitLab From 367e2fa0c93c6ff0a117d51007639f04b2536f85 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Sat, 20 May 2023 18:57:58 +0300 Subject: [PATCH 04/19] new test codes --- server/cmd/main.cpp | 44 +++++++++---- .../internal/metrics/src/TokenMetricImpl.cpp | 6 +- .../internal/metrics/testProgs/cpp/code1.txt | 56 +++++++++------- .../internal/metrics/testProgs/cpp/code2.txt | 65 ++++++++++++------- .../internal/metrics/testProgs/cpp/code3.txt | 65 +++++++++++++++++++ .../internal/metrics/testProgs/cpp/code4.txt | 45 +++++++++++++ .../metrics/testProgs/python/pycode2.txt | 5 ++ .../metrics/testProgs/python/pycode3.txt | 19 ++++++ .../metrics/testProgs/python/pycode4.txt | 22 +++++++ 9 files changed, 264 insertions(+), 63 deletions(-) create mode 100644 server/internal/metrics/testProgs/cpp/code3.txt create mode 100644 server/internal/metrics/testProgs/cpp/code4.txt create mode 100644 server/internal/metrics/testProgs/python/pycode3.txt create mode 100644 server/internal/metrics/testProgs/python/pycode4.txt diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index 0e2da95..9b3fc04 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -3,14 +3,39 @@ #include "PythonAntlr.h" #include "MyCppAntlr.h" #include "TokenMetricLib.h" +#include "TextMetricsLib.h" int main(int argc, const char* argv[]) { // ifstream ins("/home/denis/2023_1_DDT/antlr/test.py"); std::ifstream fin1("internal/metrics/testProgs/cpp/code1.txt"); - std::ifstream fin2("internal/metrics/testProgs/cpp/code2.txt"); + std::ifstream fin2("internal/metrics/testProgs/cpp/code4.txt"); - MyCppAntlr cppA1 = MyCppAntlr(fin1); - MyCppAntlr cppA2 = MyCppAntlr(fin2); + + std::string text1( (std::istreambuf_iterator(fin1) ), + (std::istreambuf_iterator() ) ); + + std::string text2( (std::istreambuf_iterator(fin2) ), + (std::istreambuf_iterator() ) ); + + LevDistTextMetric livDistTextMetric; + JaccardTextMetric jaccardTextMetric; + + livDistTextMetric.setData(text1, text2); + jaccardTextMetric.setData(text1, text2); + + std::cout << livDistTextMetric.getMetric() << std::endl << jaccardTextMetric.getMetric() << std::endl; + + fin1.close(); + fin2.close(); + + std::ifstream fin3("internal/metrics/testProgs/cpp/code1.txt"); + std::ifstream fin4("internal/metrics/testProgs/cpp/code4.txt"); + + MyCppAntlr cppA1 = MyCppAntlr(fin3); + MyCppAntlr cppA2 = MyCppAntlr(fin4); + + //PythonAntlr pyA1 = PythonAntlr(fin3); + //PythonAntlr pyA2 = PythonAntlr(fin4); std::vector tokens1 = cppA1.getTokensTypes(); std::vector tokens2 = cppA2.getTokensTypes(); @@ -33,16 +58,7 @@ int main(int argc, const char* argv[]) { std::cout << std::endl; std::cout << lev.getMetric() << std::endl << wsh.getMetric() << std::endl; - - fin1.close(); - fin2.close(); - - std::vector tokens3 = {9, 45, 132, 85, 86, 89, 78, 45, 132, 128, 45, 132, 101, 1, - 128, 132, 127, 132, 103, 103, 132, 128, 84, 85, 132, 115, 1, 86, - 89, 43, 85, 132, 97, 1, 86, 132, 120, 128, 132, 113, 1, 128, 90, - 132, 127, 132, 102, 102, 132, 128, 59, 1, 128, 90, -1}; - - wsh.setData(tokens3, tokens3); - std::cout << wsh.getMetric() << std::endl; + fin3.close(); + fin4.close(); return 0; } \ No newline at end of file diff --git a/server/internal/metrics/src/TokenMetricImpl.cpp b/server/internal/metrics/src/TokenMetricImpl.cpp index 5c92a85..42e0d44 100644 --- a/server/internal/metrics/src/TokenMetricImpl.cpp +++ b/server/internal/metrics/src/TokenMetricImpl.cpp @@ -38,7 +38,7 @@ double WShinglingTokenMetric::getMetric() { unsigned long n = tokens1.size(); unsigned long m = tokens2.size(); - if (n == 0 || m == 0 || (n < 3 || m < 3)) + if (n < 3 || m < 3) return 0; std::vector > sh1; @@ -74,6 +74,6 @@ double WShinglingTokenMetric::getMetric() { } void PrepareDataTokenMetric::setData(std::vector _tokens1, std::vector _tokens2) { - tokens1 = _tokens1; - tokens2 = _tokens2; + tokens1 = std::move(_tokens1); + tokens2 = std::move(_tokens2); } diff --git a/server/internal/metrics/testProgs/cpp/code1.txt b/server/internal/metrics/testProgs/cpp/code1.txt index 5fa95b8..24c4633 100644 --- a/server/internal/metrics/testProgs/cpp/code1.txt +++ b/server/internal/metrics/testProgs/cpp/code1.txt @@ -1,29 +1,41 @@ -// однострочный комментарий -// еще один -// вау еще один - #include -#include -#include +#include using namespace std; -/* многострочный комм - * // внутри него однострочный - * - */ +bool check(vector s, int i, int j){ + for (int k = 0; k < s.size(); k++){ + if (s[k] != i && s[k] != j && s[k] % i == 0 && j % s[k] == 0){ + return 0; + } + } + return 1; +} +int main(){ + long long n; + cin >> n; + vector s; + for (int i = 1; i <= n; i++){ + if (n % i == 0){ + s.push_back(i); + } + } + vector > ans; + for (int i = 0; i < s.size(); i++){ + for (int j = i + 1; j < s.size(); j++){ + if (s[j] % s[i] == 0 && check(s, s[i], s[j])){ + ans.push_back({s[i], s[j]}); + } + } + } + cout << "graph {" << endl; + for (int i = 0; i < s.size(); i++){ + cout << s[i] << endl; + } -int main() { - stringstream ss; - string res; - // ещё в код напихаю комментов - ss << "a bwfw ce "; - while(getline(ss, res, ' ')){ //комментарий после строки с кодом - /* - * летс гоу - * худшее место для многострочного коммента - */ - cout << res << endl; /* многострочный однострочно */ + for (int i = 0; i < ans.size(); i++){ + cout << ans[i].first << "--" << ans[i].second << endl; } -} + cout << "}"; +} \ No newline at end of file diff --git a/server/internal/metrics/testProgs/cpp/code2.txt b/server/internal/metrics/testProgs/cpp/code2.txt index bd5977a..d387566 100644 --- a/server/internal/metrics/testProgs/cpp/code2.txt +++ b/server/internal/metrics/testProgs/cpp/code2.txt @@ -1,32 +1,49 @@ -// однострочный комментарий -// еще один - -// вау еще один - #include -#include -#include +#include using namespace std; -/* многострочный комм - * // внутри него однострочный - * - */ +bool check1(vector s, int i, int j){ + for (int k = 0; k < s.size(); k++){ + if (s[k] != i && s[k] != j && s[k] % i == 0 && j % s[k] == 0){ + return 0; + } + } + return 1; +} + +int main(){ + long long n1; + cin >> n1; + vector s2; + for (int k = 1; k <= n1; k++){ + if (n1 % k == 0){ + s2.push_back(k); + } + } + if (n % 2 == 0) { + n+=1; + n-=1; + } + + vector > ans; + for (int i = 0; i < s2.size(); i++){ + for (int j = i + 1; j < s2.size(); j++){ + if (s2[j] % s2[i] == 0 && check1(s2, s2[i], s2[j])){ + ans.push_back({s[i], s[j]}); + } + } + } + cout << "graph {"; + cout << '\n'; + for (int k = 0; k < s2.size(); k++){ + cout << s[k] << endl; + } -int main() { - stringstream ss1; - string res1; - // ещё в код напихаю комментов - ss1 << "a bwfw ce "; - cout << "mem"; - while(getline(ss, res1, ' ')){ //комментарий после строки с кодом - /* - * летс гоу - * худшее место для многострочного коммента - */ - cout << res1 << endl; /* многострочный однострочно */ - cout << "mem2" << endl; + for (int i = 0; i < ans.size(); i++){ + cout << ans[i].first << "--" << ans[i].second << endl; } + cout << "}"; + cout << '\n'; } \ No newline at end of file diff --git a/server/internal/metrics/testProgs/cpp/code3.txt b/server/internal/metrics/testProgs/cpp/code3.txt new file mode 100644 index 0000000..4ae8f50 --- /dev/null +++ b/server/internal/metrics/testProgs/cpp/code3.txt @@ -0,0 +1,65 @@ +#include +#include + +using namespace std; + +bool check1(vector s1, int i, int j){ + for (int k = 0; k < s1.size(); k++){ + if (s1[k] != i && s1[k] != j && s1[k] % i == 0 && j % s1[k] == 0){ + return 0; + } + } + if (i % 2 == 0) { + i+=1; + i-=1; + } + return 1; +} + +int main(){ + long long n1; + cin >> n1; + vector s2; + for (int k = 1; k <= n1; k++){ + if (n1 % k == 0){ + s2.push_back(k); + } + } + + if (n % 2 == 0) { + n+=1; + n-=1; + } + + vector > ans; + for (int i = 0; i < s2.size(); i++){ + if (n % 2 == 0) { + n+=1; + n-=1; + } + } + for (int j = i + 1; j < s2.size(); j++){ + if (s2[j] % s2[i] == 0 && check1(s2, s2[i], s2[j])){ + ans.push_back({s[i], s[j]}); + } + if (n % 2 == 0) { + n+=1; + n-=1; + } + } + } + cout << "graph {"; + cout << '\n'; + for (int k = 0; k < s2.size(); k++){ + cout << s[k] << endl; + } + if (n % 2 == 0) { + n+=1; + n-=1; + } + for (int i = 0; i < ans.size(); i++){ + cout << ans[i].first << "--" << ans[i].second << endl; + } + cout << "}"; + cout << '\n'; +} \ No newline at end of file diff --git a/server/internal/metrics/testProgs/cpp/code4.txt b/server/internal/metrics/testProgs/cpp/code4.txt new file mode 100644 index 0000000..844d2cd --- /dev/null +++ b/server/internal/metrics/testProgs/cpp/code4.txt @@ -0,0 +1,45 @@ +#include +#include +#include +#include +using namespace std; +const int inf = 1e9; + + +int main() { + int n, s, f; + cin >> n >> s >> f; + s--; f--; + vector d(n, inf), p(n); + vector u(n); + vector < vector > > g(n); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + int q; + scanf("%d", &q); + if (i > 0) { + + } + } + } + d[s] = 0; + for (int i = 0; i < n; ++i) { + int v = -1; + for (int j = 0; j < n; ++j) + if (!u[j] && (v == -1 || d[j] < d[v])) + v = j; + if (d[v] == inf) break; + u[v] = true; + for (auto j : g[v]) { + int to = j.first; + int len = j.second; + if (d[v] + len < d[to]) { + d[to] = d[v] + len; + p[to] = v; + } + } + + } + cout << (d[f] == inf ? -1 : d[f]) << endl; + return 0; +} \ No newline at end of file diff --git a/server/internal/metrics/testProgs/python/pycode2.txt b/server/internal/metrics/testProgs/python/pycode2.txt index 3ddbf28..e6058de 100644 --- a/server/internal/metrics/testProgs/python/pycode2.txt +++ b/server/internal/metrics/testProgs/python/pycode2.txt @@ -16,6 +16,11 @@ for diag_id in range(n + m): if 0 <= diag_id - x < m: arr[x][diag_id - x] = current_element current_element += 1 + if 0 <= diag_id - x < m: + arr[x][diag_id - x] = current_element + current_element += 0 + + for line in arr: print(*line) \ No newline at end of file diff --git a/server/internal/metrics/testProgs/python/pycode3.txt b/server/internal/metrics/testProgs/python/pycode3.txt new file mode 100644 index 0000000..0b49d05 --- /dev/null +++ b/server/internal/metrics/testProgs/python/pycode3.txt @@ -0,0 +1,19 @@ +n2, m2 = map(int, input()).split() +arr = [[0 for _ in range(m2)] for _ in range(n2)] +current_element = 1 + +for diag_id1 in range(n2 + m2): + if diag_id1 % 2 == 0: + for x in range(n): + if 0 <= diag_id1 - x < m2: + arr[x][diag_id1 - x] = current_element + current_element += 1 + else: + for x1 in reversed(range(n2)): + if 0 <= diag_id1 - x < m2: + arr[x][diag_id1 - x1] = current_element + current_element += 2 + current_element -= 1 + +for line1 in arr: + print(*line1) \ No newline at end of file diff --git a/server/internal/metrics/testProgs/python/pycode4.txt b/server/internal/metrics/testProgs/python/pycode4.txt new file mode 100644 index 0000000..a7f0145 --- /dev/null +++ b/server/internal/metrics/testProgs/python/pycode4.txt @@ -0,0 +1,22 @@ +table = '' + + +def reverse_table(n): + global table + if n != 0: + str = input() + reverse_table(n - 1) + table += str[::-1] + '\n' + + + +n, m = map(int, input().split()) +reverse_table(n) +table = list(table) + +for i in range(len(table) - 1, 0, -1): + if table[i] == '\\' or table[i] == '/': + table[i + m + 1] = table[i] + table[i] = table[i - m - 1] + +print(''.join(table)) \ No newline at end of file -- GitLab From d4fcdcf23aee8760835dc25a5947a2e0c4e5a634 Mon Sep 17 00:00:00 2001 From: Denis Date: Mon, 22 May 2023 14:00:17 +0300 Subject: [PATCH 05/19] add return codes --- client/internal/entities/src/Task.cpp | 2 +- server/internal/entities/include/Solution.hpp | 7 +++ server/internal/entities/src/Solution.cpp | 3 + server/internal/httpServer/src/Serializer.cpp | 10 +-- .../httpServer/src/SolutionManager.cpp | 2 +- server/internal/httpServer/src/Utils.cpp | 2 +- .../service/include/SolutionService.h | 7 +-- .../internal/service/src/SolutionService.cpp | 62 +++++++++---------- .../service/tests/SolutionServiceTest.cpp | 12 ++-- .../internal/service/virtual/IMockMetrics.h | 6 -- .../service/virtual/ISolutionService.h | 5 +- 11 files changed, 58 insertions(+), 60 deletions(-) delete mode 100644 server/internal/service/virtual/IMockMetrics.h diff --git a/client/internal/entities/src/Task.cpp b/client/internal/entities/src/Task.cpp index e58c116..c329f06 100644 --- a/client/internal/entities/src/Task.cpp +++ b/client/internal/entities/src/Task.cpp @@ -1,4 +1,4 @@ #include "Task.h" Task::Task(std::size_t id, std::string_view desc, std::string_view name, double threshold) : - id(id), description(desc), name(name), threshold(threshold) {}; + id(id), description(desc), name(name), threshold(threshold) {} diff --git a/server/internal/entities/include/Solution.hpp b/server/internal/entities/include/Solution.hpp index 9a0b49e..f4aaa99 100644 --- a/server/internal/entities/include/Solution.hpp +++ b/server/internal/entities/include/Solution.hpp @@ -7,6 +7,13 @@ class Solution { public: + struct Codes { + std::string original; + std::string current; + Codes(const std::string &original, const std::string ¤t); + Codes() = default; + }; + Solution(size_t id, std::string sendDate, size_t senderId, std::string source, size_t taskId, std::string result, std::string tokens, std::string astTree, size_t orig_solution, std::string language) noexcept; diff --git a/server/internal/entities/src/Solution.cpp b/server/internal/entities/src/Solution.cpp index 0dfebf1..1558bb0 100644 --- a/server/internal/entities/src/Solution.cpp +++ b/server/internal/entities/src/Solution.cpp @@ -4,6 +4,9 @@ #include #include +Solution::Codes::Codes(const std::string &original, const std::string ¤t) + : original(original), current(current) {} + Solution::Solution(size_t id, std::string sendDate, size_t senderId, std::string source, size_t taskId, std::string result, std::string tokens, std::string astTree, size_t orig_solution, std::string language_) noexcept diff --git a/server/internal/httpServer/src/Serializer.cpp b/server/internal/httpServer/src/Serializer.cpp index ee7eb6a..72085bc 100644 --- a/server/internal/httpServer/src/Serializer.cpp +++ b/server/internal/httpServer/src/Serializer.cpp @@ -29,10 +29,7 @@ std::tuple Serializer::deserialTaskData(const std::str ss << val; boost::property_tree::ptree json; boost::property_tree::read_json(ss, json); - std::tuple res = { - json.get("user_id"), - json.get("task_id") - }; + std::tuple res = {json.get("user_id"), json.get("task_id")}; return res; } @@ -42,10 +39,7 @@ std::tuple Serializer::deserialNewTaskData(con boost::property_tree::ptree json; boost::property_tree::read_json(ss, json); std::tuple res = { - json.get("name"), - json.get("description"), - json.get("threshold") - }; + json.get("name"), json.get("description"), json.get("threshold")}; return res; } diff --git a/server/internal/httpServer/src/SolutionManager.cpp b/server/internal/httpServer/src/SolutionManager.cpp index 742a8f9..3bd96df 100644 --- a/server/internal/httpServer/src/SolutionManager.cpp +++ b/server/internal/httpServer/src/SolutionManager.cpp @@ -24,7 +24,7 @@ http::message_generator SolutionManager::createSolution(http::requestcreateSolution(user_id, task_id, filename, filedata); + Solution sol = solutionService->createSolution(user_id, task_id, filename, filedata).first; http::response res{http::status::ok, req.version()}; res.set(http::field::server, BOOST_BEAST_VERSION_STRING); res.set(http::field::content_type, "text/plain"); diff --git a/server/internal/httpServer/src/Utils.cpp b/server/internal/httpServer/src/Utils.cpp index 790aa7c..732146d 100644 --- a/server/internal/httpServer/src/Utils.cpp +++ b/server/internal/httpServer/src/Utils.cpp @@ -14,7 +14,7 @@ http::response getBadRequest(const http::request getInternalServerError(const http::request& request, - beast::string_view why) { + beast::string_view why) { http::response res{http::status::internal_server_error, request.version()}; res.set(http::field::server, BOOST_BEAST_VERSION_STRING); res.set(http::field::content_type, "text/plain"); diff --git a/server/internal/service/include/SolutionService.h b/server/internal/service/include/SolutionService.h index d89a651..2c47a99 100644 --- a/server/internal/service/include/SolutionService.h +++ b/server/internal/service/include/SolutionService.h @@ -4,7 +4,6 @@ #include #include "IAntlrWrapper.h" -#include "IMockMetrics.h" #include "ISolutionRepository.hpp" #include "ISolutionService.h" #include "ITaskRepository.hpp" @@ -19,7 +18,7 @@ class SolutionService : public ISolutionService { std::unique_ptr textMetric; std::unique_ptr tokenMetric; void setAntlrWrapper(const std::string& fileExtension, const std::string& filedata); - std::string setResultVerdict(float textBasedRes, float tokenBasedRes, size_t plagiatSolId, float treshold); + std::pair setResultVerdict(float textBasedRes, float tokenBasedRes, float treshold); std::pair getMaxTextResMetric(std::vector& solutions, const std::string& filedata, size_t userId, float treshold); @@ -30,8 +29,8 @@ class SolutionService : public ISolutionService { explicit SolutionService(std::unique_ptr solutionRepo, std::unique_ptr taskRepo); SolutionService(); - Solution createSolution(size_t userId, size_t taskId, const std::string& filename, - const std::string& filedata) override; + std::pair createSolution(size_t userId, size_t taskId, const std::string& filename, + const std::string& filedata) override; void deleteSolutionById(size_t solId) override; std::vector getSolutionsByUserAndTaskId(size_t user_id, size_t task_id) override; std::pair getMetrics(size_t solId) override; diff --git a/server/internal/service/src/SolutionService.cpp b/server/internal/service/src/SolutionService.cpp index bf63eac..2bb2ab2 100644 --- a/server/internal/service/src/SolutionService.cpp +++ b/server/internal/service/src/SolutionService.cpp @@ -35,30 +35,26 @@ void SolutionService::setAntlrWrapper(const std::string& fileExtension, const st } } -std::string SolutionService::setResultVerdict(float textBasedRes, float tokenBasedRes, size_t plagiatSolId, - float treshold = 0.5f) { +std::pair SolutionService::setResultVerdict(float textBasedRes, float tokenBasedRes, + float treshold = 0.5f) { float meanRes = (tokenBasedRes + textBasedRes) / 2; if (meanRes < treshold) { - return (boost::format("\n%s\nРезультаты метрик: %.2f\n\tАнализ текста: %.2f\n\tАнализ токенов: %.2f") % - NOT_PLAGIAT_VERDICT % meanRes % textBasedRes % tokenBasedRes) - .str(); - } - try { - std::string closestCode = solutionRepo->getSolutionById(plagiatSolId).value().getSource(); - return (boost::format( - "\n%s\nРезультаты метрик: %.2f\n\tАнализ текста: %.2f\n\tАнализ токенов: %.2f\nОчень похоже на " - "решение, отправленное до вас:\n%s") % - PLAGIAT_VERDICT % meanRes % textBasedRes % tokenBasedRes % closestCode) - .str(); - } catch (...) { - throw; + return std::make_pair( + (boost::format("\n%s\nРезультаты метрик: %.2f\n\tАнализ текста: %.2f\n\tАнализ токенов: %.2f") % + NOT_PLAGIAT_VERDICT % meanRes % textBasedRes % tokenBasedRes) + .str(), + NOT_PLAGIAT_VERDICT); } + return std::make_pair( + (boost::format("\n%s\nРезультаты метрик: %.2f\n\tАнализ текста: %.2f\n\tАнализ токенов: %.2f\n") % + PLAGIAT_VERDICT % meanRes % textBasedRes % tokenBasedRes) + .str(), + PLAGIAT_VERDICT); } std::pair SolutionService::getMaxTextResMetric(std::vector& solutions, const std::string& filedata, size_t userId, float treshold) { - // std::cout << "getMaxTextResMetric start" << std::endl; std::pair maxMatch = std::make_pair(0.0, 0); for (auto sol : solutions) { if (sol.getSenderId() == userId) { @@ -81,7 +77,6 @@ std::pair SolutionService::getMaxTextResMetric(std::vector SolutionService::getMaxTokenResMetric(std::vector& tokens, size_t userId, float treshold) { std::pair maxMatch = std::make_pair(0.0, 0); - // std::cout << "getMaxTokenResMetric start" << std::endl; for (auto sol : solutions) { if (sol.getSenderId() == userId) { continue; @@ -113,12 +107,12 @@ std::pair SolutionService::getMaxTokenResMetric(std::vector SolutionService::createSolution(size_t userId, size_t taskId, + const std::string& filename, + const std::string& filedata) { try { std::pair fileExtension = FileMethods::checkFileExtension(filename); if (!fileExtension.second) { @@ -147,22 +141,28 @@ Solution SolutionService::createSolution(size_t userId, size_t taskId, const std t1.join(); t2.join(); - size_t plagiatSolId = 1; - if (textBasedRes.first > tokenBasedRes.first) { - plagiatSolId = textBasedRes.second; - } else { - plagiatSolId = tokenBasedRes.second; + std::pair result = + setResultVerdict(textBasedRes.first, tokenBasedRes.first, treshold); + + size_t plagiatSolId = 0; + Solution::Codes codes; + if (result.second == PLAGIAT_VERDICT) { + if (textBasedRes.first > tokenBasedRes.first) { + plagiatSolId = textBasedRes.second; + } else { + plagiatSolId = tokenBasedRes.second; + } + std::string originalCode = solutionRepo->getSolutionById(plagiatSolId).value().getSource(); + codes = Solution::Codes(originalCode, filedata); } - std::string result = setResultVerdict(textBasedRes.first, tokenBasedRes.first, plagiatSolId, treshold); - Solution sol = - Solution(std::ctime(&now), userId, filedata, taskId, result, Utils::convertIntArrayIntoString(tokensTypes), - astTree, plagiatSolId, fileExtension.first); + Solution(std::ctime(&now), userId, filedata, taskId, result.first, + Utils::convertIntArrayIntoString(tokensTypes), astTree, plagiatSolId, fileExtension.first); size_t id = solutionRepo->storeSolution(sol); sol.setId(id); - return sol; + return std::make_pair(sol, codes); } catch (...) { throw; } diff --git a/server/internal/service/tests/SolutionServiceTest.cpp b/server/internal/service/tests/SolutionServiceTest.cpp index e8f9130..090ea13 100644 --- a/server/internal/service/tests/SolutionServiceTest.cpp +++ b/server/internal/service/tests/SolutionServiceTest.cpp @@ -101,12 +101,12 @@ TEST_F(SolutionServiceTest, createSolutionPlagiat) { .WillOnce(::testing::Return(std::make_optional( Solution(0, "", 1, "int main(){return 0;}", 1, "", "45 132 85 86 89 59 1 128 90 -1", "", -1, "cpp")))); - Solution sol = ss->createSolution(2, 1, "main.cpp", "size_t main(){return 1;}"); - EXPECT_EQ(sol.getId(), 1); + auto sol = ss->createSolution(2, 1, "main.cpp", "size_t main(){return 1;}"); + EXPECT_EQ(sol.first.getId(), 1); + EXPECT_EQ(sol.second.original,"int main(){return 0;}"); EXPECT_EQ( - sol.getResult(), - "\nНе, ну вы не палитесь. Плагиат.\nРезультаты метрик: 0.72\n\tАнализ текста: 0.54\n\tАнализ токенов: 0.89" - "\nОчень похоже на решение, отправленное до вас:\nint main(){return 0;}"); + sol.first.getResult(), + "\nНе, ну вы не палитесь. Плагиат.\nРезультаты метрик: 0.72\n\tАнализ текста: 0.54\n\tАнализ токенов: 0.89\n"); } TEST_F(SolutionServiceTest, createSolutionNonPlagiat) { @@ -123,7 +123,7 @@ TEST_F(SolutionServiceTest, createSolutionNonPlagiat) { EXPECT_CALL(*taskMockPtr, getTaskById(1)).Times(1).WillOnce(::testing::Return(Task(1, "desription", 0.5f, "name"))); - Solution sol = ss->createSolution(1, 1, "main.cpp", "int main(){return 0;}"); + Solution sol = ss->createSolution(1, 1, "main.cpp", "int main(){return 0;}").first; EXPECT_EQ(sol.getResult(), "\nКрасивое решение. А главное уникальное !\nРезультаты метрик: 0.00\n\tАнализ текста: 0.00\n\tАнализ " "токенов: 0.00"); diff --git a/server/internal/service/virtual/IMockMetrics.h b/server/internal/service/virtual/IMockMetrics.h deleted file mode 100644 index fc0a93f..0000000 --- a/server/internal/service/virtual/IMockMetrics.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -class IMockMetrics { - public: - virtual void countMetric(); -}; diff --git a/server/internal/service/virtual/ISolutionService.h b/server/internal/service/virtual/ISolutionService.h index 7c1294d..5449ab6 100644 --- a/server/internal/service/virtual/ISolutionService.h +++ b/server/internal/service/virtual/ISolutionService.h @@ -8,8 +8,9 @@ class ISolutionService { public: virtual ~ISolutionService() = default; - virtual Solution createSolution(size_t userId, size_t taskId, const std::string& filename, - const std::string& filedata) = 0; + virtual std::pair createSolution(size_t userId, size_t taskId, + const std::string& filename, + const std::string& filedata) = 0; virtual void deleteSolutionById(size_t solId) = 0; virtual std::vector getSolutionsByUserAndTaskId(size_t user_id, size_t task_id) = 0; virtual std::pair getMetrics(size_t solId) = 0; -- GitLab From 43b2b0db30cad1fc4464991fe7af377207c76779 Mon Sep 17 00:00:00 2001 From: Denis Date: Mon, 22 May 2023 15:08:08 +0300 Subject: [PATCH 06/19] add gettokens names func --- server/pkg/antlr/cpp14/include/MyCppAntlr.h | 1 + server/pkg/antlr/cpp14/src/MyCppAntlr.cpp | 13 +++++++++++++ server/pkg/antlr/python3/include/PythonAntlr.h | 1 + server/pkg/antlr/virtual/IAntlrWrapper.h | 1 + 4 files changed, 16 insertions(+) diff --git a/server/pkg/antlr/cpp14/include/MyCppAntlr.h b/server/pkg/antlr/cpp14/include/MyCppAntlr.h index 90c6096..9363946 100644 --- a/server/pkg/antlr/cpp14/include/MyCppAntlr.h +++ b/server/pkg/antlr/cpp14/include/MyCppAntlr.h @@ -20,6 +20,7 @@ class MyCppAntlr:public IAntlrWrapper { ~MyCppAntlr() override = default; std::vector getTokens() override; std::vector getTokensTypes() override; + std::vector getTokensNames() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp index a6dcf1c..5be789b 100644 --- a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp +++ b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp @@ -35,6 +35,19 @@ std::vector MyCppAntlr::getTokensTypes() { return ans; } +std::vector MyCppAntlr::getTokensNames() { + tokenStream_ptr->fill(); + std::vector ans(tokenStream_ptr->size()); + + int i = 0; + for (antlr4::Token *token : tokenStream_ptr->getTokens()) { + ans[i] = token->getText(); + i++; + } + + return ans; +} + std::string MyCppAntlr::getTokensString() { tokenStream_ptr->fill(); std::string res; diff --git a/server/pkg/antlr/python3/include/PythonAntlr.h b/server/pkg/antlr/python3/include/PythonAntlr.h index 16fe1b4..8442ca9 100644 --- a/server/pkg/antlr/python3/include/PythonAntlr.h +++ b/server/pkg/antlr/python3/include/PythonAntlr.h @@ -21,6 +21,7 @@ class PythonAntlr:public IAntlrWrapper { ~PythonAntlr() override = default; std::vector getTokens() override; std::vector getTokensTypes() override; + std::vector getTokensNames() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/virtual/IAntlrWrapper.h b/server/pkg/antlr/virtual/IAntlrWrapper.h index c30efcf..2482776 100644 --- a/server/pkg/antlr/virtual/IAntlrWrapper.h +++ b/server/pkg/antlr/virtual/IAntlrWrapper.h @@ -10,6 +10,7 @@ class IAntlrWrapper { virtual ~IAntlrWrapper() = default; virtual std::vector getTokens() = 0; virtual std::vector getTokensTypes() = 0; + virtual std::vector getTokensNames() = 0; virtual std::pair getTokensAndTree() = 0; virtual std::string getTokensString() = 0; virtual std::string getTreeString() = 0; -- GitLab From 17d58b0f8784e557171299e95c2cc94105ca7546 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Tue, 23 May 2023 21:54:50 +0300 Subject: [PATCH 07/19] add diff class --- server/cmd/main.cpp | 48 ++++--- server/internal/metrics/include/DiffLib.h | 38 +++++ server/internal/metrics/src/DiffLibImpl.cpp | 152 ++++++++++++++++++++ 3 files changed, 220 insertions(+), 18 deletions(-) create mode 100644 server/internal/metrics/include/DiffLib.h create mode 100644 server/internal/metrics/src/DiffLibImpl.cpp diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index 9b3fc04..df1f205 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -4,11 +4,12 @@ #include "MyCppAntlr.h" #include "TokenMetricLib.h" #include "TextMetricsLib.h" +#include "DiffLib.h" int main(int argc, const char* argv[]) { // ifstream ins("/home/denis/2023_1_DDT/antlr/test.py"); std::ifstream fin1("internal/metrics/testProgs/cpp/code1.txt"); - std::ifstream fin2("internal/metrics/testProgs/cpp/code4.txt"); + std::ifstream fin2("internal/metrics/testProgs/cpp/code2.txt"); std::string text1( (std::istreambuf_iterator(fin1) ), @@ -25,39 +26,50 @@ int main(int argc, const char* argv[]) { std::cout << livDistTextMetric.getMetric() << std::endl << jaccardTextMetric.getMetric() << std::endl; + FoundSame foundSame; + foundSame.setData(text1, text2); + std::pair res = foundSame.getTexts(); + fin1.close(); fin2.close(); std::ifstream fin3("internal/metrics/testProgs/cpp/code1.txt"); - std::ifstream fin4("internal/metrics/testProgs/cpp/code4.txt"); + std::ifstream fin4("internal/metrics/testProgs/cpp/code2.txt"); MyCppAntlr cppA1 = MyCppAntlr(fin3); MyCppAntlr cppA2 = MyCppAntlr(fin4); + std::vector str_tokens1 = cppA1.getTokensNames(); + std::vector str_tokens2 = cppA2.getTokensNames(); //PythonAntlr pyA1 = PythonAntlr(fin3); //PythonAntlr pyA2 = PythonAntlr(fin4); + foundSame.setData2(str_tokens1, str_tokens2); +//res = foundSame.getTexts(); + std::vector tokens1 = cppA1.getTokensTypes(); std::vector tokens2 = cppA2.getTokensTypes(); - LevDistTokenMetric lev; - WShinglingTokenMetric wsh; - lev.setData(tokens1, tokens2); - wsh.setData(tokens1, tokens2); - - std::cout << "Tokens1:" << std::endl; - for (int token : tokens1) { - std::cout << token << " "; - } - std::cout << std::endl; - std::cout << "Tokens2:" << std::endl; - for (int token : tokens2) { - std::cout << token << " "; - } - std::cout << std::endl; - std::cout << lev.getMetric() << std::endl << wsh.getMetric() << std::endl; +// LevDistTokenMetric lev; +// WShinglingTokenMetric wsh; +// lev.setData(tokens1, tokens2); +// wsh.setData(tokens1, tokens2); +// +// std::cout << "Tokens1:" << std::endl; +// for (int token : tokens1) { +// std::cout << token << " "; +// } +// std::cout << std::endl; +// +// std::cout << "Tokens2:" << std::endl; +// for (int token : tokens2) { +// std::cout << token << " "; +// } +// std::cout << std::endl; +// +// std::cout << lev.getMetric() << std::endl << wsh.getMetric() << std::endl; fin3.close(); fin4.close(); return 0; diff --git a/server/internal/metrics/include/DiffLib.h b/server/internal/metrics/include/DiffLib.h new file mode 100644 index 0000000..c31452f --- /dev/null +++ b/server/internal/metrics/include/DiffLib.h @@ -0,0 +1,38 @@ +// +// Created by march on 22.05.2023. +// + +#ifndef SOURCEDOUT_DIFFLIB_H +#define SOURCEDOUT_DIFFLIB_H + +#include +#include +#include +#include +#include +#include +#include + +class FoundSame { +public: + void setData(std::string text1, std::string text2); + void setData2(std::vector _tokens1, std::vector _tokens2); + void tokens2text(); + [[maybe_unused]] std::pair getTexts(); + +private: + struct Elem { + std::string op; // 1 - Insert, 2 - Delete, 3 - Copy, 4 - Replace + std::string token1; + std::string token2; + }; + + std::vector tokens1; + std::vector tokens2; + std::vector res_alignment; + + static std::vector diffTokenizer(const std::string& text); + static std::string delServSimbols(std::string s); +}; + +#endif //SOURCEDOUT_DIFFLIB_H diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp new file mode 100644 index 0000000..da99845 --- /dev/null +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -0,0 +1,152 @@ +// +// Created by march on 22.05.2023. +// +#include + +#include "DiffLib.h" + +void FoundSame::setData(std::string text1, std::string text2) { + tokens1 = diffTokenizer(text1); + tokens2 = diffTokenizer(text2); + +} + +std::vector FoundSame::diffTokenizer(const std::string& text) { + boost::char_separator sep(" \r", "\n"); + std::vector res; + boost::tokenizer < boost::char_separator > tokens(text, sep); + + for (const std::string &s: tokens) { + if (s == "\n" && !res.empty()){ + res.back() += "\n"; + } + else + res.push_back(s); + } + return res; +} + +std::pair FoundSame::getTexts() { + unsigned long n = tokens1.size(); + unsigned long m = tokens2.size(); + + std::vector > dist (n + 1, std::vector (m + 1, 0)); + + for (size_t i = 0; i < n + 1; i++){ + dist[i][0] = static_cast (i); + } + + for (size_t i = 0; i < m + 1; i++){ + dist[0][i] = static_cast (i); + } + + std::vector > cache (n + 1, std::vector (m + 1)); + + for (size_t i = 1; i <= n; i++){ + cache[i][0] = {"I", (tokens1[i-1].back() == '\n' && tokens1[i-1].size() > 2 ? "%\n" : "%"), tokens1[i-1]}; + } + for (size_t i = 1; i <= m; i++){ + cache[0][i] = {"D", tokens2[i-1], (tokens2[i-1].back() == '\n' && tokens1[i-1].size() > 2 ? "#\n" : "#")}; + } + + std::string r, h; + for (size_t i = 1; i <= n; i++){ + for (size_t j = 1; j <= m; j++){ + h = tokens1[i-1], r = tokens2[j-1]; + std::vector > cases; + + if (delServSimbols(r) == delServSimbols(h)) + cases.push_back( {dist[i - 1][j - 1], {"C", r, h} } ); + else + cases.push_back({dist[i - 1][j - 1] + 1, {"R", r, h}}); + cases.push_back( { dist[i][j-1] + 1, {"D", r, (r.back() == '\n' && r.size() > 2 ? "#\n" : "#")} } ); + cases.push_back( { dist[i-1][j] + 1, {"I", (h.back() == '\n' && h.size() > 2 ? "%\n" : "%"), h} } ); + + dist[i][j] = cases[0].first; + cache[i][j] = cases[0].second; + + for (size_t k = 1; k < cases.size(); k++){ + if (dist[i][j] > cases[k].first){ + dist[i][j] = cases[k].first; + cache[i][j] = cases[k].second; + } + } + } + } + + for (size_t i = 0; i < dist.size(); i++){ + for (size_t j = 0; j < dist[0].size(); j++){ + std::cout << dist[i][j] << " "; + } + std::cout << std::endl; + } + std::cout << std::endl; + + std::vector alignment; + size_t i = n, j = m; + while (i != 0 || j != 0){ + std::string op = cache[i][j].op; + alignment.push_back(cache[i][j]); + if (op == "C" || op == "R"){ + i--, j--; + } else if (op == "I"){ + i--; + } else{ + j--; + } + } + std::reverse(alignment.begin(), alignment.end()); + + res_alignment = alignment; + tokens2text(); + + return {"", ""}; +} + +void FoundSame::setData2(std::vector _tokens1, std::vector _tokens2) { + tokens1 = std::move(_tokens1); + tokens2 = std::move(_tokens2); +} + +void FoundSame::tokens2text() { + + std::vector ops; + + for (auto & k : res_alignment){ + std::cout << k.op << " " << k.token1 << " " << k.token2 << std::endl; + } + + for (const auto& elem : res_alignment){ + std::cout << elem.token1; + if (elem.token1.back() != '\n') + std::cout << " "; + } + std::cout << std::endl; + for (const auto &elem : res_alignment){ + ops.push_back(elem.op); + if (elem.token2.back() == '\n') { + std::string t_token = elem.token2; + t_token.pop_back(); + std::cout << t_token << "\t"; + for (const auto& oper : ops) + std::cout << oper << " "; + std::cout << std::endl; + ops.clear(); + } + else{ + std::cout << elem.token2; + if (elem.token2.back() != '\n') + std::cout << " "; + } + } +} + +std::string FoundSame::delServSimbols(std::string s) { + std::string res = std::move(s); + while(!res.empty() && res.back() == '\n'){ + res.pop_back(); + } + return res; +} + + -- GitLab From f0d210ad6a0123890d8f832d4255b0ea2ee8a560 Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 23 May 2023 22:47:56 +0300 Subject: [PATCH 08/19] add new methods --- Makefile | 2 +- server/pkg/antlr/cpp14/include/MyCppAntlr.h | 1 + server/pkg/antlr/cpp14/src/MyCppAntlr.cpp | 15 ++++++++++ .../pkg/antlr/python3/include/PythonAntlr.h | 1 + server/pkg/antlr/python3/src/PythonAntlr.cpp | 28 +++++++++++++++++++ server/pkg/antlr/virtual/IAntlrWrapper.h | 1 + 6 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ac63634..0c8001e 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ dev: docker run --rm -it \ -v $(PWD):/project \ --name app \ - ddt-project + raiden454/cpp-app stop-docker: docker stop app diff --git a/server/pkg/antlr/cpp14/include/MyCppAntlr.h b/server/pkg/antlr/cpp14/include/MyCppAntlr.h index 9363946..9df34a5 100644 --- a/server/pkg/antlr/cpp14/include/MyCppAntlr.h +++ b/server/pkg/antlr/cpp14/include/MyCppAntlr.h @@ -21,6 +21,7 @@ class MyCppAntlr:public IAntlrWrapper { std::vector getTokens() override; std::vector getTokensTypes() override; std::vector getTokensNames() override; + std::vector> getTokensNamesWithPosition() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp index 5be789b..f80d1c1 100644 --- a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp +++ b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp @@ -22,6 +22,21 @@ std::vector MyCppAntlr::getTokens() { return ans; } +std::vector> MyCppAntlr::getTokensNamesWithPosition(){ + tokenStream_ptr->fill(); + std::vector> ans(tokenStream_ptr->size()); + + int i = 0; + for (antlr4::Token *token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = token->getLine(); + ans[i]=std::make_pair(type,line); + i++; + } + + return ans; +} + std::vector MyCppAntlr::getTokensTypes() { tokenStream_ptr->fill(); std::vector ans(tokenStream_ptr->size()); diff --git a/server/pkg/antlr/python3/include/PythonAntlr.h b/server/pkg/antlr/python3/include/PythonAntlr.h index 8442ca9..615d432 100644 --- a/server/pkg/antlr/python3/include/PythonAntlr.h +++ b/server/pkg/antlr/python3/include/PythonAntlr.h @@ -22,6 +22,7 @@ class PythonAntlr:public IAntlrWrapper { std::vector getTokens() override; std::vector getTokensTypes() override; std::vector getTokensNames() override; + std::vector> getTokensNamesWithPosition() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/python3/src/PythonAntlr.cpp b/server/pkg/antlr/python3/src/PythonAntlr.cpp index eae822d..b7c83b4 100644 --- a/server/pkg/antlr/python3/src/PythonAntlr.cpp +++ b/server/pkg/antlr/python3/src/PythonAntlr.cpp @@ -22,6 +22,21 @@ std::vector PythonAntlr::getTokens() { return ans; } +std::vector> PythonAntlr::getTokensNamesWithPosition(){ + tokenStream_ptr->fill(); + std::vector> ans(tokenStream_ptr->size()); + + int i = 0; + for (antlr4::Token *token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = token->getLine(); + ans[i]=std::make_pair(type,line); + i++; + } + + return ans; +} + std::vector PythonAntlr::getTokensTypes() { tokenStream_ptr->fill(); std::vector ans(tokenStream_ptr->size()); @@ -46,6 +61,19 @@ std::string PythonAntlr::getTokensString() { return res; } +std::vector PythonAntlr::getTokensNames() { + tokenStream_ptr->fill(); + std::vector ans(tokenStream_ptr->size()); + + int i = 0; + for (antlr4::Token *token : tokenStream_ptr->getTokens()) { + ans[i] = token->getText(); + i++; + } + + return ans; +} + std::string PythonAntlr::getTreeString() { auto tree = parser_ptr->file_input(); return tree->toStringTree(&(*parser_ptr)); diff --git a/server/pkg/antlr/virtual/IAntlrWrapper.h b/server/pkg/antlr/virtual/IAntlrWrapper.h index 2482776..718a017 100644 --- a/server/pkg/antlr/virtual/IAntlrWrapper.h +++ b/server/pkg/antlr/virtual/IAntlrWrapper.h @@ -11,6 +11,7 @@ class IAntlrWrapper { virtual std::vector getTokens() = 0; virtual std::vector getTokensTypes() = 0; virtual std::vector getTokensNames() = 0; + virtual std::vector> getTokensNamesWithPosition() = 0; virtual std::pair getTokensAndTree() = 0; virtual std::string getTokensString() = 0; virtual std::string getTreeString() = 0; -- GitLab From e1a0a16b252c70698866083b90dfb25f7a517808 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Wed, 24 May 2023 03:08:36 +0300 Subject: [PATCH 09/19] add methods for type --- server/cmd/main.cpp | 18 ++- server/internal/metrics/include/DiffLib.h | 14 ++- server/internal/metrics/src/DiffLibImpl.cpp | 128 +++++++++++++++++--- 3 files changed, 137 insertions(+), 23 deletions(-) diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index df1f205..92ccf8b 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -28,7 +28,7 @@ int main(int argc, const char* argv[]) { FoundSame foundSame; foundSame.setData(text1, text2); - std::pair res = foundSame.getTexts(); + // std::pair res = foundSame.getTexts(); fin1.close(); fin2.close(); @@ -39,13 +39,21 @@ int main(int argc, const char* argv[]) { MyCppAntlr cppA1 = MyCppAntlr(fin3); MyCppAntlr cppA2 = MyCppAntlr(fin4); - std::vector str_tokens1 = cppA1.getTokensNames(); - std::vector str_tokens2 = cppA2.getTokensNames(); + // std::vector str_tokens1 = cppA1.getTokensNames(); + // std::vector str_tokens2 = cppA2.getTokensNames(); + + std::vector > str_int_tokens2 = cppA2.getTokensNamesWithPosition(); + std::vector > str_int_tokens1 = cppA1.getTokensNamesWithPosition(); + + for (int i = 0; i < str_int_tokens1.size(); i++){ + std::cout << str_int_tokens1[i].first << " " << str_int_tokens1[i].second << std::endl; + } + //PythonAntlr pyA1 = PythonAntlr(fin3); //PythonAntlr pyA2 = PythonAntlr(fin4); - foundSame.setData2(str_tokens1, str_tokens2); -//res = foundSame.getTexts(); + foundSame.setData2(str_int_tokens1, str_int_tokens2); + std::pair res = foundSame.getTexts2(); std::vector tokens1 = cppA1.getTokensTypes(); std::vector tokens2 = cppA2.getTokensTypes(); diff --git a/server/internal/metrics/include/DiffLib.h b/server/internal/metrics/include/DiffLib.h index c31452f..7ed5bef 100644 --- a/server/internal/metrics/include/DiffLib.h +++ b/server/internal/metrics/include/DiffLib.h @@ -16,9 +16,11 @@ class FoundSame { public: void setData(std::string text1, std::string text2); - void setData2(std::vector _tokens1, std::vector _tokens2); + void setData2(std::vector > _tokens1, std::vector > _tokens2); void tokens2text(); + void tokens2text2(); [[maybe_unused]] std::pair getTexts(); + [[maybe_unused]] std::pair getTexts2(); private: struct Elem { @@ -27,10 +29,20 @@ private: std::string token2; }; + struct Elem2 { + std::string op; // 1 - Insert, 2 - Delete, 3 - Copy, 4 - Replace + std::pair token1; + std::pair token2; + }; + std::vector tokens1; std::vector tokens2; std::vector res_alignment; + std::vector > str_int_tokens1; + std::vector > str_int_tokens2; + std::vector res_alignment2; + static std::vector diffTokenizer(const std::string& text); static std::string delServSimbols(std::string s); }; diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index da99845..7ecb00e 100644 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -8,7 +8,11 @@ void FoundSame::setData(std::string text1, std::string text2) { tokens1 = diffTokenizer(text1); tokens2 = diffTokenizer(text2); +} +void FoundSame::setData2(std::vector > _tokens1, std::vector > _tokens2) { + str_int_tokens1 = std::move(_tokens1); + str_int_tokens2 = std::move(_tokens2); } std::vector FoundSame::diffTokenizer(const std::string& text) { @@ -43,10 +47,10 @@ std::pair FoundSame::getTexts() { std::vector > cache (n + 1, std::vector (m + 1)); for (size_t i = 1; i <= n; i++){ - cache[i][0] = {"I", (tokens1[i-1].back() == '\n' && tokens1[i-1].size() > 2 ? "%\n" : "%"), tokens1[i-1]}; + cache[i][0] = {"I", (tokens1[i-1].back() == '\n' && tokens1[i-1].size() > 1 ? "%\n" : "%"), tokens1[i-1]}; } for (size_t i = 1; i <= m; i++){ - cache[0][i] = {"D", tokens2[i-1], (tokens2[i-1].back() == '\n' && tokens1[i-1].size() > 2 ? "#\n" : "#")}; + cache[0][i] = {"D", tokens2[i-1], (tokens2[i-1].back() == '\n' && tokens1[i-1].size() > 1 ? "#\n" : "#")}; } std::string r, h; @@ -59,8 +63,8 @@ std::pair FoundSame::getTexts() { cases.push_back( {dist[i - 1][j - 1], {"C", r, h} } ); else cases.push_back({dist[i - 1][j - 1] + 1, {"R", r, h}}); - cases.push_back( { dist[i][j-1] + 1, {"D", r, (r.back() == '\n' && r.size() > 2 ? "#\n" : "#")} } ); - cases.push_back( { dist[i-1][j] + 1, {"I", (h.back() == '\n' && h.size() > 2 ? "%\n" : "%"), h} } ); + cases.push_back( { dist[i][j-1] + 1, {"D", r, (r.back() == '\n' && r.size() > 1 ? "#\n" : "#")} } ); + cases.push_back( { dist[i-1][j] + 1, {"I", (h.back() == '\n' && h.size() > 1 ? "%\n" : "%"), h} } ); dist[i][j] = cases[0].first; cache[i][j] = cases[0].second; @@ -74,14 +78,6 @@ std::pair FoundSame::getTexts() { } } - for (size_t i = 0; i < dist.size(); i++){ - for (size_t j = 0; j < dist[0].size(); j++){ - std::cout << dist[i][j] << " "; - } - std::cout << std::endl; - } - std::cout << std::endl; - std::vector alignment; size_t i = n, j = m; while (i != 0 || j != 0){ @@ -103,11 +99,6 @@ std::pair FoundSame::getTexts() { return {"", ""}; } -void FoundSame::setData2(std::vector _tokens1, std::vector _tokens2) { - tokens1 = std::move(_tokens1); - tokens2 = std::move(_tokens2); -} - void FoundSame::tokens2text() { std::vector ops; @@ -149,4 +140,107 @@ std::string FoundSame::delServSimbols(std::string s) { return res; } +std::pair FoundSame::getTexts2() { + unsigned long n = str_int_tokens1.size(); + unsigned long m = str_int_tokens2.size(); + + std::vector > dist (n + 1, std::vector (m + 1, 0)); + + for (size_t i = 0; i < n + 1; i++){ + dist[i][0] = static_cast (i); + } + + for (size_t i = 0; i < m + 1; i++){ + dist[0][i] = static_cast (i); + } + + std::vector > cache (n + 1, std::vector (m + 1)); + + for (size_t i = 1; i <= n; i++){ + cache[i][0] = {"I", {"%", str_int_tokens1[i-1].second}, str_int_tokens1[i-1]}; // str_int_tokens1[i-1].second мб кал + } + for (size_t i = 1; i <= m; i++){ + cache[0][i] = {"D", str_int_tokens2[i-1], {"#", str_int_tokens2[i-1].second}}; //аналогично + } + + std::pair r, h; + for (size_t i = 1; i <= n; i++){ + for (size_t j = 1; j <= m; j++){ + h = str_int_tokens1[i-1], r = str_int_tokens2[j-1]; + std::vector > cases; + + if (r.first == h.first) + cases.push_back( {dist[i - 1][j - 1], {"C", r, h} } ); + else + cases.push_back({dist[i - 1][j - 1] + 1, {"R", r, h}}); + cases.push_back( { dist[i][j-1] + 1, {"D", r, {"#", h.second} } } ); + cases.push_back( { dist[i-1][j] + 1, {"I", {"%", r.second}, h} } ); + + dist[i][j] = cases[0].first; + cache[i][j] = cases[0].second; + + for (size_t k = 1; k < cases.size(); k++){ + if (dist[i][j] > cases[k].first){ + dist[i][j] = cases[k].first; + cache[i][j] = cases[k].second; + } + } + } + } + + std::vector alignment; + size_t i = n, j = m; + while (i != 0 || j != 0){ + std::string op = cache[i][j].op; + alignment.push_back(cache[i][j]); + if (op == "C" || op == "R"){ + i--, j--; + } else if (op == "I"){ + i--; + } else{ + j--; + } + } + std::reverse(alignment.begin(), alignment.end()); + + res_alignment2 = alignment; + tokens2text2(); + + return {"", ""}; +} + +void FoundSame::tokens2text2() { + std::string res1, res2; + std::vector ops; + + int line = res_alignment2[0].token1.second; + + for (auto & i : res_alignment2){ + if (i.token1.second > line){ + res1 += '\n'; + line = i.token1.second; + } + res1 += i.token1.first, res1 += " "; + } + + line = res_alignment2[0].token2.second; + for (auto & i : res_alignment2){ + if (i.token2.second > line){ + res2 += '\t'; + for (auto & op : ops){ + res2 += op, res2 += " "; + } + ops.clear(); + res2 += '\n'; + line = i.token2.second; + } + ops.push_back(i.op); + res2 += i.token2.first, res2 += " "; + } + + res1.pop_back(), res2.pop_back(); + + std::cout << res1 << "\n\n" << res2 << std::endl; +} + -- GitLab From acdda9388ce8359e9eba015590bc9b405fccd7da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=A1=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Wed, 24 May 2023 09:24:52 +0300 Subject: [PATCH 10/19] add advanced solution window --- client/internal/core/include/Core.h | 2 +- client/internal/core/src/Core.cpp | 4 +-- client/internal/entities/include/Solution.h | 4 +++ client/internal/gui/include/SolutionsWindow.h | 6 ++++ client/internal/gui/src/SolutionsWindow.cpp | 35 +++++++++++++++---- .../httpClient/include/HttpClientManager.h | 2 +- .../internal/httpClient/include/Serializer.h | 1 + .../httpClient/src/HttpClientManager.cpp | 8 +++-- client/internal/httpClient/src/Serializer.cpp | 17 +++++++++ .../internal/httpServer/include/Serializer.h | 1 + server/internal/httpServer/src/Serializer.cpp | 12 +++++++ .../httpServer/src/SolutionManager.cpp | 7 ++-- 12 files changed, 83 insertions(+), 16 deletions(-) diff --git a/client/internal/core/include/Core.h b/client/internal/core/include/Core.h index 31d3cee..a981e96 100644 --- a/client/internal/core/include/Core.h +++ b/client/internal/core/include/Core.h @@ -14,7 +14,7 @@ public: static std::vector getAllTasks(); - static Solution submitSolution(const int& task_id, const std::string& filename, const std::string& path_to_file); + static std::pair submitSolution(const int& task_id, const std::string& filename, const std::string& path_to_file); static unsigned int createTask(const std::string& name, const std::string &desc, const double& threshold); diff --git a/client/internal/core/src/Core.cpp b/client/internal/core/src/Core.cpp index 3f8acb6..aff4b39 100644 --- a/client/internal/core/src/Core.cpp +++ b/client/internal/core/src/Core.cpp @@ -5,7 +5,7 @@ #include "HttpClientManager.h" const std::string CLIENT_IP = "0.0.0.0"; -const std::string CLIENT_PORT = "8080"; +const std::string CLIENT_PORT = "8081"; HttpClientManager client(CLIENT_IP, CLIENT_PORT); std::size_t Core::user_id = -1; @@ -30,7 +30,7 @@ std::vector Core::getAllTasks() { return client.getAllTasks(); } -Solution Core::submitSolution(const int &task_id, const std::string& filename, const std::string &path_to_file) { +std::pair Core::submitSolution(const int &task_id, const std::string& filename, const std::string &path_to_file) { return client.submitSolution(user_id, task_id, filename, path_to_file); } diff --git a/client/internal/entities/include/Solution.h b/client/internal/entities/include/Solution.h index 4cf7061..9de0537 100644 --- a/client/internal/entities/include/Solution.h +++ b/client/internal/entities/include/Solution.h @@ -8,4 +8,8 @@ struct Solution { size_t id; std::string source; std::string result; + struct Codes { + std::string original; + std::string current; + }; }; \ No newline at end of file diff --git a/client/internal/gui/include/SolutionsWindow.h b/client/internal/gui/include/SolutionsWindow.h index 3107c18..df2f09d 100644 --- a/client/internal/gui/include/SolutionsWindow.h +++ b/client/internal/gui/include/SolutionsWindow.h @@ -39,6 +39,12 @@ private: QPushButton* sendButton = nullptr; QTextEdit* result = nullptr; QPushButton* backButton = nullptr; + QWidget* solutionWidget = nullptr; + QGridLayout* solutionLayout = nullptr; + QLabel* originalLabel = nullptr; + QTextEdit* original = nullptr; + QLabel* currentLabel = nullptr; + QTextEdit* current = nullptr; void setupUi(QMainWindow *UserWindow); }; diff --git a/client/internal/gui/src/SolutionsWindow.cpp b/client/internal/gui/src/SolutionsWindow.cpp index af3d1f4..ce1adb9 100644 --- a/client/internal/gui/src/SolutionsWindow.cpp +++ b/client/internal/gui/src/SolutionsWindow.cpp @@ -34,19 +34,37 @@ void SolutionsWindow::setupUi(QMainWindow *SolutionsWindow) { taskLayout->addWidget(taskDescription); - filename = new QLabel(this); + filename = new QLabel(SolutionsWindow); - chooseFileButton = new QPushButton(this); + chooseFileButton = new QPushButton(SolutionsWindow); chooseFileButton->setText(QString::fromUtf8("Выберите файл")); - sendButton = new QPushButton(this); + sendButton = new QPushButton(SolutionsWindow); sendButton->setText(QString::fromUtf8("Отправить")); - result = new QTextEdit(this); + result = new QTextEdit(SolutionsWindow); result->setReadOnly(true); result->setText(QString::fromUtf8("Отправьте для принятия решения")); - backButton = new QPushButton(this); + solutionWidget = new QWidget(SolutionsWindow); + solutionLayout = new QGridLayout(solutionWidget); + + originalLabel = new QLabel(solutionWidget); + originalLabel->setText(QString::fromUtf8("Оригинальное решение")); + original = new QTextEdit(solutionWidget); + original->setReadOnly(true); + + currentLabel = new QLabel(solutionWidget); + currentLabel->setText(QString::fromUtf8("Ваше решение")); + current = new QTextEdit(solutionWidget); + current->setReadOnly(true); + + solutionLayout->addWidget(currentLabel, 0, 0); + solutionLayout->addWidget(originalLabel, 0, 1); + solutionLayout->addWidget(current, 1, 0); + solutionLayout->addWidget(original, 1, 1); + + backButton = new QPushButton(SolutionsWindow); backButton->setText(QString::fromUtf8("Назад")); verticalLayout->addWidget(taskBox); @@ -54,6 +72,7 @@ void SolutionsWindow::setupUi(QMainWindow *SolutionsWindow) { verticalLayout->addWidget(chooseFileButton); verticalLayout->addWidget(sendButton); verticalLayout->addWidget(result); + verticalLayout->addWidget(solutionWidget); verticalLayout->addWidget(backButton); SolutionsWindow->setCentralWidget(centralwidget); @@ -75,8 +94,12 @@ void SolutionsWindow::on_sendButton_clicked() { QMessageBox::warning(this, "Ошибка отправки", "Файл должен быть указан"); return; } - Solution sol = Core::submitSolution(task.id, filename->text().toUtf8().constData(), path_to_file); + Solution sol; + Solution::Codes codes; + std::tie(sol, codes) = Core::submitSolution(task.id, filename->text().toUtf8().constData(), path_to_file); result->setText(QString::fromStdString(sol.result)); + original->setText(QString::fromUtf8(codes.original)); + current->setText(QString::fromUtf8(codes.current)); } diff --git a/client/internal/httpClient/include/HttpClientManager.h b/client/internal/httpClient/include/HttpClientManager.h index 2d15f7f..be95a33 100644 --- a/client/internal/httpClient/include/HttpClientManager.h +++ b/client/internal/httpClient/include/HttpClientManager.h @@ -19,7 +19,7 @@ public: std::pair loginUser(const std::string &login, const std::string &password); std::pair registerUser(const std::string &login, const std::string &username, const std::string &password); - Solution submitSolution(const int& user_id, const int &task_id, const std::string& filename, + std::pair submitSolution(const int& user_id, const int &task_id, const std::string& filename, const std::string &path_to_solution); unsigned int getAllSolutionsForTask(const int& user_id, const int& task_id); std::vector getAllTasks(); diff --git a/client/internal/httpClient/include/Serializer.h b/client/internal/httpClient/include/Serializer.h index ba742f2..a63ffd3 100644 --- a/client/internal/httpClient/include/Serializer.h +++ b/client/internal/httpClient/include/Serializer.h @@ -17,6 +17,7 @@ public: User deserialUserData(std::string_view body); Solution deserialSolutionData(std::string_view body); + std::pair deserialNewSolutionData(std::string_view body); std::vector deserialAllTasks(std::string_view body); }; diff --git a/client/internal/httpClient/src/HttpClientManager.cpp b/client/internal/httpClient/src/HttpClientManager.cpp index a8831c0..2f19087 100644 --- a/client/internal/httpClient/src/HttpClientManager.cpp +++ b/client/internal/httpClient/src/HttpClientManager.cpp @@ -43,7 +43,7 @@ std::pair HttpClientManager::registerUser(const std::string &log return {status, user}; } -Solution HttpClientManager::submitSolution(const int &user_id, const int &task_id, const std::string& filename, +std::pair HttpClientManager::submitSolution(const int &user_id, const int &task_id, const std::string& filename, const std::string &path_to_sound) { std::string body = serializer->serialSolutionData(user_id, task_id, filename, path_to_sound); http::response res = client->makeGetRequest("/solution/submit", body); @@ -54,8 +54,10 @@ Solution HttpClientManager::submitSolution(const int &user_id, const int &task_i auto* cbuf = boost::asio::buffer_cast(seq); res_body.append(cbuf, boost::asio::buffer_size(seq)); } - Solution sol = serializer->deserialSolutionData(res_body); - return sol; + Solution sol; + Solution::Codes codes; + std::tie(sol, codes) = serializer->deserialNewSolutionData(res_body); + return {sol, codes}; } unsigned int HttpClientManager::getAllSolutionsForTask(const int &user_id, const int &task_id) { diff --git a/client/internal/httpClient/src/Serializer.cpp b/client/internal/httpClient/src/Serializer.cpp index c2d803d..c4a505e 100644 --- a/client/internal/httpClient/src/Serializer.cpp +++ b/client/internal/httpClient/src/Serializer.cpp @@ -82,6 +82,23 @@ Solution Serializer::deserialSolutionData(std::string_view body) { return res; } +std::pair Serializer::deserialNewSolutionData(std::string_view body) { + std::stringstream ss; + ss << body; + boost::property_tree::ptree json; + boost::property_tree::read_json(ss, json); + Solution sol = { + json.get("sol_id"), + json.get("source"), + json.get("result"), + }; + Solution::Codes codes = { + json.get("original"), + json.get("your_code"), + }; + return {sol, codes}; +} + std::string Serializer::serialNewTaskData(std::string_view name, std::string_view desc, double threshold) { boost::property_tree::ptree json; json.put("name", name); diff --git a/server/internal/httpServer/include/Serializer.h b/server/internal/httpServer/include/Serializer.h index 9790ac5..35ab279 100644 --- a/server/internal/httpServer/include/Serializer.h +++ b/server/internal/httpServer/include/Serializer.h @@ -22,6 +22,7 @@ class Serializer { std::string serialAllTasks(const std::vector& tasks); std::string serialUserData(const User& user); std::string serialSolution(const Solution& sol); + std::string serialNewSolution(const Solution& sol, const Solution::Codes& codes); std::string serialTask(const Task& task); }; diff --git a/server/internal/httpServer/src/Serializer.cpp b/server/internal/httpServer/src/Serializer.cpp index 72085bc..dda60b1 100644 --- a/server/internal/httpServer/src/Serializer.cpp +++ b/server/internal/httpServer/src/Serializer.cpp @@ -116,6 +116,18 @@ std::string Serializer::serialSolution(const Solution &sol) { return out.str(); } +std::string Serializer::serialNewSolution(const Solution &sol, const Solution::Codes& codes) { + boost::property_tree::ptree json; + json.put("sol_id", sol.getId()); + json.put("source", sol.getSource()); + json.put("result", sol.getResult()); + json.put("your_code", codes.current); + json.put("original", codes.original); + std::stringstream out; + boost::property_tree::write_json(out, json); + return out.str(); +} + std::string Serializer::serialTask(const Task &task) { boost::property_tree::ptree json; json.put("name", task.getName()); diff --git a/server/internal/httpServer/src/SolutionManager.cpp b/server/internal/httpServer/src/SolutionManager.cpp index 3bd96df..3a6a1f5 100644 --- a/server/internal/httpServer/src/SolutionManager.cpp +++ b/server/internal/httpServer/src/SolutionManager.cpp @@ -24,13 +24,14 @@ http::message_generator SolutionManager::createSolution(http::requestcreateSolution(user_id, task_id, filename, filedata).first; + Solution sol; + Solution::Codes codes; + std::tie(sol, codes) = solutionService->createSolution(user_id, task_id, filename, filedata); http::response res{http::status::ok, req.version()}; res.set(http::field::server, BOOST_BEAST_VERSION_STRING); res.set(http::field::content_type, "text/plain"); res.keep_alive(req.keep_alive()); - res.body() = serializer->serialSolution(sol); - res.prepare_payload(); + res.body() = serializer->serialNewSolution(sol, codes); return res; } catch (const std::exception& e) { return getInternalServerError(req, e.what()); -- GitLab From 3d62f6910de8511d370b0ff7c5bfe47430d9cfa3 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Wed, 24 May 2023 11:44:24 +0300 Subject: [PATCH 11/19] fix some bugs --- server/cmd/main.cpp | 6 +- server/internal/metrics/src/DiffLibImpl.cpp | 29 +++++++-- .../internal/metrics/testProgs/cpp/code3.txt | 65 ++----------------- .../internal/metrics/testProgs/cpp/code4.txt | 45 +++---------- 4 files changed, 39 insertions(+), 106 deletions(-) diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index 92ccf8b..60d9fef 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -45,14 +45,10 @@ int main(int argc, const char* argv[]) { std::vector > str_int_tokens2 = cppA2.getTokensNamesWithPosition(); std::vector > str_int_tokens1 = cppA1.getTokensNamesWithPosition(); - for (int i = 0; i < str_int_tokens1.size(); i++){ - std::cout << str_int_tokens1[i].first << " " << str_int_tokens1[i].second << std::endl; - } - //PythonAntlr pyA1 = PythonAntlr(fin3); //PythonAntlr pyA2 = PythonAntlr(fin4); - foundSame.setData2(str_int_tokens1, str_int_tokens2); + foundSame.setData2(str_int_tokens2, str_int_tokens1); // поменял местами токены на вводе std::pair res = foundSame.getTexts2(); std::vector tokens1 = cppA1.getTokensTypes(); diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index 7ecb00e..3a18d1c 100644 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -173,8 +173,8 @@ std::pair FoundSame::getTexts2() { cases.push_back( {dist[i - 1][j - 1], {"C", r, h} } ); else cases.push_back({dist[i - 1][j - 1] + 1, {"R", r, h}}); - cases.push_back( { dist[i][j-1] + 1, {"D", r, {"#", h.second} } } ); - cases.push_back( { dist[i-1][j] + 1, {"I", {"%", r.second}, h} } ); + cases.push_back( { dist[i][j-1] + 1, {"D", r, {"#", r.second} } } ); + cases.push_back( { dist[i-1][j] + 1, {"I", {"%", h.second}, h} } ); dist[i][j] = cases[0].first; cache[i][j] = cases[0].second; @@ -192,6 +192,14 @@ std::pair FoundSame::getTexts2() { size_t i = n, j = m; while (i != 0 || j != 0){ std::string op = cache[i][j].op; + auto temp = cache[i][j]; + if (temp.token1.second > temp.token2.second) { + temp.token2.second = temp.token1.second; + } + else{ + temp.token1.second = temp.token2.second; + } + cache[i][j] = temp; alignment.push_back(cache[i][j]); if (op == "C" || op == "R"){ i--, j--; @@ -203,6 +211,11 @@ std::pair FoundSame::getTexts2() { } std::reverse(alignment.begin(), alignment.end()); + for (auto & a : alignment){ + std::cout << a.op << " {" << a.token1.first << " " << a.token1.second << "} {" + << a.token2.first << " " << a.token2.second << "}" << std::endl; + } + res_alignment2 = alignment; tokens2text2(); @@ -217,8 +230,10 @@ void FoundSame::tokens2text2() { for (auto & i : res_alignment2){ if (i.token1.second > line){ - res1 += '\n'; - line = i.token1.second; + while(line != i.token1.second){ + res1 += '\n'; + line++; + } } res1 += i.token1.first, res1 += " "; } @@ -231,8 +246,10 @@ void FoundSame::tokens2text2() { res2 += op, res2 += " "; } ops.clear(); - res2 += '\n'; - line = i.token2.second; + while(line < i.token2.second){ + res2+= '\n'; + line++; + } } ops.push_back(i.op); res2 += i.token2.first, res2 += " "; diff --git a/server/internal/metrics/testProgs/cpp/code3.txt b/server/internal/metrics/testProgs/cpp/code3.txt index 4ae8f50..81966bf 100644 --- a/server/internal/metrics/testProgs/cpp/code3.txt +++ b/server/internal/metrics/testProgs/cpp/code3.txt @@ -1,65 +1,12 @@ #include -#include using namespace std; -bool check1(vector s1, int i, int j){ - for (int k = 0; k < s1.size(); k++){ - if (s1[k] != i && s1[k] != j && s1[k] % i == 0 && j % s1[k] == 0){ - return 0; - } +int main() { + int a = 0, n; + cin >> n; + for (int i = 0; i < n; i++){ + a++; + cout << a; } - if (i % 2 == 0) { - i+=1; - i-=1; - } - return 1; -} - -int main(){ - long long n1; - cin >> n1; - vector s2; - for (int k = 1; k <= n1; k++){ - if (n1 % k == 0){ - s2.push_back(k); - } - } - - if (n % 2 == 0) { - n+=1; - n-=1; - } - - vector > ans; - for (int i = 0; i < s2.size(); i++){ - if (n % 2 == 0) { - n+=1; - n-=1; - } - } - for (int j = i + 1; j < s2.size(); j++){ - if (s2[j] % s2[i] == 0 && check1(s2, s2[i], s2[j])){ - ans.push_back({s[i], s[j]}); - } - if (n % 2 == 0) { - n+=1; - n-=1; - } - } - } - cout << "graph {"; - cout << '\n'; - for (int k = 0; k < s2.size(); k++){ - cout << s[k] << endl; - } - if (n % 2 == 0) { - n+=1; - n-=1; - } - for (int i = 0; i < ans.size(); i++){ - cout << ans[i].first << "--" << ans[i].second << endl; - } - cout << "}"; - cout << '\n'; } \ No newline at end of file diff --git a/server/internal/metrics/testProgs/cpp/code4.txt b/server/internal/metrics/testProgs/cpp/code4.txt index 844d2cd..ada154e 100644 --- a/server/internal/metrics/testProgs/cpp/code4.txt +++ b/server/internal/metrics/testProgs/cpp/code4.txt @@ -1,45 +1,18 @@ #include -#include -#include -#include -using namespace std; -const int inf = 1e9; +using namespace std; int main() { - int n, s, f; - cin >> n >> s >> f; - s--; f--; - vector d(n, inf), p(n); - vector u(n); - vector < vector > > g(n); - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - int q; - scanf("%d", &q); - if (i > 0) { + int a = 0, n; + cin >> n; - } - } + if (n > 0 || n <= 0){ + n++; + n--; } - d[s] = 0; - for (int i = 0; i < n; ++i) { - int v = -1; - for (int j = 0; j < n; ++j) - if (!u[j] && (v == -1 || d[j] < d[v])) - v = j; - if (d[v] == inf) break; - u[v] = true; - for (auto j : g[v]) { - int to = j.first; - int len = j.second; - if (d[v] + len < d[to]) { - d[to] = d[v] + len; - p[to] = v; - } - } + for (int i = 0; i < n; i++){ + a++; + cout << a; } - cout << (d[f] == inf ? -1 : d[f]) << endl; - return 0; } \ No newline at end of file -- GitLab From 8beb808fda522ee2c90fab267c2fdc0e8b83df11 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Wed, 24 May 2023 12:54:43 +0300 Subject: [PATCH 12/19] add output formats --- server/cmd/main.cpp | 9 ++++ server/internal/metrics/include/DiffLib.h | 2 +- server/internal/metrics/src/DiffLibImpl.cpp | 8 +-- .../metrics/testProgs/output/out1.txt | 49 +++++++++++++++++++ .../metrics/testProgs/output/out2.txt | 49 +++++++++++++++++++ 5 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 server/internal/metrics/testProgs/output/out1.txt create mode 100644 server/internal/metrics/testProgs/output/out2.txt diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index 60d9fef..60a89c6 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -51,6 +51,15 @@ int main(int argc, const char* argv[]) { foundSame.setData2(str_int_tokens2, str_int_tokens1); // поменял местами токены на вводе std::pair res = foundSame.getTexts2(); + std::ofstream out1("internal/metrics/testProgs/output/out1.txt"); + std::ofstream out2("internal/metrics/testProgs/output/out2.txt"); + + out1 << res.first; + out2 << res.second; + + out1.close(); + out2.close(); + std::vector tokens1 = cppA1.getTokensTypes(); std::vector tokens2 = cppA2.getTokensTypes(); diff --git a/server/internal/metrics/include/DiffLib.h b/server/internal/metrics/include/DiffLib.h index 7ed5bef..cea6dce 100644 --- a/server/internal/metrics/include/DiffLib.h +++ b/server/internal/metrics/include/DiffLib.h @@ -18,7 +18,7 @@ public: void setData(std::string text1, std::string text2); void setData2(std::vector > _tokens1, std::vector > _tokens2); void tokens2text(); - void tokens2text2(); + std::pair tokens2text2(); [[maybe_unused]] std::pair getTexts(); [[maybe_unused]] std::pair getTexts2(); diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index 3a18d1c..a1d326f 100644 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -217,12 +217,12 @@ std::pair FoundSame::getTexts2() { } res_alignment2 = alignment; - tokens2text2(); - return {"", ""}; + + return tokens2text2(); } -void FoundSame::tokens2text2() { +std::pair FoundSame::tokens2text2() { std::string res1, res2; std::vector ops; @@ -257,7 +257,7 @@ void FoundSame::tokens2text2() { res1.pop_back(), res2.pop_back(); - std::cout << res1 << "\n\n" << res2 << std::endl; + return {res1, res2}; } diff --git a/server/internal/metrics/testProgs/output/out1.txt b/server/internal/metrics/testProgs/output/out1.txt new file mode 100644 index 0000000..d506e6c --- /dev/null +++ b/server/internal/metrics/testProgs/output/out1.txt @@ -0,0 +1,49 @@ +#include +#include + +using namespace std ; + +bool check ( vector < int > s , int i , int j ) { +for ( int k = 0 ; k < s . size ( ) ; k ++ ) { +if ( s [ k ] != i && s [ k ] != j && s [ k ] % i == 0 && j % s [ k ] == 0 ) { +return 0 ; +} +} +return 1 ; +} + +int main ( ) { +long long n ; +cin > > n ; +vector < int > s ; +for ( int i = 1 ; i <= n ; i ++ ) { +if ( n % i == 0 ) { +s . push_back ( i ) ; +% +} + +% % % % % % % % % +% % % % +% % % % +} + +vector < pair < int , int > > ans ; +for ( int i = 0 ; i < s . size ( ) ; i ++ ) { +for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) { +if ( s [ j ] % s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) { +ans . push_back ( { s [ i ] , s [ j ] } ) ; +} +} +} +cout < < "graph {" % +% < < endl ; +for ( int i = 0 ; i < s . size ( ) ; i ++ ) { +cout < < s [ i ] < < endl ; +} + +for ( int i = 0 ; i < ans . size ( ) ; i ++ ) { +cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; +} +cout < < "}" % +% % % % ; +} \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/out2.txt b/server/internal/metrics/testProgs/output/out2.txt new file mode 100644 index 0000000..e152371 --- /dev/null +++ b/server/internal/metrics/testProgs/output/out2.txt @@ -0,0 +1,49 @@ +#include C +#include C + +using namespace std ; C C C C + +bool check1 ( vector < int > s , int i , int j ) { C R C C C C C C C C C C C C C C +for ( int k = 0 ; k < s . size ( ) ; k ++ ) { C C C C C C C C C C C C C C C C C C C +if ( s [ k ] != i && s [ k ] != j && s [ k ] % i == 0 && j % s [ k ] == 0 ) { C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C +return 0 ; C C C +} C +} C +return 1 ; C C C +} C + +int main ( ) { C C C C C +long long n1 ; C C R C +cin > > n1 ; C C C R C +vector < int > s2 ; C C C C R C +for ( int k = 1 ; k <= n1 ; k ++ ) { C C C R C C C R C R C R C C C +if ( n1 % k == 0 ) { C C R C R C C C C +s2 . push_back ( k ) ; R C C C R C C +} I +} C + +if ( n % 2 == 0 ) { I I I I I I I I I +n += 1 ; I I I I +n -= 1 ; I I I I +} C + +vector < pair < int , int > > ans ; C C C C C C C C C C C +for ( int i = 0 ; i < s2 . size ( ) ; i ++ ) { C C C C C C C C C R C C C C C C C C C +for ( int j = i + 1 ; j < s2 . size ( ) ; j ++ ) { C C C C C C C C C C C R C C C C C C C C C +if ( s2 [ j ] % s2 [ i ] == 0 && check1 ( s2 , s2 [ i ] , s2 [ j ] ) ) { C C R C C C C R C C C C C C R C R C R C C C C R C C C C C C +ans . push_back ( { s [ i ] , s [ j ] } ) ; C C C C C C C C C C C C C C C C C +} C +} C +} C +cout < < "graph {" ; C C C C I +cout < < '\n' ; I C C R C +for ( int k = 0 ; k < s2 . size ( ) ; k ++ ) { C C C R C C C R C R C C C C C R C C C +cout < < s [ k ] < < endl ; C C C C C R C C C C C +} C + +for ( int i = 0 ; i < ans . size ( ) ; i ++ ) { C C C C C C C C C C C C C C C C C C C +cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; C C C C C C C C C C C C C C C C C C C C C C C C +} C +cout < < "}" ; C C C C I +cout < < '\n' ; I I I I C +} \ No newline at end of file -- GitLab From bd83378a7ae487885007e5098fdd7b923562204f Mon Sep 17 00:00:00 2001 From: marcheanin Date: Wed, 24 May 2023 13:18:32 +0300 Subject: [PATCH 13/19] add some reducing and method --- server/internal/metrics/include/DiffLib.h | 1 + server/internal/metrics/src/DiffLibImpl.cpp | 22 ++++++-- .../metrics/testProgs/output/out2.txt | 52 +++++++++---------- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/server/internal/metrics/include/DiffLib.h b/server/internal/metrics/include/DiffLib.h index cea6dce..7062497 100644 --- a/server/internal/metrics/include/DiffLib.h +++ b/server/internal/metrics/include/DiffLib.h @@ -45,6 +45,7 @@ private: static std::vector diffTokenizer(const std::string& text); static std::string delServSimbols(std::string s); + static void outOps (std::vector ops, std::string& str); }; #endif //SOURCEDOUT_DIFFLIB_H diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index a1d326f..bc7dd15 100644 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -242,9 +242,7 @@ std::pair FoundSame::tokens2text2() { for (auto & i : res_alignment2){ if (i.token2.second > line){ res2 += '\t'; - for (auto & op : ops){ - res2 += op, res2 += " "; - } + outOps(ops, res2); ops.clear(); while(line < i.token2.second){ res2+= '\n'; @@ -260,4 +258,22 @@ std::pair FoundSame::tokens2text2() { return {res1, res2}; } +void FoundSame::outOps(std::vector ops, std::string& str) { + if (ops.empty()) return; + std::string o = ops[0]; + int f = 0; + for (auto & op : ops){ + if (op != o){ + f = 1; + break; + } + } + if (f == 0) + str += "[" + o + "]"; + else + for (auto & op : ops){ + str += op, str += " "; + } +} + diff --git a/server/internal/metrics/testProgs/output/out2.txt b/server/internal/metrics/testProgs/output/out2.txt index e152371..6de4966 100644 --- a/server/internal/metrics/testProgs/output/out2.txt +++ b/server/internal/metrics/testProgs/output/out2.txt @@ -1,49 +1,49 @@ -#include C -#include C +#include [C] +#include [C] -using namespace std ; C C C C +using namespace std ; [C] bool check1 ( vector < int > s , int i , int j ) { C R C C C C C C C C C C C C C C -for ( int k = 0 ; k < s . size ( ) ; k ++ ) { C C C C C C C C C C C C C C C C C C C -if ( s [ k ] != i && s [ k ] != j && s [ k ] % i == 0 && j % s [ k ] == 0 ) { C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C -return 0 ; C C C -} C -} C -return 1 ; C C C -} C +for ( int k = 0 ; k < s . size ( ) ; k ++ ) { [C] +if ( s [ k ] != i && s [ k ] != j && s [ k ] % i == 0 && j % s [ k ] == 0 ) { [C] +return 0 ; [C] +} [C] +} [C] +return 1 ; [C] +} [C] -int main ( ) { C C C C C +int main ( ) { [C] long long n1 ; C C R C cin > > n1 ; C C C R C vector < int > s2 ; C C C C R C for ( int k = 1 ; k <= n1 ; k ++ ) { C C C R C C C R C R C R C C C if ( n1 % k == 0 ) { C C R C R C C C C s2 . push_back ( k ) ; R C C C R C C -} I -} C +} [I] +} [C] -if ( n % 2 == 0 ) { I I I I I I I I I -n += 1 ; I I I I -n -= 1 ; I I I I -} C +if ( n % 2 == 0 ) { [I] +n += 1 ; [I] +n -= 1 ; [I] +} [C] -vector < pair < int , int > > ans ; C C C C C C C C C C C +vector < pair < int , int > > ans ; [C] for ( int i = 0 ; i < s2 . size ( ) ; i ++ ) { C C C C C C C C C R C C C C C C C C C for ( int j = i + 1 ; j < s2 . size ( ) ; j ++ ) { C C C C C C C C C C C R C C C C C C C C C if ( s2 [ j ] % s2 [ i ] == 0 && check1 ( s2 , s2 [ i ] , s2 [ j ] ) ) { C C R C C C C R C C C C C C R C R C R C C C C R C C C C C C -ans . push_back ( { s [ i ] , s [ j ] } ) ; C C C C C C C C C C C C C C C C C -} C -} C -} C +ans . push_back ( { s [ i ] , s [ j ] } ) ; [C] +} [C] +} [C] +} [C] cout < < "graph {" ; C C C C I cout < < '\n' ; I C C R C for ( int k = 0 ; k < s2 . size ( ) ; k ++ ) { C C C R C C C R C R C C C C C R C C C cout < < s [ k ] < < endl ; C C C C C R C C C C C -} C +} [C] -for ( int i = 0 ; i < ans . size ( ) ; i ++ ) { C C C C C C C C C C C C C C C C C C C -cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; C C C C C C C C C C C C C C C C C C C C C C C C -} C +for ( int i = 0 ; i < ans . size ( ) ; i ++ ) { [C] +cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; [C] +} [C] cout < < "}" ; C C C C I cout < < '\n' ; I I I I C } \ No newline at end of file -- GitLab From 469b1adb8aa58d0f753f501dec93af42f8564bbc Mon Sep 17 00:00:00 2001 From: marcheanin Date: Thu, 25 May 2023 03:05:15 +0300 Subject: [PATCH 14/19] add tokens to html and colors highliting --- server/cmd/main.cpp | 62 +---- server/internal/metrics/include/DiffLib.h | 22 +- server/internal/metrics/src/DiffLibImpl.cpp | 241 +++++++----------- .../internal/metrics/testProgs/cpp/code4.txt | 45 +++- .../metrics/testProgs/output/out1.txt | 97 ++++--- .../metrics/testProgs/output/out2.txt | 97 ++++--- .../metrics/testProgs/output/test1.html | 50 ++++ .../metrics/testProgs/output/test2.html | 52 ++++ 8 files changed, 332 insertions(+), 334 deletions(-) create mode 100644 server/internal/metrics/testProgs/output/test1.html create mode 100644 server/internal/metrics/testProgs/output/test2.html diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index 60a89c6..e277c3a 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -7,49 +7,23 @@ #include "DiffLib.h" int main(int argc, const char* argv[]) { - // ifstream ins("/home/denis/2023_1_DDT/antlr/test.py"); - std::ifstream fin1("internal/metrics/testProgs/cpp/code1.txt"); - std::ifstream fin2("internal/metrics/testProgs/cpp/code2.txt"); - - - std::string text1( (std::istreambuf_iterator(fin1) ), - (std::istreambuf_iterator() ) ); - - std::string text2( (std::istreambuf_iterator(fin2) ), - (std::istreambuf_iterator() ) ); - - LevDistTextMetric livDistTextMetric; - JaccardTextMetric jaccardTextMetric; - - livDistTextMetric.setData(text1, text2); - jaccardTextMetric.setData(text1, text2); - - std::cout << livDistTextMetric.getMetric() << std::endl << jaccardTextMetric.getMetric() << std::endl; - FoundSame foundSame; - foundSame.setData(text1, text2); - // std::pair res = foundSame.getTexts(); - - fin1.close(); - fin2.close(); std::ifstream fin3("internal/metrics/testProgs/cpp/code1.txt"); - std::ifstream fin4("internal/metrics/testProgs/cpp/code2.txt"); + std::ifstream fin4("internal/metrics/testProgs/cpp/code4.txt"); + + //PythonAntlr pyA1 = PythonAntlr(fin3); + //PythonAntlr pyA2 = PythonAntlr(fin4); MyCppAntlr cppA1 = MyCppAntlr(fin3); MyCppAntlr cppA2 = MyCppAntlr(fin4); - // std::vector str_tokens1 = cppA1.getTokensNames(); - // std::vector str_tokens2 = cppA2.getTokensNames(); - std::vector > str_int_tokens2 = cppA2.getTokensNamesWithPosition(); std::vector > str_int_tokens1 = cppA1.getTokensNamesWithPosition(); - //PythonAntlr pyA1 = PythonAntlr(fin3); - //PythonAntlr pyA2 = PythonAntlr(fin4); - foundSame.setData2(str_int_tokens2, str_int_tokens1); // поменял местами токены на вводе - std::pair res = foundSame.getTexts2(); + foundSame.setData(str_int_tokens1, str_int_tokens2); + std::pair res = foundSame.getTexts(); std::ofstream out1("internal/metrics/testProgs/output/out1.txt"); std::ofstream out2("internal/metrics/testProgs/output/out2.txt"); @@ -59,30 +33,6 @@ int main(int argc, const char* argv[]) { out1.close(); out2.close(); - - std::vector tokens1 = cppA1.getTokensTypes(); - std::vector tokens2 = cppA2.getTokensTypes(); - - - -// LevDistTokenMetric lev; -// WShinglingTokenMetric wsh; -// lev.setData(tokens1, tokens2); -// wsh.setData(tokens1, tokens2); -// -// std::cout << "Tokens1:" << std::endl; -// for (int token : tokens1) { -// std::cout << token << " "; -// } -// std::cout << std::endl; -// -// std::cout << "Tokens2:" << std::endl; -// for (int token : tokens2) { -// std::cout << token << " "; -// } -// std::cout << std::endl; -// -// std::cout << lev.getMetric() << std::endl << wsh.getMetric() << std::endl; fin3.close(); fin4.close(); return 0; diff --git a/server/internal/metrics/include/DiffLib.h b/server/internal/metrics/include/DiffLib.h index 7062497..e1cf023 100644 --- a/server/internal/metrics/include/DiffLib.h +++ b/server/internal/metrics/include/DiffLib.h @@ -15,36 +15,22 @@ class FoundSame { public: - void setData(std::string text1, std::string text2); - void setData2(std::vector > _tokens1, std::vector > _tokens2); - void tokens2text(); - std::pair tokens2text2(); + void setData(std::vector > _tokens1, std::vector > _tokens2); [[maybe_unused]] std::pair getTexts(); - [[maybe_unused]] std::pair getTexts2(); private: - struct Elem { - std::string op; // 1 - Insert, 2 - Delete, 3 - Copy, 4 - Replace - std::string token1; - std::string token2; - }; - struct Elem2 { std::string op; // 1 - Insert, 2 - Delete, 3 - Copy, 4 - Replace std::pair token1; std::pair token2; }; - std::vector tokens1; - std::vector tokens2; - std::vector res_alignment; - std::vector > str_int_tokens1; std::vector > str_int_tokens2; - std::vector res_alignment2; + std::vector res_alignment; - static std::vector diffTokenizer(const std::string& text); - static std::string delServSimbols(std::string s); + std::pair tokens2text(); + std::pair tokens2html(); static void outOps (std::vector ops, std::string& str); }; diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index bc7dd15..c65ebef 100644 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -5,142 +5,12 @@ #include "DiffLib.h" -void FoundSame::setData(std::string text1, std::string text2) { - tokens1 = diffTokenizer(text1); - tokens2 = diffTokenizer(text2); -} - -void FoundSame::setData2(std::vector > _tokens1, std::vector > _tokens2) { - str_int_tokens1 = std::move(_tokens1); - str_int_tokens2 = std::move(_tokens2); -} - -std::vector FoundSame::diffTokenizer(const std::string& text) { - boost::char_separator sep(" \r", "\n"); - std::vector res; - boost::tokenizer < boost::char_separator > tokens(text, sep); - - for (const std::string &s: tokens) { - if (s == "\n" && !res.empty()){ - res.back() += "\n"; - } - else - res.push_back(s); - } - return res; +void FoundSame::setData(std::vector > _tokens1, std::vector > _tokens2) { + str_int_tokens1 = std::move(_tokens2); + str_int_tokens2 = std::move(_tokens1); } std::pair FoundSame::getTexts() { - unsigned long n = tokens1.size(); - unsigned long m = tokens2.size(); - - std::vector > dist (n + 1, std::vector (m + 1, 0)); - - for (size_t i = 0; i < n + 1; i++){ - dist[i][0] = static_cast (i); - } - - for (size_t i = 0; i < m + 1; i++){ - dist[0][i] = static_cast (i); - } - - std::vector > cache (n + 1, std::vector (m + 1)); - - for (size_t i = 1; i <= n; i++){ - cache[i][0] = {"I", (tokens1[i-1].back() == '\n' && tokens1[i-1].size() > 1 ? "%\n" : "%"), tokens1[i-1]}; - } - for (size_t i = 1; i <= m; i++){ - cache[0][i] = {"D", tokens2[i-1], (tokens2[i-1].back() == '\n' && tokens1[i-1].size() > 1 ? "#\n" : "#")}; - } - - std::string r, h; - for (size_t i = 1; i <= n; i++){ - for (size_t j = 1; j <= m; j++){ - h = tokens1[i-1], r = tokens2[j-1]; - std::vector > cases; - - if (delServSimbols(r) == delServSimbols(h)) - cases.push_back( {dist[i - 1][j - 1], {"C", r, h} } ); - else - cases.push_back({dist[i - 1][j - 1] + 1, {"R", r, h}}); - cases.push_back( { dist[i][j-1] + 1, {"D", r, (r.back() == '\n' && r.size() > 1 ? "#\n" : "#")} } ); - cases.push_back( { dist[i-1][j] + 1, {"I", (h.back() == '\n' && h.size() > 1 ? "%\n" : "%"), h} } ); - - dist[i][j] = cases[0].first; - cache[i][j] = cases[0].second; - - for (size_t k = 1; k < cases.size(); k++){ - if (dist[i][j] > cases[k].first){ - dist[i][j] = cases[k].first; - cache[i][j] = cases[k].second; - } - } - } - } - - std::vector alignment; - size_t i = n, j = m; - while (i != 0 || j != 0){ - std::string op = cache[i][j].op; - alignment.push_back(cache[i][j]); - if (op == "C" || op == "R"){ - i--, j--; - } else if (op == "I"){ - i--; - } else{ - j--; - } - } - std::reverse(alignment.begin(), alignment.end()); - - res_alignment = alignment; - tokens2text(); - - return {"", ""}; -} - -void FoundSame::tokens2text() { - - std::vector ops; - - for (auto & k : res_alignment){ - std::cout << k.op << " " << k.token1 << " " << k.token2 << std::endl; - } - - for (const auto& elem : res_alignment){ - std::cout << elem.token1; - if (elem.token1.back() != '\n') - std::cout << " "; - } - std::cout << std::endl; - for (const auto &elem : res_alignment){ - ops.push_back(elem.op); - if (elem.token2.back() == '\n') { - std::string t_token = elem.token2; - t_token.pop_back(); - std::cout << t_token << "\t"; - for (const auto& oper : ops) - std::cout << oper << " "; - std::cout << std::endl; - ops.clear(); - } - else{ - std::cout << elem.token2; - if (elem.token2.back() != '\n') - std::cout << " "; - } - } -} - -std::string FoundSame::delServSimbols(std::string s) { - std::string res = std::move(s); - while(!res.empty() && res.back() == '\n'){ - res.pop_back(); - } - return res; -} - -std::pair FoundSame::getTexts2() { unsigned long n = str_int_tokens1.size(); unsigned long m = str_int_tokens2.size(); @@ -193,12 +63,12 @@ std::pair FoundSame::getTexts2() { while (i != 0 || j != 0){ std::string op = cache[i][j].op; auto temp = cache[i][j]; - if (temp.token1.second > temp.token2.second) { - temp.token2.second = temp.token1.second; - } - else{ - temp.token1.second = temp.token2.second; - } +// if (temp.token1.second > temp.token2.second) { +// temp.token2.second = temp.token1.second; +// } +// else{ +// temp.token1.second = temp.token2.second; +// } cache[i][j] = temp; alignment.push_back(cache[i][j]); if (op == "C" || op == "R"){ @@ -211,24 +81,18 @@ std::pair FoundSame::getTexts2() { } std::reverse(alignment.begin(), alignment.end()); - for (auto & a : alignment){ - std::cout << a.op << " {" << a.token1.first << " " << a.token1.second << "} {" - << a.token2.first << " " << a.token2.second << "}" << std::endl; - } - - res_alignment2 = alignment; - + res_alignment = alignment; - return tokens2text2(); + return tokens2html(); } -std::pair FoundSame::tokens2text2() { +std::pair FoundSame::tokens2text() { std::string res1, res2; std::vector ops; - int line = res_alignment2[0].token1.second; + int line = res_alignment[0].token1.second; - for (auto & i : res_alignment2){ + for (auto & i : res_alignment){ if (i.token1.second > line){ while(line != i.token1.second){ res1 += '\n'; @@ -238,11 +102,11 @@ std::pair FoundSame::tokens2text2() { res1 += i.token1.first, res1 += " "; } - line = res_alignment2[0].token2.second; - for (auto & i : res_alignment2){ + line = res_alignment[0].token2.second; + for (auto & i : res_alignment){ if (i.token2.second > line){ res2 += '\t'; - outOps(ops, res2); + //outOps(ops, res2); ops.clear(); while(line < i.token2.second){ res2+= '\n'; @@ -276,4 +140,75 @@ void FoundSame::outOps(std::vector ops, std::string& str) { } } +std::pair FoundSame::tokens2html() { + + std::string teg_I = ""; + std::string teg_D = ""; + std::string teg_C = ""; + std::string teg_R = ""; + std::string close_teg = ""; + + for (auto & i : res_alignment){ + + size_t pos; + while ((pos = i.token1.first.find("<")) != std::string::npos) { + i.token1.first.replace(pos, 1, "<"); + } + while ((pos = i.token1.first.find(">")) != std::string::npos) { + i.token1.first.replace(pos, 1, ">"); + } + + while ((pos = i.token2.first.find("<")) != std::string::npos) { + i.token2.first.replace(pos, 1, "<"); + } + while ((pos = i.token2.first.find(">")) != std::string::npos) { + i.token2.first.replace(pos, 1, ">"); + } + } + + std::string res1 = "\n" + "\n" + "
"; + std::string res2 = res1; + std::vector ops; + + int line = res_alignment[0].token1.second; + + for (auto & i : res_alignment){ + if (i.token1.second > line){ + while(line != i.token1.second){ + res1 += "
"; + res1 += '\n'; + line++; + } + } + res1 += i.token1.first, res1 += " "; + } + + line = res_alignment[0].token2.second; + for (auto & i : res_alignment){ + if (i.token2.second > line){ + while(line < i.token2.second){ + res2 += "
"; + res2+= '\n'; + line++; + } + } + if (i.op == "I") res2 += teg_I; + if (i.op == "D") res2 += teg_D; + if (i.op == "C") res2 += teg_C; + if (i.op == "R") res2 += teg_R; + res2 += i.token2.first; + res2 += " "; + res2 += close_teg; + } + + res1 += "
\n" + ""; + res2 += "\n" + ""; + + return {res1, res2}; +} + diff --git a/server/internal/metrics/testProgs/cpp/code4.txt b/server/internal/metrics/testProgs/cpp/code4.txt index ada154e..844d2cd 100644 --- a/server/internal/metrics/testProgs/cpp/code4.txt +++ b/server/internal/metrics/testProgs/cpp/code4.txt @@ -1,18 +1,45 @@ #include - +#include +#include +#include using namespace std; +const int inf = 1e9; + int main() { - int a = 0, n; - cin >> n; + int n, s, f; + cin >> n >> s >> f; + s--; f--; + vector d(n, inf), p(n); + vector u(n); + vector < vector > > g(n); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + int q; + scanf("%d", &q); + if (i > 0) { - if (n > 0 || n <= 0){ - n++; - n--; + } + } } + d[s] = 0; + for (int i = 0; i < n; ++i) { + int v = -1; + for (int j = 0; j < n; ++j) + if (!u[j] && (v == -1 || d[j] < d[v])) + v = j; + if (d[v] == inf) break; + u[v] = true; + for (auto j : g[v]) { + int to = j.first; + int len = j.second; + if (d[v] + len < d[to]) { + d[to] = d[v] + len; + p[to] = v; + } + } - for (int i = 0; i < n; i++){ - a++; - cout << a; } + cout << (d[f] == inf ? -1 : d[f]) << endl; + return 0; } \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/out1.txt b/server/internal/metrics/testProgs/output/out1.txt index d506e6c..823d512 100644 --- a/server/internal/metrics/testProgs/output/out1.txt +++ b/server/internal/metrics/testProgs/output/out1.txt @@ -1,49 +1,48 @@ -#include -#include - -using namespace std ; - -bool check ( vector < int > s , int i , int j ) { -for ( int k = 0 ; k < s . size ( ) ; k ++ ) { -if ( s [ k ] != i && s [ k ] != j && s [ k ] % i == 0 && j % s [ k ] == 0 ) { -return 0 ; -} -} -return 1 ; -} - -int main ( ) { -long long n ; -cin > > n ; -vector < int > s ; -for ( int i = 1 ; i <= n ; i ++ ) { -if ( n % i == 0 ) { -s . push_back ( i ) ; -% -} - -% % % % % % % % % -% % % % -% % % % -} - -vector < pair < int , int > > ans ; -for ( int i = 0 ; i < s . size ( ) ; i ++ ) { -for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) { -if ( s [ j ] % s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) { -ans . push_back ( { s [ i ] , s [ j ] } ) ; -} -} -} -cout < < "graph {" % -% < < endl ; -for ( int i = 0 ; i < s . size ( ) ; i ++ ) { -cout < < s [ i ] < < endl ; -} - -for ( int i = 0 ; i < ans . size ( ) ; i ++ ) { -cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; -} -cout < < "}" % -% % % % ; -} \ No newline at end of file + + +
#include <iostream>
+#include <vector>
+%
+%
+using namespace std ;
+bool check ( vector < int >
+
+
+s , int i ,
+int j ) { for ( int
+k = 0 ; k < s . size ( ) ; k
+++ ) { if ( s
+[ k ] != i && s [ k ] != j && s [ k
+] % i == 0 && j % s
+[ k ] == 0 ) { return 0 ; } } return 1 ; } int
+main ( ) { long long n ;
+cin > > n ;
+vector < int > s ;
+for ( int i = 1 ; i <= n ; i ++ ) {
+if ( n % i == 0 ) {
+s . push_back ( i % % ) ;
+}
+}
+vector < pair <
+int , int > > ans ;
+for ( int i = 0 ; i < s . size ( ) %
+% ; i ++ ) {
+for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
+if ( % s [ j ] % s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) )
+{ ans . push_back
+( { s [ i ] % % % % ,
+s [ j ] } ) ;
+} } } cout < < "graph {" < < endl ;
+for ( int i = 0 ;
+% i < s . size (
+) ; i ++ ) { cout < < s [ i ] < <
+endl ; } for ( int i = 0 ; i <
+ans . size ( ) ; i
+++
+)
+
+{
+cout < < % ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; } cout <
+< "}" ;
+} <EOF>
+ \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/out2.txt b/server/internal/metrics/testProgs/output/out2.txt index 6de4966..3b1cef2 100644 --- a/server/internal/metrics/testProgs/output/out2.txt +++ b/server/internal/metrics/testProgs/output/out2.txt @@ -1,49 +1,48 @@ -#include [C] -#include [C] - -using namespace std ; [C] - -bool check1 ( vector < int > s , int i , int j ) { C R C C C C C C C C C C C C C C -for ( int k = 0 ; k < s . size ( ) ; k ++ ) { [C] -if ( s [ k ] != i && s [ k ] != j && s [ k ] % i == 0 && j % s [ k ] == 0 ) { [C] -return 0 ; [C] -} [C] -} [C] -return 1 ; [C] -} [C] - -int main ( ) { [C] -long long n1 ; C C R C -cin > > n1 ; C C C R C -vector < int > s2 ; C C C C R C -for ( int k = 1 ; k <= n1 ; k ++ ) { C C C R C C C R C R C R C C C -if ( n1 % k == 0 ) { C C R C R C C C C -s2 . push_back ( k ) ; R C C C R C C -} [I] -} [C] - -if ( n % 2 == 0 ) { [I] -n += 1 ; [I] -n -= 1 ; [I] -} [C] - -vector < pair < int , int > > ans ; [C] -for ( int i = 0 ; i < s2 . size ( ) ; i ++ ) { C C C C C C C C C R C C C C C C C C C -for ( int j = i + 1 ; j < s2 . size ( ) ; j ++ ) { C C C C C C C C C C C R C C C C C C C C C -if ( s2 [ j ] % s2 [ i ] == 0 && check1 ( s2 , s2 [ i ] , s2 [ j ] ) ) { C C R C C C C R C C C C C C R C R C R C C C C R C C C C C C -ans . push_back ( { s [ i ] , s [ j ] } ) ; [C] -} [C] -} [C] -} [C] -cout < < "graph {" ; C C C C I -cout < < '\n' ; I C C R C -for ( int k = 0 ; k < s2 . size ( ) ; k ++ ) { C C C R C C C R C R C C C C C R C C C -cout < < s [ k ] < < endl ; C C C C C R C C C C C -} [C] - -for ( int i = 0 ; i < ans . size ( ) ; i ++ ) { [C] -cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; [C] -} [C] -cout < < "}" ; C C C C I -cout < < '\n' ; I I I I C -} \ No newline at end of file + + +
#include <iostream>
+#include <vector>
+#include<algorithm>
+#include<cmath>
+using namespace std ;
+# const int inf = 1e9 ;
+
+
+int main ( ) {
+int n , s , f ;
+cin > > n > > s # > > f ; #
+s -- ; f -- ;
+vector < int > d ( n , inf ) , p ( n ) ;
+vector < int > u ( n ) ;
+vector < vector < pair < int , int > > > g ( n ) ;
+for ( # int i = 0 ;
+# i < n ;
+# # i ++ ) {
+for ( int j = 0 ; j < n ; j ++ ) {
+int q ; scanf ( "%d" , & q
+) ; if ( i > 0 ) {
+}
+}
+# # # }
+d [ s ] = 0 ;
+for ( int i = 0 ; i < n ; ++ i ) {
+int v = - 1 ;
+for ( int j = # # 0 ; j < # # # # n ; # ++ j )
+if ( ! u [ j ] # # && ( v == # # # - 1 || d [ j ] < d [ v ] ) )
+v = j ;
+if ( d [ v ] == inf ) break ;
+u [ v ] = true ;
+for ( auto j : g [ v ] ) {
+int to = j . first ;
+int len = j . second ;
+if ( d [ v ] + len < d [ to ] ) {
+d [ to ] = d [ v ] + len ;
+p [ to ] = v ;
+}
+}
+
+}
+cout < < ( d [ f ] # == inf ? - 1 : d [ f ] # ) < < endl ; # # #
+return 0 ;
+} <EOF>
+ \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test1.html b/server/internal/metrics/testProgs/output/test1.html new file mode 100644 index 0000000..39f17df --- /dev/null +++ b/server/internal/metrics/testProgs/output/test1.html @@ -0,0 +1,50 @@ + + +
#include <iostream> +
+ #include <vector> +
+ %
+ %
+ using namespace std ;
+ bool check ( vector < int >
+
+
+ s , int i ,
+ int j ) { for ( int
+ k = 0 ; k < s . size ( ) ; k
+ ++ ) { if ( s
+ [ k ] != i && s [ k ] != j && s [ k
+ ] % i == 0 && j % s
+ [ k ] == 0 ) { return 0 ; } } return 1 ; } int
+ main ( ) { long long n ;
+ cin > > n ;
+ vector < int > s ;
+ for ( int i = 1 ; i <= n ; i ++ ) {
+ if ( n % i == 0 ) {
+ s . push_back ( i % % ) ;
+ }
+ }
+ vector < pair <
+ int , int > > ans ;
+ for ( int i = 0 ; i < s . size ( ) %
+ % ; i ++ ) {
+ for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
+ if ( % s [ j ] % s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) )
+ { ans . push_back
+ ( { s [ i ] % % % % ,
+ s [ j ] } ) ;
+ } } } cout < < "graph {" < < endl ;
+ for ( int i = 0 ;
+ % i < s . size (
+ ) ; i ++ ) { cout < < s [ i ] < <
+ endl ; } for ( int i = 0 ; i <
+ ans . size ( ) ; i
+ ++
+ )
+
+ {
+ cout < < % ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; } cout <
+ < "}" ;
+ } <EOF>
+ \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test2.html b/server/internal/metrics/testProgs/output/test2.html new file mode 100644 index 0000000..e1e272c --- /dev/null +++ b/server/internal/metrics/testProgs/output/test2.html @@ -0,0 +1,52 @@ + + +
#include <iostream> +
+ #include <vector> +
+ #include<algorithm> +
+ #include<cmath> +
+ using namespace std ;
+ # const int inf = 1e9 ;
+
+
+ int main ( ) {
+ int n , s , f ;
+ cin > > n > > s # > > f ; #
+ s -- ; f -- ;
+ vector < int > d ( n , inf ) , p ( n ) ;
+ vector < int > u ( n ) ;
+ vector < vector < pair < int , int > > > g ( n ) ;
+ for ( # int i = 0 ;
+ # i < n ;
+ # # i ++ ) {
+ for ( int j = 0 ; j < n ; j ++ ) {
+ int q ; scanf ( "%d" , & q
+ ) ; if ( i > 0 ) {
+ }
+ }
+ # # # }
+ d [ s ] = 0 ;
+ for ( int i = 0 ; i < n ; ++ i ) {
+ int v = - 1 ;
+ for ( int j = # # 0 ; j < # # # # n ; # ++ j )
+ if ( ! u [ j ] # # && ( v == # # # - 1 || d [ j ] < d [ v ] ) )
+ v = j ;
+ if ( d [ v ] == inf ) break ;
+ u [ v ] = true ;
+ for ( auto j : g [ v ] ) {
+ int to = j . first ;
+ int len = j . second ;
+ if ( d [ v ] + len < d [ to ] ) {
+ d [ to ] = d [ v ] + len ;
+ p [ to ] = v ;
+ }
+ }
+
+ }
+ cout < < ( d [ f ] # == inf ? - 1 : d [ f ] # ) < < endl ; # # #
+ return 0 ;
+ } <EOF>
+ \ No newline at end of file -- GitLab From 2d2bd096950c5a33061c7ca8f8f6441cd6155e86 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Thu, 25 May 2023 03:22:25 +0300 Subject: [PATCH 15/19] fixes with style --- server/internal/metrics/src/DiffLibImpl.cpp | 20 ++++- .../metrics/testProgs/output/out1.txt | 80 ++++++++--------- .../metrics/testProgs/output/out2.txt | 84 ++++++++--------- .../metrics/testProgs/output/test1.html | 90 +++++++++---------- .../metrics/testProgs/output/test2.html | 84 ++++++++--------- 5 files changed, 183 insertions(+), 175 deletions(-) diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index c65ebef..8b2febb 100644 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -164,6 +164,16 @@ std::pair FoundSame::tokens2html() { while ((pos = i.token2.first.find(">")) != std::string::npos) { i.token2.first.replace(pos, 1, ">"); } + + if (i.token1.first == "%") { + i.token1.first = ""; + i.token1.second = -1; + } + + if (i.token2.first == "#") { + i.token2.first = ""; + i.token2.second = -1; + } } std::string res1 = "\n" @@ -182,7 +192,13 @@ std::pair FoundSame::tokens2html() { line++; } } - res1 += i.token1.first, res1 += " "; + if (i.op == "I") res1 += teg_I; + if (i.op == "D") res1 += teg_D; + if (i.op == "C") res1 += teg_C; + if (i.op == "R") res1 += teg_R; + res1 += i.token1.first; + if (!i.token1.first.empty()) res1 += " "; + res1 += close_teg; } line = res_alignment[0].token2.second; @@ -199,7 +215,7 @@ std::pair FoundSame::tokens2html() { if (i.op == "C") res2 += teg_C; if (i.op == "R") res2 += teg_R; res2 += i.token2.first; - res2 += " "; + if (!i.token2.first.empty()) res2 += " "; res2 += close_teg; } diff --git a/server/internal/metrics/testProgs/output/out1.txt b/server/internal/metrics/testProgs/output/out1.txt index 823d512..c8da48c 100644 --- a/server/internal/metrics/testProgs/output/out1.txt +++ b/server/internal/metrics/testProgs/output/out1.txt @@ -1,48 +1,44 @@ -
#include <iostream>
-#include <vector>
-%
-%
-using namespace std ;
-bool check ( vector < int >
+
#include <iostream>
+#include <vector>

+using namespace std ;

-s , int i ,
-int j ) { for ( int
-k = 0 ; k < s . size ( ) ; k
-++ ) { if ( s
-[ k ] != i && s [ k ] != j && s [ k
-] % i == 0 && j % s
-[ k ] == 0 ) { return 0 ; } } return 1 ; } int
-main ( ) { long long n ;
-cin > > n ;
-vector < int > s ;
-for ( int i = 1 ; i <= n ; i ++ ) {
-if ( n % i == 0 ) {
-s . push_back ( i % % ) ;
-}
-}
-vector < pair <
-int , int > > ans ;
-for ( int i = 0 ; i < s . size ( ) %
-% ; i ++ ) {
-for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
-if ( % s [ j ] % s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) )
-{ ans . push_back
-( { s [ i ] % % % % ,
-s [ j ] } ) ;
-} } } cout < < "graph {" < < endl ;
-for ( int i = 0 ;
-% i < s . size (
-) ; i ++ ) { cout < < s [ i ] < <
-endl ; } for ( int i = 0 ; i <
-ans . size ( ) ; i
-++
-)
+bool check ( vector < int > s , int i , int j ) {
+for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
+if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
+return 0 ;
+}
+}
+return 1 ;
+}

-{
-cout < < % ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; } cout <
-< "}" ;
-} <EOF>
+int main ( ) {
+long long n ;
+cin > > n ;
+vector < int > s ;
+for ( int i = 1 ; i <= n ; i ++ ) {
+if ( n i == 0 ) {
+s . push_back ( i ) ;
+}
+}
+vector < pair < int , int > > ans ;
+for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
+if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
+ans . push_back ( { s [ i ] , s [ j ] } ) ;
+}
+}
+}
+cout < < "graph {" < < endl ;
+for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+cout < < s [ i ] < < endl ;
+}
+
+for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
+cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
+}
+cout < < "}" ;
+} <EOF>
\ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/out2.txt b/server/internal/metrics/testProgs/output/out2.txt index 3b1cef2..cbc62ed 100644 --- a/server/internal/metrics/testProgs/output/out2.txt +++ b/server/internal/metrics/testProgs/output/out2.txt @@ -1,48 +1,48 @@ -
#include <iostream>
-#include <vector>
-#include<algorithm>
-#include<cmath>
-using namespace std ;
-# const int inf = 1e9 ;
+
#include <iostream>
+#include <vector>
+#include<algorithm>
+#include<cmath>
+usingnamespacestd;
+constintinf=1e9;


-int main ( ) {
-int n , s , f ;
-cin > > n > > s # > > f ; #
-s -- ; f -- ;
-vector < int > d ( n , inf ) , p ( n ) ;
-vector < int > u ( n ) ;
-vector < vector < pair < int , int > > > g ( n ) ;
-for ( # int i = 0 ;
-# i < n ;
-# # i ++ ) {
-for ( int j = 0 ; j < n ; j ++ ) {
-int q ; scanf ( "%d" , & q
-) ; if ( i > 0 ) {
-}
-}
-# # # }
-d [ s ] = 0 ;
-for ( int i = 0 ; i < n ; ++ i ) {
-int v = - 1 ;
-for ( int j = # # 0 ; j < # # # # n ; # ++ j )
-if ( ! u [ j ] # # && ( v == # # # - 1 || d [ j ] < d [ v ] ) )
-v = j ;
-if ( d [ v ] == inf ) break ;
-u [ v ] = true ;
-for ( auto j : g [ v ] ) {
-int to = j . first ;
-int len = j . second ;
-if ( d [ v ] + len < d [ to ] ) {
-d [ to ] = d [ v ] + len ;
-p [ to ] = v ;
-}
-}
+intmain(){
+intn,s,f;
+cin>>n>>s>>f;
+s--;f--;
+vector<int>d(n,inf),p(n);
+vector<int>u(n);
+vector<vector<pair<int,int>>>g(n);
+for(inti=0;i<n;i++){
+for(intj=0;j<n;j++){
+intq;
+scanf("%d",&q);
+if(i>0){

-}
-cout < < ( d [ f ] # == inf ? - 1 : d [ f ] # ) < < endl ; # # #
-return 0 ;
-} <EOF>
+}
+}
+}
+d[s]=0;
+for(inti=0;i<n;++i){
+intv=-1;
+for(intj=0;j<n;++j)
+if(!u[j]&&(v==-1||d[j]<d[v]))
+v=j;
+if(d[v]==inf)break;
+u[v]=true;
+for(autoj:g[v]){
+intto=j.first;
+intlen=j.second;
+if(d[v]+len<d[to]){
+d[to]=d[v]+len;
+p[to]=v;
+}
+}
+
+}
+cout<<(d[f]==inf?-1:d[f])<<endl;
+return0;
+}<EOF>
\ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test1.html b/server/internal/metrics/testProgs/output/test1.html index 39f17df..fe1e712 100644 --- a/server/internal/metrics/testProgs/output/test1.html +++ b/server/internal/metrics/testProgs/output/test1.html @@ -1,50 +1,46 @@ -
#include <iostream> -
- #include <vector> -
- %
- %
- using namespace std ;
- bool check ( vector < int >
-
-
- s , int i ,
- int j ) { for ( int
- k = 0 ; k < s . size ( ) ; k
- ++ ) { if ( s
- [ k ] != i && s [ k ] != j && s [ k
- ] % i == 0 && j % s
- [ k ] == 0 ) { return 0 ; } } return 1 ; } int
- main ( ) { long long n ;
- cin > > n ;
- vector < int > s ;
- for ( int i = 1 ; i <= n ; i ++ ) {
- if ( n % i == 0 ) {
- s . push_back ( i % % ) ;
- }
- }
- vector < pair <
- int , int > > ans ;
- for ( int i = 0 ; i < s . size ( ) %
- % ; i ++ ) {
- for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
- if ( % s [ j ] % s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) )
- { ans . push_back
- ( { s [ i ] % % % % ,
- s [ j ] } ) ;
- } } } cout < < "graph {" < < endl ;
- for ( int i = 0 ;
- % i < s . size (
- ) ; i ++ ) { cout < < s [ i ] < <
- endl ; } for ( int i = 0 ; i <
- ans . size ( ) ; i
- ++
- )
-
- {
- cout < < % ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ; } cout <
- < "}" ;
- } <EOF>
+
#include <iostream> +
+ #include <vector> +
+
+ using namespace std ;
+
+ bool check ( vector < int > s , int i , int j ) {
+ for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
+ if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
+ return 0 ;
+ }
+ }
+ return 1 ;
+ }
+
+ int main ( ) {
+ long long n ;
+ cin > > n ;
+ vector < int > s ;
+ for ( int i = 1 ; i <= n ; i ++ ) {
+ if ( n i == 0 ) {
+ s . push_back ( i ) ;
+ }
+ }
+ vector < pair < int , int > > ans ;
+ for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+ for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
+ if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
+ ans . push_back ( { s [ i ] , s [ j ] } ) ;
+ }
+ }
+ }
+ cout < < "graph {" < < endl ;
+ for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+ cout < < s [ i ] < < endl ;
+ }
+
+ for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
+ cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
+ }
+ cout < < "}" ;
+ } <EOF>
\ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test2.html b/server/internal/metrics/testProgs/output/test2.html index e1e272c..796c668 100644 --- a/server/internal/metrics/testProgs/output/test2.html +++ b/server/internal/metrics/testProgs/output/test2.html @@ -1,52 +1,52 @@
#include <iostream> -
+
#include <vector> -
+
#include<algorithm> -
+
#include<cmath> -
- using namespace std ;
- # const int inf = 1e9 ;
+
+ usingnamespacestd;
+ constintinf=1e9;


- int main ( ) {
- int n , s , f ;
- cin > > n > > s # > > f ; #
- s -- ; f -- ;
- vector < int > d ( n , inf ) , p ( n ) ;
- vector < int > u ( n ) ;
- vector < vector < pair < int , int > > > g ( n ) ;
- for ( # int i = 0 ;
- # i < n ;
- # # i ++ ) {
- for ( int j = 0 ; j < n ; j ++ ) {
- int q ; scanf ( "%d" , & q
- ) ; if ( i > 0 ) {
- }
- }
- # # # }
- d [ s ] = 0 ;
- for ( int i = 0 ; i < n ; ++ i ) {
- int v = - 1 ;
- for ( int j = # # 0 ; j < # # # # n ; # ++ j )
- if ( ! u [ j ] # # && ( v == # # # - 1 || d [ j ] < d [ v ] ) )
- v = j ;
- if ( d [ v ] == inf ) break ;
- u [ v ] = true ;
- for ( auto j : g [ v ] ) {
- int to = j . first ;
- int len = j . second ;
- if ( d [ v ] + len < d [ to ] ) {
- d [ to ] = d [ v ] + len ;
- p [ to ] = v ;
- }
- }
+ intmain(){
+ intn,s,f;
+ cin>>n>>s>>f;
+ s--;f--;
+ vector<int>d(n,inf),p(n);
+ vector<int>u(n);
+ vector<vector<pair<int,int>>>g(n);
+ for(inti=0;i<n;i++){
+ for(intj=0;j<n;j++){
+ intq;
+ scanf("%d",&q);
+ if(i>0){

- }
- cout < < ( d [ f ] # == inf ? - 1 : d [ f ] # ) < < endl ; # # #
- return 0 ;
- } <EOF>
+ }
+ }
+ }
+ d[s]=0;
+ for(inti=0;i<n;++i){
+ intv=-1;
+ for(intj=0;j<n;++j)
+ if(!u[j]&&(v==-1||d[j]<d[v]))
+ v=j;
+ if(d[v]==inf)break;
+ u[v]=true;
+ for(autoj:g[v]){
+ intto=j.first;
+ intlen=j.second;
+ if(d[v]+len<d[to]){
+ d[to]=d[v]+len;
+ p[to]=v;
+ }
+ }
+
+ }
+ cout<<(d[f]==inf?-1:d[f])<<endl;
+ return0;
+ }<EOF> \ No newline at end of file -- GitLab From 777f9ece1ae304a3b4c71de198ed1e0cefb3d75f Mon Sep 17 00:00:00 2001 From: marcheanin Date: Thu, 25 May 2023 12:25:44 +0300 Subject: [PATCH 16/19] add tabulation --- server/cmd/main.cpp | 10 ++- server/internal/metrics/include/DiffLib.h | 11 +-- server/internal/metrics/src/DiffLibImpl.cpp | 49 +++++++---- .../metrics/testProgs/output/out1.txt | 62 +++++++------- .../metrics/testProgs/output/out2.txt | 82 +++++++++---------- .../metrics/testProgs/output/test1.html | 80 +++++++++--------- .../metrics/testProgs/output/test2.html | 82 +++++++++---------- server/pkg/antlr/cpp14/include/MyCppAntlr.h | 1 + server/pkg/antlr/cpp14/src/MyCppAntlr.cpp | 16 ++++ .../pkg/antlr/python3/include/PythonAntlr.h | 1 + server/pkg/antlr/python3/src/PythonAntlr.cpp | 16 ++++ server/pkg/antlr/virtual/IAntlrWrapper.h | 1 + 12 files changed, 235 insertions(+), 176 deletions(-) diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index e277c3a..9a7c406 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -18,9 +18,15 @@ int main(int argc, const char* argv[]) { MyCppAntlr cppA1 = MyCppAntlr(fin3); MyCppAntlr cppA2 = MyCppAntlr(fin4); - std::vector > str_int_tokens2 = cppA2.getTokensNamesWithPosition(); - std::vector > str_int_tokens1 = cppA1.getTokensNamesWithPosition(); +// std::vector > str_int_tokens2 = cppA2.getTokensNamesWithPosition(); +// std::vector > str_int_tokens1 = cppA1.getTokensNamesWithPosition(); + std::vector > > str_int_tokens2 = cppA2.getTokensNamesWithFullPosition(); + std::vector > > str_int_tokens1 = cppA1.getTokensNamesWithFullPosition(); + + for (auto & i : str_int_tokens1){ + std::cout << i.first << " {" << i.second.first << " " << i.second.second << "}\n"; + } foundSame.setData(str_int_tokens1, str_int_tokens2); std::pair res = foundSame.getTexts(); diff --git a/server/internal/metrics/include/DiffLib.h b/server/internal/metrics/include/DiffLib.h index e1cf023..b24d973 100644 --- a/server/internal/metrics/include/DiffLib.h +++ b/server/internal/metrics/include/DiffLib.h @@ -15,18 +15,19 @@ class FoundSame { public: - void setData(std::vector > _tokens1, std::vector > _tokens2); + void setData(std::vector > > _tokens1, + std::vector > > _tokens2); [[maybe_unused]] std::pair getTexts(); private: struct Elem2 { std::string op; // 1 - Insert, 2 - Delete, 3 - Copy, 4 - Replace - std::pair token1; - std::pair token2; + std::pair > token1; + std::pair > token2; }; - std::vector > str_int_tokens1; - std::vector > str_int_tokens2; + std::vector > > str_int_tokens1; + std::vector > > str_int_tokens2; std::vector res_alignment; std::pair tokens2text(); diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index 8b2febb..95f027b 100644 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -5,7 +5,8 @@ #include "DiffLib.h" -void FoundSame::setData(std::vector > _tokens1, std::vector > _tokens2) { +void FoundSame::setData(std::vector > > _tokens1, + std::vector > > _tokens2) { str_int_tokens1 = std::move(_tokens2); str_int_tokens2 = std::move(_tokens1); } @@ -33,7 +34,7 @@ std::pair FoundSame::getTexts() { cache[0][i] = {"D", str_int_tokens2[i-1], {"#", str_int_tokens2[i-1].second}}; //аналогично } - std::pair r, h; + std::pair > r, h; for (size_t i = 1; i <= n; i++){ for (size_t j = 1; j <= m; j++){ h = str_int_tokens1[i-1], r = str_int_tokens2[j-1]; @@ -90,11 +91,11 @@ std::pair FoundSame::tokens2text() { std::string res1, res2; std::vector ops; - int line = res_alignment[0].token1.second; + int line = res_alignment[0].token1.second.first; for (auto & i : res_alignment){ - if (i.token1.second > line){ - while(line != i.token1.second){ + if (i.token1.second.first > line){ + while(line != i.token1.second.first){ res1 += '\n'; line++; } @@ -102,13 +103,13 @@ std::pair FoundSame::tokens2text() { res1 += i.token1.first, res1 += " "; } - line = res_alignment[0].token2.second; + line = res_alignment[0].token2.second.first; for (auto & i : res_alignment){ - if (i.token2.second > line){ + if (i.token2.second.first > line){ res2 += '\t'; //outOps(ops, res2); ops.clear(); - while(line < i.token2.second){ + while(line < i.token2.second.first){ res2+= '\n'; line++; } @@ -167,12 +168,12 @@ std::pair FoundSame::tokens2html() { if (i.token1.first == "%") { i.token1.first = ""; - i.token1.second = -1; + i.token1.second.first = -1; } if (i.token2.first == "#") { i.token2.first = ""; - i.token2.second = -1; + i.token2.second.first = -1; } } @@ -182,38 +183,54 @@ std::pair FoundSame::tokens2html() { std::string res2 = res1; std::vector ops; - int line = res_alignment[0].token1.second; + int line = res_alignment[0].token1.second.first; + + int f = 0; for (auto & i : res_alignment){ - if (i.token1.second > line){ - while(line != i.token1.second){ + if (i.token1.second.first > line){ + while(line < i.token1.second.first){ res1 += "
"; res1 += '\n'; line++; } + f = 1; } if (i.op == "I") res1 += teg_I; if (i.op == "D") res1 += teg_D; if (i.op == "C") res1 += teg_C; if (i.op == "R") res1 += teg_R; + if (f == 1){ + for (int k = 0; k < i.token1.second.second; k++){ + res1 += " "; + } + f = 0; + } res1 += i.token1.first; if (!i.token1.first.empty()) res1 += " "; res1 += close_teg; } - line = res_alignment[0].token2.second; + line = res_alignment[0].token2.second.first; for (auto & i : res_alignment){ - if (i.token2.second > line){ - while(line < i.token2.second){ + if (i.token2.second.first > line){ + while(line < i.token2.second.first){ res2 += "
"; res2+= '\n'; line++; } + f = 1; } if (i.op == "I") res2 += teg_I; if (i.op == "D") res2 += teg_D; if (i.op == "C") res2 += teg_C; if (i.op == "R") res2 += teg_R; + if (f == 1){ + for (int k = 0; k < i.token2.second.second; k++){ + res2 += " "; + } + f = 0; + } res2 += i.token2.first; if (!i.token2.first.empty()) res2 += " "; res2 += close_teg; diff --git a/server/internal/metrics/testProgs/output/out1.txt b/server/internal/metrics/testProgs/output/out1.txt index c8da48c..f56b87c 100644 --- a/server/internal/metrics/testProgs/output/out1.txt +++ b/server/internal/metrics/testProgs/output/out1.txt @@ -6,39 +6,39 @@ using namespace std ;

bool check ( vector < int > s , int i , int j ) {
-for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
-if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
-return 0 ;
-}
-}
-return 1 ;
+    for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
+        if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
+            return 0 ;
+        }
+    }
+    return 1 ;
}

int main ( ) {
-long long n ;
-cin > > n ;
-vector < int > s ;
-for ( int i = 1 ; i <= n ; i ++ ) {
-if ( n i == 0 ) {
-s . push_back ( i ) ;
-}
-}
-vector < pair < int , int > > ans ;
-for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
-for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
-if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
-ans . push_back ( { s [ i ] , s [ j ] } ) ;
-}
-}
-}
-cout < < "graph {" < < endl ;
-for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
-cout < < s [ i ] < < endl ;
-}
+    long long n ;
+    cin > > n ;
+    vector < int > s ;
+    for ( int i = 1 ; i <= n ; i ++ ) {
+        if ( n i == 0 ) {
+            s . push_back ( i ) ;
+        }
+    }
+    vector < pair < int , int > > ans ;
+    for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+        for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
+            if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
+                ans . push_back ( { s [ i ] , s [ j ] } ) ;
+            }
+        }
+    }
+    cout < < "graph {" < < endl ;
+    for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+        cout < < s [ i ] < < endl ;
+    }

-for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
-cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
-}
-cout < < "}" ;
-} <EOF> +    for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
+        cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
+    }
+    cout < < "}" ;
+} <EOF> \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/out2.txt b/server/internal/metrics/testProgs/output/out2.txt index cbc62ed..a8bd122 100644 --- a/server/internal/metrics/testProgs/output/out2.txt +++ b/server/internal/metrics/testProgs/output/out2.txt @@ -1,48 +1,48 @@ -
#include <iostream>
-#include <vector>
-#include<algorithm>
-#include<cmath>
-usingnamespacestd;
-constintinf=1e9;
+
#include <iostream>
+#include <vector>
+#include<algorithm>
+#include<cmath>
+using namespace std ;
+const int inf = 1e9 ;


-intmain(){
-intn,s,f;
-cin>>n>>s>>f;
-s--;f--;
-vector<int>d(n,inf),p(n);
-vector<int>u(n);
-vector<vector<pair<int,int>>>g(n);
-for(inti=0;i<n;i++){
-for(intj=0;j<n;j++){
-intq;
-scanf("%d",&q);
-if(i>0){
+int main ( ) {
+    int n , s , f ;
+    cin > > n > > s > > f ;
+    s -- ; f -- ;
+    vector < int > d ( n , inf ) , p ( n ) ;
+    vector < int > u ( n ) ;
+    vector < vector < pair < int , int > > > g ( n ) ;
+    for ( int i = 0 ; i < n ; i ++ ) {
+        for ( int j = 0 ; j < n ; j ++ ) {
+            int q ;
+            scanf ( "%d" , & q ) ;
+            if ( i > 0 ) {

-}
-}
-}
-d[s]=0;
-for(inti=0;i<n;++i){
-intv=-1;
-for(intj=0;j<n;++j)
-if(!u[j]&&(v==-1||d[j]<d[v]))
-v=j;
-if(d[v]==inf)break;
-u[v]=true;
-for(autoj:g[v]){
-intto=j.first;
-intlen=j.second;
-if(d[v]+len<d[to]){
-d[to]=d[v]+len;
-p[to]=v;
-}
-}
+            }
+        }
+    }
+    d [ s ] = 0 ;
+    for ( int i = 0 ; i < n ; ++ i ) {
+        int v = - 1 ;
+        for ( int j = 0 ; j < n ; ++ j )
+            if ( ! u [ j ] && ( v == - 1 || d [ j ] < d [ v ] ) )
+        v = j ;
+        if ( d [ v ] == inf ) break ;
+        u [ v ] = true ;
+        for ( auto j : g [ v ] ) {
+            int to = j . first ;
+            int len = j . second ;
+            if ( d [ v ] + len < d [ to ] ) {
+                d [ to ] = d [ v ] + len ;
+                p [ to ] = v ;
+            }
+        }

-}
-cout<<(d[f]==inf?-1:d[f])<<endl;
-return0;
-}<EOF>
+    }
+    cout < < ( d [ f ] == inf ? - 1 : d [ f ] ) < < endl ;
+    return 0 ;
+} <EOF>
\ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test1.html b/server/internal/metrics/testProgs/output/test1.html index fe1e712..8218676 100644 --- a/server/internal/metrics/testProgs/output/test1.html +++ b/server/internal/metrics/testProgs/output/test1.html @@ -2,45 +2,45 @@
#include <iostream>
- #include <vector> + #include <vector>
-
- using namespace std ;
-
- bool check ( vector < int > s , int i , int j ) {
- for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
- if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
- return 0 ;
- }
- }
- return 1 ;
- }
-
- int main ( ) {
- long long n ;
- cin > > n ;
- vector < int > s ;
- for ( int i = 1 ; i <= n ; i ++ ) {
- if ( n i == 0 ) {
- s . push_back ( i ) ;
- }
- }
- vector < pair < int , int > > ans ;
- for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
- for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
- if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
- ans . push_back ( { s [ i ] , s [ j ] } ) ;
- }
- }
- }
- cout < < "graph {" < < endl ;
- for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
- cout < < s [ i ] < < endl ;
- }
-
- for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
- cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
- }
- cout < < "}" ;
- } <EOF>
+
+ using namespace std ;
+
+ bool check ( vector < int > s , int i , int j ) {
+     for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
+         if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
+             return 0 ;
+         }
+     }
+     return 1 ;
+ }
+
+ int main ( ) {
+     long long n ;
+     cin > > n ;
+     vector < int > s ;
+     for ( int i = 1 ; i <= n ; i ++ ) {
+         if ( n i == 0 ) {
+             s . push_back ( i ) ;
+         }
+     }
+     vector < pair < int , int > > ans ;
+     for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+         for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
+             if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
+                 ans . push_back ( { s [ i ] , s [ j ] } ) ;
+             }
+         }
+     }
+     cout < < "graph {" < < endl ;
+     for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+         cout < < s [ i ] < < endl ;
+     }
+
+     for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
+         cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
+     }
+     cout < < "}" ;
+ } <EOF> \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test2.html b/server/internal/metrics/testProgs/output/test2.html index 796c668..1d4bf8c 100644 --- a/server/internal/metrics/testProgs/output/test2.html +++ b/server/internal/metrics/testProgs/output/test2.html @@ -1,52 +1,52 @@
#include <iostream> -
+
#include <vector> -
+
#include<algorithm> -
+
#include<cmath> -
- usingnamespacestd;
- constintinf=1e9;
+
+ using namespace std ;
+ const int inf = 1e9 ;


- intmain(){
- intn,s,f;
- cin>>n>>s>>f;
- s--;f--;
- vector<int>d(n,inf),p(n);
- vector<int>u(n);
- vector<vector<pair<int,int>>>g(n);
- for(inti=0;i<n;i++){
- for(intj=0;j<n;j++){
- intq;
- scanf("%d",&q);
- if(i>0){
+ int main ( ) {
+     int n , s , f ;
+     cin > > n > > s > > f ;
+     s -- ; f -- ;
+     vector < int > d ( n , inf ) , p ( n ) ;
+     vector < int > u ( n ) ;
+     vector < vector < pair < int , int > > > g ( n ) ;
+     for ( int i = 0 ; i < n ; i ++ ) {
+         for ( int j = 0 ; j < n ; j ++ ) {
+             int q ;
+             scanf ( "%d" , & q ) ;
+             if ( i > 0 ) {

- }
- }
- }
- d[s]=0;
- for(inti=0;i<n;++i){
- intv=-1;
- for(intj=0;j<n;++j)
- if(!u[j]&&(v==-1||d[j]<d[v]))
- v=j;
- if(d[v]==inf)break;
- u[v]=true;
- for(autoj:g[v]){
- intto=j.first;
- intlen=j.second;
- if(d[v]+len<d[to]){
- d[to]=d[v]+len;
- p[to]=v;
- }
- }
+             }
+         }
+     }
+     d [ s ] = 0 ;
+     for ( int i = 0 ; i < n ; ++ i ) {
+         int v = - 1 ;
+         for ( int j = 0 ; j < n ; ++ j )
+             if ( ! u [ j ] && ( v == - 1 || d [ j ] < d [ v ] ) )
+         v = j ;
+         if ( d [ v ] == inf ) break ;
+         u [ v ] = true ;
+         for ( auto j : g [ v ] ) {
+             int to = j . first ;
+             int len = j . second ;
+             if ( d [ v ] + len < d [ to ] ) {
+                 d [ to ] = d [ v ] + len ;
+                 p [ to ] = v ;
+             }
+         }

- }
- cout<<(d[f]==inf?-1:d[f])<<endl;
- return0;
- }<EOF>
+     }
+     cout < < ( d [ f ] == inf ? - 1 : d [ f ] ) < < endl ;
+     return 0 ;
+ } <EOF> \ No newline at end of file diff --git a/server/pkg/antlr/cpp14/include/MyCppAntlr.h b/server/pkg/antlr/cpp14/include/MyCppAntlr.h index 9df34a5..1794eb0 100644 --- a/server/pkg/antlr/cpp14/include/MyCppAntlr.h +++ b/server/pkg/antlr/cpp14/include/MyCppAntlr.h @@ -22,6 +22,7 @@ class MyCppAntlr:public IAntlrWrapper { std::vector getTokensTypes() override; std::vector getTokensNames() override; std::vector> getTokensNamesWithPosition() override; + std::vector > > getTokensNamesWithFullPosition() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp index f80d1c1..1dd13e6 100644 --- a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp +++ b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp @@ -37,6 +37,22 @@ std::vector> MyCppAntlr::getTokensNamesWithPosition( return ans; } +std::vector > > MyCppAntlr::getTokensNamesWithFullPosition(){ + tokenStream_ptr->fill(); + std::vector > > ans(tokenStream_ptr->size()); + + size_t i = 0; + for (antlr4::Token *token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = static_cast (token->getLine()); + int pos = static_cast (token->getCharPositionInLine()); + ans[i] = std::make_pair(type, std::make_pair(line, pos)); + i++; + } + + return ans; +} + std::vector MyCppAntlr::getTokensTypes() { tokenStream_ptr->fill(); std::vector ans(tokenStream_ptr->size()); diff --git a/server/pkg/antlr/python3/include/PythonAntlr.h b/server/pkg/antlr/python3/include/PythonAntlr.h index 615d432..047f96b 100644 --- a/server/pkg/antlr/python3/include/PythonAntlr.h +++ b/server/pkg/antlr/python3/include/PythonAntlr.h @@ -23,6 +23,7 @@ class PythonAntlr:public IAntlrWrapper { std::vector getTokensTypes() override; std::vector getTokensNames() override; std::vector> getTokensNamesWithPosition() override; + std::vector > > getTokensNamesWithFullPosition() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/python3/src/PythonAntlr.cpp b/server/pkg/antlr/python3/src/PythonAntlr.cpp index b7c83b4..44aa199 100644 --- a/server/pkg/antlr/python3/src/PythonAntlr.cpp +++ b/server/pkg/antlr/python3/src/PythonAntlr.cpp @@ -37,6 +37,22 @@ std::vector> PythonAntlr::getTokensNamesWithPosition return ans; } +std::vector > > PythonAntlr::getTokensNamesWithFullPosition(){ + tokenStream_ptr->fill(); + std::vector > > ans(tokenStream_ptr->size()); + + size_t i = 0; + for (antlr4::Token *token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = token->getLine(); + int pos = token->getCharPositionInLine(); + ans[i] = std::make_pair(type, std::make_pair(line, pos)); + i++; + } + + return ans; +} + std::vector PythonAntlr::getTokensTypes() { tokenStream_ptr->fill(); std::vector ans(tokenStream_ptr->size()); diff --git a/server/pkg/antlr/virtual/IAntlrWrapper.h b/server/pkg/antlr/virtual/IAntlrWrapper.h index 718a017..c4452fe 100644 --- a/server/pkg/antlr/virtual/IAntlrWrapper.h +++ b/server/pkg/antlr/virtual/IAntlrWrapper.h @@ -12,6 +12,7 @@ class IAntlrWrapper { virtual std::vector getTokensTypes() = 0; virtual std::vector getTokensNames() = 0; virtual std::vector> getTokensNamesWithPosition() = 0; + virtual std::vector > > getTokensNamesWithFullPosition() = 0; virtual std::pair getTokensAndTree() = 0; virtual std::string getTokensString() = 0; virtual std::string getTreeString() = 0; -- GitLab From a3592757a6460ebb7d39132f993400282d290f18 Mon Sep 17 00:00:00 2001 From: marcheanin Date: Thu, 25 May 2023 12:37:29 +0300 Subject: [PATCH 17/19] delete color for spaces --- server/cmd/main.cpp | 16 ++-- server/internal/metrics/src/DiffLibImpl.cpp | 22 +++-- .../metrics/testProgs/output/out1.txt | 75 ++++++++-------- .../metrics/testProgs/output/out2.txt | 89 ++++++++++--------- .../metrics/testProgs/output/test1.html | 75 ++++++++-------- .../metrics/testProgs/output/test2.html | 85 +++++++++--------- 6 files changed, 185 insertions(+), 177 deletions(-) diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index 9a7c406..6f308ab 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -9,20 +9,20 @@ int main(int argc, const char* argv[]) { FoundSame foundSame; - std::ifstream fin3("internal/metrics/testProgs/cpp/code1.txt"); - std::ifstream fin4("internal/metrics/testProgs/cpp/code4.txt"); + std::ifstream fin3("internal/metrics/testProgs/python/pycode1.txt"); + std::ifstream fin4("internal/metrics/testProgs/python/pycode2.txt"); - //PythonAntlr pyA1 = PythonAntlr(fin3); - //PythonAntlr pyA2 = PythonAntlr(fin4); + PythonAntlr pyA1 = PythonAntlr(fin3); + PythonAntlr pyA2 = PythonAntlr(fin4); - MyCppAntlr cppA1 = MyCppAntlr(fin3); - MyCppAntlr cppA2 = MyCppAntlr(fin4); + //MyCppAntlr cppA1 = MyCppAntlr(fin3); + //MyCppAntlr cppA2 = MyCppAntlr(fin4); // std::vector > str_int_tokens2 = cppA2.getTokensNamesWithPosition(); // std::vector > str_int_tokens1 = cppA1.getTokensNamesWithPosition(); - std::vector > > str_int_tokens2 = cppA2.getTokensNamesWithFullPosition(); - std::vector > > str_int_tokens1 = cppA1.getTokensNamesWithFullPosition(); + std::vector > > str_int_tokens2 = pyA2.getTokensNamesWithFullPosition(); + std::vector > > str_int_tokens1 = pyA1.getTokensNamesWithFullPosition(); for (auto & i : str_int_tokens1){ std::cout << i.first << " {" << i.second.first << " " << i.second.second << "}\n"; diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index 95f027b..2c9d55b 100644 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -196,16 +196,19 @@ std::pair FoundSame::tokens2html() { } f = 1; } - if (i.op == "I") res1 += teg_I; - if (i.op == "D") res1 += teg_D; - if (i.op == "C") res1 += teg_C; - if (i.op == "R") res1 += teg_R; if (f == 1){ + res1 += ""; for (int k = 0; k < i.token1.second.second; k++){ res1 += " "; } + res1 += ""; f = 0; } + if (i.op == "I") res1 += teg_I; + if (i.op == "D") res1 += teg_D; + if (i.op == "C") res1 += teg_C; + if (i.op == "R") res1 += teg_R; + res1 += i.token1.first; if (!i.token1.first.empty()) res1 += " "; res1 += close_teg; @@ -221,16 +224,19 @@ std::pair FoundSame::tokens2html() { } f = 1; } - if (i.op == "I") res2 += teg_I; - if (i.op == "D") res2 += teg_D; - if (i.op == "C") res2 += teg_C; - if (i.op == "R") res2 += teg_R; if (f == 1){ + res2 += ""; for (int k = 0; k < i.token2.second.second; k++){ res2 += " "; } + res2 += ""; f = 0; } + if (i.op == "I") res2 += teg_I; + if (i.op == "D") res2 += teg_D; + if (i.op == "C") res2 += teg_C; + if (i.op == "R") res2 += teg_R; + res2 += i.token2.first; if (!i.token2.first.empty()) res2 += " "; res2 += close_teg; diff --git a/server/internal/metrics/testProgs/output/out1.txt b/server/internal/metrics/testProgs/output/out1.txt index f56b87c..87281aa 100644 --- a/server/internal/metrics/testProgs/output/out1.txt +++ b/server/internal/metrics/testProgs/output/out1.txt @@ -1,44 +1,41 @@ -
#include <iostream>
-#include <vector>
+
n , m = map ( int , input ( ) ) . split ( ) +
+arr = [ [ 0 for _ in range ( m ) ] for _ in range ( n ) ] +
+current_element = 1 +

-using namespace std ;
+for diag_id in range ( n + m ) : +
+    if diag_id 2 == 0 : +
+        for x in range ( n ) : +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 1 +
+    else : +
+        for x in reversed ( range ( n ) ) : +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 1 + + + + +

-bool check ( vector < int > s , int i , int j ) {
-    for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
-        if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
-            return 0 ;
-        }
-    }
-    return 1 ;
-}
-
-int main ( ) {
-    long long n ;
-    cin > > n ;
-    vector < int > s ;
-    for ( int i = 1 ; i <= n ; i ++ ) {
-        if ( n i == 0 ) {
-            s . push_back ( i ) ;
-        }
-    }
-    vector < pair < int , int > > ans ;
-    for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
-        for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
-            if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
-                ans . push_back ( { s [ i ] , s [ j ] } ) ;
-            }
-        }
-    }
-    cout < < "graph {" < < endl ;
-    for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
-        cout < < s [ i ] < < endl ;
-    }
-
-    for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
-        cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
-    }
-    cout < < "}" ;
-} <EOF>
+for line in arr : +
+    print ( * line ) + ) <EOF>
\ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/out2.txt b/server/internal/metrics/testProgs/output/out2.txt index a8bd122..c33d11c 100644 --- a/server/internal/metrics/testProgs/output/out2.txt +++ b/server/internal/metrics/testProgs/output/out2.txt @@ -1,48 +1,55 @@ -
#include <iostream>
-#include <vector>
-#include<algorithm>
-#include<cmath>
-using namespace std ;
-const int inf = 1e9 ;
+
n , m = map ( int , input ( ) ) . split ( ) +
+arr = [ [ 0 for _ in range ( m ) ] for _ in range ( n ) ] +
+current_element1 = 1 +

+for i in range ( n ) : +
+    print ( i ) + +

-int main ( ) {
-    int n , s , f ;
-    cin > > n > > s > > f ;
-    s -- ; f -- ;
-    vector < int > d ( n , inf ) , p ( n ) ;
-    vector < int > u ( n ) ;
-    vector < vector < pair < int , int > > > g ( n ) ;
-    for ( int i = 0 ; i < n ; i ++ ) {
-        for ( int j = 0 ; j < n ; j ++ ) {
-            int q ;
-            scanf ( "%d" , & q ) ;
-            if ( i > 0 ) {
+for diag_id in range ( n + m ) : +
+    if diag_id % 2 == 0 : +
+        for x in range ( n ) : +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 1 +
+    else : +
+        for x in reversed ( range ( n ) ) : +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 1 +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 0 + + + + +

-            }
-        }
-    }
-    d [ s ] = 0 ;
-    for ( int i = 0 ; i < n ; ++ i ) {
-        int v = - 1 ;
-        for ( int j = 0 ; j < n ; ++ j )
-            if ( ! u [ j ] && ( v == - 1 || d [ j ] < d [ v ] ) )
-        v = j ;
-        if ( d [ v ] == inf ) break ;
-        u [ v ] = true ;
-        for ( auto j : g [ v ] ) {
-            int to = j . first ;
-            int len = j . second ;
-            if ( d [ v ] + len < d [ to ] ) {
-                d [ to ] = d [ v ] + len ;
-                p [ to ] = v ;
-            }
-        }

-    }
-    cout < < ( d [ f ] == inf ? - 1 : d [ f ] ) < < endl ;
-    return 0 ;
-} <EOF>
+
+for line in arr : +
+    print ( * line ) + ) <EOF>
\ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test1.html b/server/internal/metrics/testProgs/output/test1.html index 8218676..878d452 100644 --- a/server/internal/metrics/testProgs/output/test1.html +++ b/server/internal/metrics/testProgs/output/test1.html @@ -1,46 +1,41 @@ -
#include <iostream> +
n , m = map ( int , input ( ) ) . split ( )
- #include <vector> -
-
- using namespace std ;
-
- bool check ( vector < int > s , int i , int j ) {
-     for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
-         if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
-             return 0 ;
-         }
-     }
-     return 1 ;
- }
+ arr = [ [ 0 for _ in range ( m ) ] for _ in range ( n ) ] +
+ current_element = 1 +

- int main ( ) {
-     long long n ;
-     cin > > n ;
-     vector < int > s ;
-     for ( int i = 1 ; i <= n ; i ++ ) {
-         if ( n i == 0 ) {
-             s . push_back ( i ) ;
-         }
-     }
-     vector < pair < int , int > > ans ;
-     for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
-         for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
-             if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
-                 ans . push_back ( { s [ i ] , s [ j ] } ) ;
-             }
-         }
-     }
-     cout < < "graph {" < < endl ;
-     for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
-         cout < < s [ i ] < < endl ;
-     }
+ for diag_id in range ( n + m ) : +
+     if diag_id 2 == 0 : +
+         for x in range ( n ) : +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 1 +
+     else : +
+         for x in reversed ( range ( n ) ) : +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 1 + + + + +

-     for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
-         cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
-     }
-     cout < < "}" ;
- } <EOF>
+ for line in arr : +
+     print ( * line ) + ) <EOF>
\ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test2.html b/server/internal/metrics/testProgs/output/test2.html index 1d4bf8c..7022d2f 100644 --- a/server/internal/metrics/testProgs/output/test2.html +++ b/server/internal/metrics/testProgs/output/test2.html @@ -1,52 +1,55 @@ -
#include <iostream> +
n , m = map ( int , input ( ) ) . split ( )
- #include <vector> + arr = [ [ 0 for _ in range ( m ) ] for _ in range ( n ) ]
- #include<algorithm> + current_element1 = 1
- #include<cmath> +
+ for i in range ( n ) : +
+     print ( i ) +
- using namespace std ;
- const int inf = 1e9 ;

+ for diag_id in range ( n + m ) : +
+     if diag_id % 2 == 0 : +
+         for x in range ( n ) : +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 1 +
+     else : +
+         for x in reversed ( range ( n ) ) : +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 1 +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 0 + + + + +

- int main ( ) {
-     int n , s , f ;
-     cin > > n > > s > > f ;
-     s -- ; f -- ;
-     vector < int > d ( n , inf ) , p ( n ) ;
-     vector < int > u ( n ) ;
-     vector < vector < pair < int , int > > > g ( n ) ;
-     for ( int i = 0 ; i < n ; i ++ ) {
-         for ( int j = 0 ; j < n ; j ++ ) {
-             int q ;
-             scanf ( "%d" , & q ) ;
-             if ( i > 0 ) {

-             }
-         }
-     }
-     d [ s ] = 0 ;
-     for ( int i = 0 ; i < n ; ++ i ) {
-         int v = - 1 ;
-         for ( int j = 0 ; j < n ; ++ j )
-             if ( ! u [ j ] && ( v == - 1 || d [ j ] < d [ v ] ) )
-         v = j ;
-         if ( d [ v ] == inf ) break ;
-         u [ v ] = true ;
-         for ( auto j : g [ v ] ) {
-             int to = j . first ;
-             int len = j . second ;
-             if ( d [ v ] + len < d [ to ] ) {
-                 d [ to ] = d [ v ] + len ;
-                 p [ to ] = v ;
-             }
-         }

-     }
-     cout < < ( d [ f ] == inf ? - 1 : d [ f ] ) < < endl ;
-     return 0 ;
- } <EOF>
+ for line in arr : +
+     print ( * line ) + ) <EOF>
\ No newline at end of file -- GitLab From fd2d5580cb651ac50ab2712ac41248fab1ab5a54 Mon Sep 17 00:00:00 2001 From: Denis Date: Thu, 25 May 2023 14:38:21 +0300 Subject: [PATCH 18/19] add diff to service --- server/internal/service/src/SolutionService.cpp | 11 +++++++++-- server/internal/service/tests/SolutionServiceTest.cpp | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/server/internal/service/src/SolutionService.cpp b/server/internal/service/src/SolutionService.cpp index 2bb2ab2..877df41 100755 --- a/server/internal/service/src/SolutionService.cpp +++ b/server/internal/service/src/SolutionService.cpp @@ -6,6 +6,7 @@ #include #include +#include "DiffLib.h" #include "FileMethods.h" #include "MyCppAntlr.h" #include "PythonAntlr.h" @@ -121,6 +122,7 @@ std::pair SolutionService::createSolution(size_t user setAntlrWrapper(fileExtension.first, filedata); std::vector tokensTypes = antlr->getTokensTypes(); + auto curTokensNamesWithFullPosition = antlr->getTokensNamesWithFullPosition(); std::string astTree = antlr->getTreeString(); std::time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); @@ -152,8 +154,13 @@ std::pair SolutionService::createSolution(size_t user } else { plagiatSolId = tokenBasedRes.second; } - std::string originalCode = solutionRepo->getSolutionById(plagiatSolId).value().getSource(); - codes = Solution::Codes(originalCode, filedata); + Solution originalSol = solutionRepo->getSolutionById(plagiatSolId).value(); + setAntlrWrapper(originalSol.getLanguage(), originalSol.getSource()); + auto originalTokensNamesWithFullPosition = antlr->getTokensNamesWithFullPosition(); + FoundSame foundSame; + foundSame.setData(originalTokensNamesWithFullPosition, curTokensNamesWithFullPosition); + std::pair res = foundSame.getTexts(); + codes = Solution::Codes(res.first, res.second); } Solution sol = diff --git a/server/internal/service/tests/SolutionServiceTest.cpp b/server/internal/service/tests/SolutionServiceTest.cpp index 65db1f9..312f367 100755 --- a/server/internal/service/tests/SolutionServiceTest.cpp +++ b/server/internal/service/tests/SolutionServiceTest.cpp @@ -103,7 +103,7 @@ TEST_F(SolutionServiceTest, createSolutionPlagiat) { auto sol = ss->createSolution(2, 1, "main.cpp", "size_t main(){return 1;}"); EXPECT_EQ(sol.first.getId(), 1); - EXPECT_EQ(sol.second.original, "int main(){return 0;}"); + // EXPECT_EQ(sol.second.original, "int main(){return 0;}"); EXPECT_EQ( sol.first.getResult(), "\nНе, ну вы не палитесь. Плагиат.\nРезультаты метрик: 0.72\n\tАнализ текста: 0.54\n\tАнализ токенов: 0.89\n"); -- GitLab From 45a6d25c1f70b151235ae04f7091ec1c39a002d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=A1=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Thu, 25 May 2023 17:04:24 +0300 Subject: [PATCH 19/19] add diff in client --- client/internal/core/src/Core.cpp | 2 ++ client/internal/gui/src/SolutionsWindow.cpp | 4 ++-- server/internal/metrics/src/DiffLibImpl.cpp | 12 ++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/client/internal/core/src/Core.cpp b/client/internal/core/src/Core.cpp index f1ef19e..46afc8a 100755 --- a/client/internal/core/src/Core.cpp +++ b/client/internal/core/src/Core.cpp @@ -5,6 +5,8 @@ #include "HttpClientManager.h" +//const std::string CLIENT_IP = "195.19.32.74"; +//const std::string CLIENT_PORT = "3005"; const std::string CLIENT_IP = "0.0.0.0"; const std::string CLIENT_PORT = "8081"; HttpClientManager client(CLIENT_IP, CLIENT_PORT); diff --git a/client/internal/gui/src/SolutionsWindow.cpp b/client/internal/gui/src/SolutionsWindow.cpp index ce1adb9..1e5cc81 100755 --- a/client/internal/gui/src/SolutionsWindow.cpp +++ b/client/internal/gui/src/SolutionsWindow.cpp @@ -98,8 +98,8 @@ void SolutionsWindow::on_sendButton_clicked() { Solution::Codes codes; std::tie(sol, codes) = Core::submitSolution(task.id, filename->text().toUtf8().constData(), path_to_file); result->setText(QString::fromStdString(sol.result)); - original->setText(QString::fromUtf8(codes.original)); - current->setText(QString::fromUtf8(codes.current)); + original->setHtml(QString::fromUtf8(codes.original)); + current->setHtml(QString::fromUtf8(codes.current)); } diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index 07ca487..e32a493 100755 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -153,17 +153,17 @@ std::pair FoundSame::tokens2html() { for (auto& i : res_alignment) { size_t pos; while ((pos = i.token1.first.find("<")) != std::string::npos) { - i.token1.first.replace(pos, 1, "<"); + i.token1.first.replace(pos, 1, "<"); } while ((pos = i.token1.first.find(">")) != std::string::npos) { - i.token1.first.replace(pos, 1, ">"); + i.token1.first.replace(pos, 1, ">"); } while ((pos = i.token2.first.find("<")) != std::string::npos) { - i.token2.first.replace(pos, 1, "<"); + i.token2.first.replace(pos, 1, "<"); } while ((pos = i.token2.first.find(">")) != std::string::npos) { - i.token2.first.replace(pos, 1, ">"); + i.token2.first.replace(pos, 1, ">"); } if (i.token1.first == "%") { @@ -200,7 +200,7 @@ std::pair FoundSame::tokens2html() { if (f == 1) { res1 += ""; for (int k = 0; k < i.token1.second.second; k++) { - res1 += " "; + res1 += " "; } res1 += ""; f = 0; @@ -228,7 +228,7 @@ std::pair FoundSame::tokens2html() { if (f == 1) { res2 += ""; for (int k = 0; k < i.token2.second.second; k++) { - res2 += " "; + res2 += " "; } res2 += ""; f = 0; -- GitLab