From e56169441b68fbdc79e9e5da4cc63f04ea737d1f Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Sun, 15 Sep 2024 14:51:06 +0100 Subject: Triangle numbers implementation --- Makefile | 8 +++++-- impls/pingala.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 impls/pingala.cpp 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 +#include +#include + +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 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; +} -- cgit v1.2.3-13-gbd6f