From ea269468630076e333ed440d17f4c8679d3d4e9a Mon Sep 17 00:00:00 2001 From: Paulo Custodio Date: Thu, 24 Jun 2021 22:52:22 +0100 Subject: Add C and C++ solutions to challenge 009 --- challenge-009/paulo-custodio/c/ch-1.c | 38 +++++++++ challenge-009/paulo-custodio/c/ch-2.c | 134 ++++++++++++++++++++++++++++++ challenge-009/paulo-custodio/cpp/ch-1.cpp | 37 +++++++++ challenge-009/paulo-custodio/cpp/ch-2.cpp | 127 ++++++++++++++++++++++++++++ 4 files changed, 336 insertions(+) create mode 100644 challenge-009/paulo-custodio/c/ch-1.c create mode 100644 challenge-009/paulo-custodio/c/ch-2.c create mode 100644 challenge-009/paulo-custodio/cpp/ch-1.cpp create mode 100644 challenge-009/paulo-custodio/cpp/ch-2.cpp diff --git a/challenge-009/paulo-custodio/c/ch-1.c b/challenge-009/paulo-custodio/c/ch-1.c new file mode 100644 index 0000000000..1a199fdf2c --- /dev/null +++ b/challenge-009/paulo-custodio/c/ch-1.c @@ -0,0 +1,38 @@ +/* +Challenge 009 + +Challenge #1 +Write a script that finds the first square number that has at least 5 distinct +digits.This was proposed by Laurent Rosenfeld. +*/ + +#include +#include +#include + +int num_diff_digits(int n) { + bool digits[10] = {0}; + int count = 0; + while (n > 0) { + int digit = n % 10; + n /= 10; + if (!digits[digit]) { + digits[digit] = true; + count++; + } + } + return count; +} + +int main(int argc, char* argv[]) { + int num = 0; + if (argc == 2) + num = atoi(argv[1]); + if (num == 0) + num = 5; + + int n = 1; + while (num_diff_digits(n * n) < num) + n++; + printf("%d\n", n * n); +} diff --git a/challenge-009/paulo-custodio/c/ch-2.c b/challenge-009/paulo-custodio/c/ch-2.c new file mode 100644 index 0000000000..c5b0a0be59 --- /dev/null +++ b/challenge-009/paulo-custodio/c/ch-2.c @@ -0,0 +1,134 @@ +/* +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 +#include +#include + +typedef struct score_t { + int seq; + int score; + int rank; +} score_t; + +void* check_mem(void* p) { + if (!p) { + fputs("Out of memory", stderr); + exit(EXIT_FAILURE); + } + return p; +} + +int rev_by_score(const void* a, const void* b) { + return -(((score_t*)a)->score - ((score_t*)b)->score); // reverse-sort +} + +int by_seq(const void* a, const void* b) { + return ((score_t*)a)->seq - ((score_t*)b)->seq; +} + +void standard_ranking(int num_scores, score_t* scores) { + qsort(scores, num_scores, sizeof(score_t), rev_by_score); + int rank = 1; + for (int i = 0; i < num_scores; i++) { + int count = 0; + for (int j = i; j < num_scores && scores[i].score == scores[j].score; j++) { + count++; + scores[j].rank = rank; + } + rank += count; + i += count - 1; + } + qsort(scores, num_scores, sizeof(score_t), by_seq); +} + +void modified_ranking(int num_scores, score_t* scores) { + qsort(scores, num_scores, sizeof(score_t), rev_by_score); + int rank = 1; + for (int i = 0; i < num_scores; i++) { + int count = 0; + for (int j = i; j < num_scores && scores[i].score == scores[j].score; j++) + count++; + rank += count-1; + for (int j = i; j < num_scores && scores[i].score == scores[j].score; j++) + scores[j].rank = rank; + rank++; + i += count - 1; + } + qsort(scores, num_scores, sizeof(score_t), by_seq); +} + +void dense_ranking(int num_scores, score_t* scores) { + qsort(scores, num_scores, sizeof(score_t), rev_by_score); + int rank = 1; + for (int i = 0; i < num_scores; i++) { + int count = 0; + for (int j = i; j < num_scores && scores[i].score == scores[j].score; j++) { + count++; + scores[j].rank = rank; + } + rank++; + i += count - 1; + } + qsort(scores, num_scores, sizeof(score_t), by_seq); +} + + +int main(int argc, char* argv[]) { + if (argc < 2) return EXIT_FAILURE; + int num_scores = argc - 1; + score_t* scores = check_mem(calloc(num_scores, sizeof(score_t))); + for (int i = 0; i < num_scores; i++) { + scores[i].seq = i; + scores[i].score = atoi(argv[i + 1]); + } + + printf("Data: "); + for (int i = 0; i < num_scores; i++) { + printf("%d", scores[i].score); + if (i + 1 < num_scores) + printf(", "); + } + printf("\n"); + + standard_ranking(num_scores, scores); + printf("Standard ranking: "); + for (int i = 0; i < num_scores; i++) { + printf("%d", scores[i].rank); + if (i + 1 < num_scores) + printf(", "); + } + printf("\n"); + + modified_ranking(num_scores, scores); + printf("Modified ranking: "); + for (int i = 0; i < num_scores; i++) { + printf("%d", scores[i].rank); + if (i + 1 < num_scores) + printf(", "); + } + printf("\n"); + + dense_ranking(num_scores, scores); + printf("Dense ranking: "); + for (int i = 0; i < num_scores; i++) { + printf("%d", scores[i].rank); + if (i + 1 < num_scores) + printf(", "); + } + printf("\n"); + + free(scores); +} diff --git a/challenge-009/paulo-custodio/cpp/ch-1.cpp b/challenge-009/paulo-custodio/cpp/ch-1.cpp new file mode 100644 index 0000000000..a647b3cfd7 --- /dev/null +++ b/challenge-009/paulo-custodio/cpp/ch-1.cpp @@ -0,0 +1,37 @@ +/* +Challenge 009 + +Challenge #1 +Write a script that finds the first square number that has at least 5 distinct +digits.This was proposed by Laurent Rosenfeld. +*/ + +#include +using namespace std; + +int num_diff_digits(int n) { + bool digits[10] = {0}; + int count = 0; + while (n > 0) { + int digit = n % 10; + n /= 10; + if (!digits[digit]) { + digits[digit] = true; + count++; + } + } + return count; +} + +int main(int argc, char* argv[]) { + int num = 0; + if (argc == 2) + num = atoi(argv[1]); + if (num == 0) + num = 5; + + int n = 1; + while (num_diff_digits(n * n) < num) + n++; + cout << n * n << endl; +} 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 +#include +#include +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& 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& 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& 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 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; +} -- cgit