aboutsummaryrefslogtreecommitdiff
path: root/challenge-009/paulo-custodio/cpp/ch-2.cpp
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-06-24 22:54:35 +0100
committerGitHub <noreply@github.com>2021-06-24 22:54:35 +0100
commitfdee069d634b2d991a623c6d6b05fa2389d0fc67 (patch)
treeed3a8dad98b1e84239ec76c2f6ff70f933f8735a /challenge-009/paulo-custodio/cpp/ch-2.cpp
parentc9d2138108edc544718e2fe95dc643f027cd62d4 (diff)
parentea269468630076e333ed440d17f4c8679d3d4e9a (diff)
downloadperlweeklychallenge-club-fdee069d634b2d991a623c6d6b05fa2389d0fc67.tar.gz
perlweeklychallenge-club-fdee069d634b2d991a623c6d6b05fa2389d0fc67.tar.bz2
perlweeklychallenge-club-fdee069d634b2d991a623c6d6b05fa2389d0fc67.zip
Merge pull request #4338 from pauloscustodio/paulo-custodio
Add C and C++ solutions to challenge 009
Diffstat (limited to 'challenge-009/paulo-custodio/cpp/ch-2.cpp')
-rw-r--r--challenge-009/paulo-custodio/cpp/ch-2.cpp127
1 files changed, 127 insertions, 0 deletions
diff --git a/challenge-009/paulo-custodio/cpp/ch-2.cpp b/challenge-009/paulo-custodio/cpp/ch-2.cpp
new file mode 100644
index 0000000000..fe621cfa33
--- /dev/null
+++ b/challenge-009/paulo-custodio/cpp/ch-2.cpp
@@ -0,0 +1,127 @@
+/*
+Challenge 009
+
+Challenge #2
+Write a script to perform different types of ranking as described below:
+
+1. Standard Ranking (1224): Items that compare equal receive the same ranking
+ number, and then a gap is left in the ranking numbers.
+2. Modified Ranking (1334): It is done by leaving the gaps in the ranking
+ numbers before the sets of equal-ranking items.
+3. Dense Ranking (1223): Items that compare equally receive the same
+ ranking number, and the next item(s) receive the immediately following
+ ranking number.
+*/
+
+#include <algorithm>
+#include <iostream>
+#include <vector>
+using namespace std;
+
+struct Score {
+ int seq;
+ int score;
+ int rank;
+};
+
+bool rev_by_score(const Score& a, const Score& b) {
+ return a.score > b.score;
+}
+
+bool by_seq(const Score& a, const Score& b) {
+ return a.seq < b.seq;
+}
+
+void standard_ranking(vector<Score>& scores) {
+ sort(scores.begin(), scores.end(), rev_by_score);
+ int rank = 1;
+ for (size_t i = 0; i < scores.size(); i++) {
+ int count = 0;
+ for (size_t j = i; j < scores.size() && scores[i].score == scores[j].score; j++) {
+ count++;
+ scores[j].rank = rank;
+ }
+ rank += count;
+ i += count - 1;
+ }
+ sort(scores.begin(), scores.end(), by_seq);
+}
+
+void modified_ranking(vector<Score>& scores) {
+ sort(scores.begin(), scores.end(), rev_by_score);
+ int rank = 1;
+ for (size_t i = 0; i < scores.size(); i++) {
+ int count = 0;
+ for (size_t j = i; j < scores.size() && scores[i].score == scores[j].score; j++)
+ count++;
+ rank += count - 1;
+ for (size_t j = i; j < scores.size() && scores[i].score == scores[j].score; j++)
+ scores[j].rank = rank;
+ rank++;
+ i += count - 1;
+ }
+ sort(scores.begin(), scores.end(), by_seq);
+}
+
+void dense_ranking(vector<Score>& scores) {
+ sort(scores.begin(), scores.end(), rev_by_score);
+ int rank = 1;
+ for (size_t i = 0; i < scores.size(); i++) {
+ int count = 0;
+ for (size_t j = i; j < scores.size() && scores[i].score == scores[j].score; j++) {
+ count++;
+ scores[j].rank = rank;
+ }
+ rank++;
+ i += count - 1;
+ }
+ sort(scores.begin(), scores.end(), by_seq);
+}
+
+
+int main(int argc, char* argv[]) {
+ if (argc < 2) return EXIT_FAILURE;
+ vector<Score> scores;
+ for (int i = 1; i < argc; i++) {
+ Score s;
+ s.seq = i;
+ s.score = atoi(argv[i]);
+ s.rank = 0;
+ scores.push_back(s);
+ }
+
+ cout << "Data: ";
+ for (size_t i = 0; i < scores.size(); i++) {
+ cout << scores[i].score;
+ if (i + 1 < scores.size())
+ cout << ", ";
+ }
+ printf("\n");
+
+ standard_ranking(scores);
+ cout << "Standard ranking: ";
+ for (size_t i = 0; i < scores.size(); i++) {
+ cout << scores[i].rank;
+ if (i + 1 < scores.size())
+ cout << ", ";
+ }
+ cout << endl;
+
+ modified_ranking(scores);
+ cout << "Modified ranking: ";
+ for (size_t i = 0; i < scores.size(); i++) {
+ cout << scores[i].rank;
+ if (i + 1 < scores.size())
+ cout << ", ";
+ }
+ cout << endl;
+
+ dense_ranking(scores);
+ cout << "Dense ranking: ";
+ for (size_t i = 0; i < scores.size(); i++) {
+ cout << scores[i].rank;
+ if (i + 1 < scores.size())
+ cout << ", ";
+ }
+ cout << endl;
+}