aboutsummaryrefslogtreecommitdiff
path: root/challenge-241/paulo-custodio/cpp/ch-2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-241/paulo-custodio/cpp/ch-2.cpp')
-rw-r--r--challenge-241/paulo-custodio/cpp/ch-2.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/challenge-241/paulo-custodio/cpp/ch-2.cpp b/challenge-241/paulo-custodio/cpp/ch-2.cpp
new file mode 100644
index 0000000000..c6bee319f8
--- /dev/null
+++ b/challenge-241/paulo-custodio/cpp/ch-2.cpp
@@ -0,0 +1,120 @@
+/*
+Challenge 241
+
+Task 2: Prime Order
+Submitted by: Mohammad S Anwar
+
+You are given an array of unique positive integers greater than 2.
+
+Write a script to sort them in ascending order of the count of their prime
+factors, tie-breaking by ascending value.
+Example 1
+
+Input: @int = (11, 8, 27, 4)
+Output: (11, 4, 8, 27))
+
+Prime factors of 11 => 11
+Prime factors of 4 => 2, 2
+Prime factors of 8 => 2, 2, 2
+Prime factors of 27 => 3, 3, 3
+*/
+
+#include <algorithm>
+#include <iostream>
+#include <vector>
+using namespace std;
+
+struct Num {
+ int n;
+ vector<int> factors;
+
+ Num(int n);
+ bool operator<(const Num& other);
+};
+
+bool is_prime(int n) {
+ if (n <= 1)
+ return false;
+ if (n <= 3)
+ return true;
+ if ((n % 2) == 0 || (n % 3) == 0)
+ return false;
+ for (int i = 5; i * i <= n; i += 6)
+ if ((n % i) == 0 || (n % (i + 2)) == 0)
+ return false;
+ return true;
+}
+
+int next_prime(int n) {
+ if (n <= 1)
+ return 2;
+ do {
+ n++;
+ } while (!is_prime(n));
+ return n;
+}
+
+vector<int> prime_factors(int n) {
+ vector<int> out;
+ if (n < 2) {
+ int p = 1;
+ out.push_back(p);
+ }
+ else {
+ int p = 2;
+ while (n > 1) {
+ while (n % p == 0) {
+ out.push_back(p);
+ n /= p;
+ }
+ p = next_prime(p);
+ }
+ }
+ return out;
+}
+
+Num::Num(int n) {
+ this->n = n;
+ this->factors = prime_factors(n);
+}
+
+int num_compare(const Num& a, const Num& b) {
+ int a_size = static_cast<int>(a.factors.size());
+ int b_size = static_cast<int>(b.factors.size());
+ if (a_size != b_size)
+ return a_size - b_size;
+ for (size_t i = 0; i < a_size; i++) {
+ if (a.factors[i] != b.factors[i])
+ return a.factors[i] - b.factors[i];
+ }
+ return 0;
+}
+
+bool Num::operator<(const Num& other) {
+ return num_compare(*this, other) < 0 ? true : false;
+}
+
+int main(int argc, char* argv[]) {
+ if (argc < 2) {
+ cerr << "Usage: ch-2 n n n ..." << endl;
+ exit(EXIT_FAILURE);
+ }
+
+ vector<Num> nums;
+
+ // parse args and compute primes
+ for (int i = 1; i < argc; i++) {
+ int n = atoi(argv[i]);
+ nums.emplace_back(n);
+ }
+
+ // sort
+ sort(nums.begin(), nums.end());
+
+ // output
+ const char* sep = "";
+ for (auto& num : nums) {
+ cout << sep << num.n;
+ sep = " ";
+ }
+}