aboutsummaryrefslogtreecommitdiff
path: root/challenge-003/paulo-custodio/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-003/paulo-custodio/cpp')
-rw-r--r--challenge-003/paulo-custodio/cpp/ch-1.cpp52
-rw-r--r--challenge-003/paulo-custodio/cpp/ch-2.cpp44
2 files changed, 96 insertions, 0 deletions
diff --git a/challenge-003/paulo-custodio/cpp/ch-1.cpp b/challenge-003/paulo-custodio/cpp/ch-1.cpp
new file mode 100644
index 0000000000..d9ca7ee9f0
--- /dev/null
+++ b/challenge-003/paulo-custodio/cpp/ch-1.cpp
@@ -0,0 +1,52 @@
+/*
+Challenge 003
+
+Challenge #1
+Create a script to generate 5-smooth numbers, whose prime divisors are less
+or equal to 5. They are also called Hamming/Regular/Ugly numbers. For more
+information, please check this wikipedia.
+
+*/
+
+#include <iostream>
+#include <deque>
+#include <string>
+#include <algorithm>
+
+int min3(int a, int b, int c) {
+ return std::min(a, std::min(b, c));
+}
+
+// hamming number generator
+std::deque<int> q2, q3, q5;
+
+int next_hamming() {
+ // init three queues with 1
+ if (q2.empty()) {
+ q2.push_back(1);
+ q3.push_back(1);
+ q5.push_back(1);
+ }
+
+ // get the smallest of the queue heads
+ int n = min3(q2.front(), q3.front(), q5.front());
+
+ // shift used multiples
+ if (n == q2.front()) q2.pop_front();
+ if (n == q3.front()) q3.pop_front();
+ if (n == q5.front()) q5.pop_front();
+
+ // push next multiples
+ q2.push_back(2*n);
+ q3.push_back(3*n);
+ q5.push_back(5*n);
+
+ return n;
+}
+
+int main(int argc, char* argv[]) {
+ if (argc == 2) {
+ for (int i = 0; i < atoi(argv[1]); i++)
+ std::cout << next_hamming() << std::endl;
+ }
+}
diff --git a/challenge-003/paulo-custodio/cpp/ch-2.cpp b/challenge-003/paulo-custodio/cpp/ch-2.cpp
new file mode 100644
index 0000000000..cf64c51a86
--- /dev/null
+++ b/challenge-003/paulo-custodio/cpp/ch-2.cpp
@@ -0,0 +1,44 @@
+/*
+Challenge 003
+
+Challenge #2
+Create a script that generates Pascal Triangle. Accept number of rows from
+the command line. The Pascal Triangle should have at least 3 rows. For more
+information about Pascal Triangle, check this wikipedia page.
+
+*/
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+void draw_pascal(int rows) {
+ // allocate current and next row
+ std::vector<int> data[2];
+ for (int i = 0; i < 2; i++)
+ data[i].resize(rows+1);
+
+ int cur = 0;
+ data[cur][0] = 1;
+ for (int row = 1; row <= rows; row++) {
+ // print current row
+ for (int col = 0; col < rows-row; col++)
+ std::cout << ' ';
+ for (int col = 0; col < row; col++)
+ std::cout << data[cur][col] << ' ';
+ std::cout << std::endl;
+
+ // compute next row
+ int nxt = 1-cur;
+ data[nxt][0] = 1;
+ data[nxt][row] = 1;
+ for (int col = 1; col < row; col++)
+ data[nxt][col] = data[cur][col-1] + data[cur][col];
+ cur = nxt;
+ }
+}
+
+int main(int argc, char* argv[]) {
+ if (argc == 2)
+ draw_pascal(atoi(argv[1]));
+}