aboutsummaryrefslogtreecommitdiff
path: root/impls
diff options
context:
space:
mode:
Diffstat (limited to 'impls')
-rw-r--r--impls/pingala.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/impls/pingala.cpp b/impls/pingala.cpp
new file mode 100644
index 0000000..510aa50
--- /dev/null
+++ b/impls/pingala.cpp
@@ -0,0 +1,63 @@
+/* pingala.cpp
+ * Created: 2024-09-15
+ * Author: Aryadev Chavali
+ */
+
+#include <cstdio>
+#include <string>
+#include <vector>
+
+void padding(size_t n, size_t depth)
+{
+ for (size_t i = 0; i < ((depth - n) / 2); ++i)
+ printf("\t");
+}
+
+void generate_triangle(const size_t depth)
+{
+ std::vector<size_t> items;
+ items.reserve(depth * depth);
+#define AT(i, j) items[((i) * depth) + (j)]
+ AT(0, 0) = 1;
+ padding(0, depth);
+ printf("%lu\n", items[0]);
+ for (size_t i = 1; i < depth; ++i)
+ {
+ AT(i, 0) = 1;
+ padding(i, depth);
+ printf("%lu,\t", AT(i, 0));
+ for (size_t j = 1; j < i; ++j)
+ {
+ // Recurrence relation
+ AT(i, j) = AT(i - 1, j - 1) + AT(i - 1, j);
+ printf("%lu,\t", AT(i, j));
+ }
+ AT(i, i) = 1;
+ printf("%lu\n", AT(i, i));
+ }
+#undef AT
+}
+
+void usage(FILE *fp)
+{
+ fprintf(fp, "Usage: pingala.out [depth]\n"
+ "\tdepth: Depth of triangle generated\n");
+}
+
+int main(int argc, char *argv[])
+{
+ if (argc < 2)
+ {
+ usage(stderr);
+ return 1;
+ }
+ int arg = std::stoi(argv[1]);
+ if (arg <= 0)
+ {
+ usage(stderr);
+ return 1;
+ }
+
+ generate_triangle(arg);
+ return 0;
+}