Skip to content

Commit 19e95a1

Browse files
Merge pull request #73 from Billsfriend/exercism-sync/a38daade01e8bac7
[Sync Iteration] c/diamond/2
2 parents d1882dd + d3f505d commit 19e95a1

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

solutions/c/diamond/2/diamond.c

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

solutions/c/diamond/2/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)