The challenge
Build a pyramidshaped tower, as an array/list of strings, given a positive integer number of floors
. A tower block is represented with "*"
character.
For example, a tower with 3
floors looks like this:
1
2
3
4
5

[
" * ",
" *** ",
"*****"
]

And a tower with 6
floors looks like this:
1
2
3
4
5
6
7
8

[
" * ",
" *** ",
" ***** ",
" ******* ",
" ********* ",
"***********"
]

The solution in C
Option 1:
1
2
3
4
5
6
7
8

void build_tower(unsigned n, char tower[n][2 * n  1]) {
for (unsigned int i = 0; i < n; i++)
for (unsigned int j = 0; j < 2 * n  1; j++)
if (j >= (n  1)  i && j <= (n  1) + i)
tower[i][j] = '*';
else
tower[i][j] = ' ';
}

Option 2:
1
2
3
4
5
6
7

void build_tower(unsigned n, char tower[n][2 * n  1]) {
int len = 2 * n  1;
for (int i = 0; i < n; i++) {
memset(tower[i], ' ', len);
memset(tower[i] + len/2  i, '*', i * 2 + 1);
}
}

Option 3:
1
2
3
4
5
6
7

void build_tower(unsigned n, char tower[n][2 * n  1]) {
for(unsigned i = 0; i < n; i++){
for(unsigned j = 0; j < (2 * n  1); j++){
(j >= n  1  i && j <= n  1 + i) ? (tower[i][j] = '*') : (tower[i][j] = ' ');
}
}
}

Test cases to validate our solution
1
2
3
4
5
6
7
8
9

#include <criterion/criterion.h>
extern void do_test (unsigned n, const char expected[n][2 * n  1]);
Test(tests_suite, sample_tests) {
do_test(1, (char[1][1]){"*"});
do_test(2, (char[2][3]){" * ", "***"});
do_test(3, (char[3][5]){" * ", " *** ", "*****"});
}
