diff options
Diffstat (limited to 'impls/pingala.cpp')
-rw-r--r-- | impls/pingala.cpp | 63 |
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; +} |