Skip to content

Commit d1882dd

Browse files
Merge pull request #72 from Billsfriend/exercism-sync/7480d9406fc14db1
[Sync Iteration] c/diamond/1
2 parents 6a763ff + 7487c8a commit d1882dd

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

solutions/c/diamond/1/diamond.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include "diamond.h"
2+
3+
#include <stddef.h>
4+
#include <stdlib.h>
5+
#include <string.h>
6+
7+
char **make_diamond(const char letter) {
8+
int axis_len = letter - 'A';
9+
int line_count = axis_len * 2 + 1;
10+
char **diamond = malloc(line_count * sizeof(char*));
11+
if (diamond == NULL) {
12+
return NULL;
13+
}
14+
for (int i = 0; i < line_count; i++) {
15+
diamond[i] = malloc(sizeof(char[line_count]));
16+
if (diamond[i] == NULL) {
17+
for (int j = 0; j < i; j++) {
18+
free(diamond[j]);
19+
free(diamond);
20+
return NULL;
21+
}
22+
}
23+
for (int j = 0; j < line_count; j++) {
24+
char temp_letter = 'A' + i > letter ? 2 * letter - 'A' - i : 'A' + i;
25+
int l1 = ((i + j) == axis_len);
26+
int l2 = ((i + j) == 3 * axis_len);
27+
int l3 = ((i - j) == axis_len);
28+
int l4 = ((j - i) == axis_len);
29+
diamond[i][j] = l1 || l2 || l3 || l4 ? temp_letter : ' ';
30+
}
31+
diamond[i][line_count] = '\0';
32+
}
33+
return diamond;
34+
}
35+
36+
void free_diamond(char **diamond) {
37+
if (diamond == NULL) {
38+
return;
39+
}
40+
size_t len = strlen(diamond[0]);
41+
for (size_t i = 0; i < len; i++) {
42+
free(diamond[i]);
43+
}
44+
free(diamond);
45+
}

solutions/c/diamond/1/diamond.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#ifndef DIAMOND_H
2+
#define DIAMOND_H
3+
4+
char **make_diamond(const char letter);
5+
void free_diamond(char **diamond);
6+
7+
#endif

0 commit comments

Comments
 (0)