aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile8
-rw-r--r--impls/pingala.cpp63
2 files changed, 69 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index 5ba401e..5c9d4f8 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,10 @@
-CC=clang
+CC=g++
CFLAGS=-pedantic -Wall -Wextra -fsanitize=address -fsanitize=undefined -ggdb -fsanitize=address
OUT=
+ARGS=
+
+pingala.out: impls/pingala.cpp
+ $(CC) $(CFLAGS) $^ -o $@
btree.out: impls/btree.cpp
$(CC) $(CFLAGS) $^ -o $@
@@ -16,7 +20,7 @@ vec.out: impls/vec.c
.PHONY: run
run: $(OUT)
- ./$^
+ ./$^ $(ARGS)
.PHONY: clean
clean:
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;
+}