Skip to content

Commit ae4931a

Browse files
author
Gonzalo Diaz
committed
[REFACTOR] [Hacker Rank] Warmup: Time Conversion solved ✅. Simplified.
+ safer version + coverage increased.
1 parent 8e24400 commit ae4931a

File tree

3 files changed

+36
-70
lines changed

3 files changed

+36
-70
lines changed

src/lib/exercises/include/exercises/hackerrank/warmup/time_conversion.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
#ifdef __cplusplus
44
extern "C" {
55
#endif
6-
char *HACKERRANK_WARMUP_firstN(const char *s, unsigned long n);
7-
char *HACKERRANK_WARMUP_lastN(const char *s, unsigned long n);
6+
7+
char *HACKERRANK_WARMUP_getStringFragment(const char *s, unsigned long len,
8+
unsigned long from, unsigned long to);
89

910
char *HACKERRANK_WARMUP_timeConversion(const char *s);
1011

src/lib/exercises/src/hackerrank/warmup/time_conversion.c

Lines changed: 28 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -4,80 +4,42 @@
44
* @link Problem definition [[docs/hackerrank/warmup/time_conversion.md]]
55
*/
66

7-
#include <stdio.h>
8-
#include <stdlib.h>
9-
#include <string.h>
7+
#include <stdio.h> // snprintf
8+
#include <stdlib.h> // malloc, free, strtol
9+
#include <string.h> // strcmp, strnlen
1010

11-
char *HACKERRANK_WARMUP_firstN(const char *s, unsigned long n) {
12-
unsigned long len = strlen(s);
13-
if (n > len) {
14-
return NULL;
15-
}
16-
if (n == 0) {
17-
return NULL;
18-
}
11+
#define HACKERRANK_WARMUP_LONG_TIME_FORMAT_SIZE 10
12+
#define HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE 8
13+
#define HACKERRANK_WARMUP_HOUR_FORMAT_SIZE 2
1914

20-
char *result = (char *)malloc((n + 1) * sizeof(char));
21-
if (result == NULL) {
15+
char *HACKERRANK_WARMUP_timeConversion(const char *s) {
16+
if (s == NULL) {
2217
return NULL;
2318
}
2419

25-
strncpy(result, s, n);
26-
27-
result[n] = '\0';
20+
size_t s_len = strnlen(s, HACKERRANK_WARMUP_LONG_TIME_FORMAT_SIZE);
2821

29-
return result;
30-
}
31-
32-
char *HACKERRANK_WARMUP_lastN(const char *s, unsigned long n) {
33-
unsigned long len = strlen(s);
34-
if (n > len) {
35-
return NULL;
36-
}
37-
if (n == 0) {
22+
if (s_len != HACKERRANK_WARMUP_LONG_TIME_FORMAT_SIZE) {
3823
return NULL;
3924
}
4025

41-
char *result = (char *)malloc((n + 1) * sizeof(char));
42-
if (result == NULL) {
43-
return NULL;
44-
}
45-
46-
strncpy(result, s + len - n, n);
47-
48-
result[n] = '\0';
49-
50-
return result;
51-
}
26+
char hour_str[HACKERRANK_WARMUP_HOUR_FORMAT_SIZE + 1];
5227

53-
char *HACKERRANK_WARMUP_timeConversion(const char *s) {
54-
char *meridian = HACKERRANK_WARMUP_lastN(s, 2);
28+
hour_str[0] = s[0];
29+
hour_str[1] = s[1];
30+
hour_str[2] = '\0';
5531

56-
char *hour_str = HACKERRANK_WARMUP_firstN(s, 2);
57-
char *time_str = (char *)malloc((strlen(s) + 1) * sizeof(char));
58-
if (time_str == NULL) {
59-
free(hour_str);
60-
free(meridian);
61-
return NULL;
62-
}
63-
strcpy(time_str, s);
64-
char *temp_time_str = HACKERRANK_WARMUP_lastN(time_str, strlen(time_str) - 2);
65-
free(time_str);
66-
time_str = temp_time_str;
67-
temp_time_str = HACKERRANK_WARMUP_firstN(time_str, strlen(time_str) - 2);
68-
free(time_str);
69-
time_str = temp_time_str;
32+
char meridian[3];
33+
meridian[0] = s[s_len - 2];
34+
meridian[1] = s[s_len - 1];
35+
meridian[2] = '\0';
7036

7137
char *endptr;
7238
long hour = strtol(hour_str, &endptr, 10);
7339

7440
if (*endptr != '\0') {
7541
printf("Conversion error, non-convertible part: %s\n", endptr);
7642

77-
free(hour_str);
78-
free(meridian);
79-
free(time_str);
80-
free(endptr);
8143
return NULL;
8244
} else {
8345
printf("The integer value is: %ld\n", hour);
@@ -89,14 +51,18 @@ char *HACKERRANK_WARMUP_timeConversion(const char *s) {
8951
hour += 12;
9052
}
9153

92-
const int BUFFER_MAX_SIZE = 9;
54+
char *conversion =
55+
malloc((HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE + 1) * sizeof(char));
56+
57+
for (int i = 0; i < HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE; i++) {
58+
conversion[i] = s[i];
59+
}
60+
conversion[HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE] = '\0';
9361

94-
char *conversion = malloc(BUFFER_MAX_SIZE * sizeof(char));
62+
snprintf(hour_str, HACKERRANK_WARMUP_HOUR_FORMAT_SIZE + 1, "%02ld", hour);
9563

96-
snprintf(conversion, BUFFER_MAX_SIZE, "%02ld%s", hour, time_str);
97-
free(hour_str);
98-
free(meridian);
99-
free(time_str);
64+
conversion[0] = hour_str[0];
65+
conversion[1] = hour_str[1];
10066

10167
return conversion;
10268
}

src/tests/unit/lib/hackerrank/warmup/time_conversion.test.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@ TEST_CASE("time_conversion JSON Test Cases",
3232
}
3333
}
3434

35-
TEST_CASE("time_conversion helper functions edge cases",
36-
"[hackerrank] [helper] [warmup]") {
37-
CHECK(HACKERRANK_WARMUP_firstN("", 10) == nullptr);
38-
CHECK(HACKERRANK_WARMUP_lastN("", 10) == nullptr);
35+
TEST_CASE("time_conversion edge cases", "[hackerrank] [helper] [warmup]") {
36+
CHECK(HACKERRANK_WARMUP_timeConversion(nullptr) == nullptr);
3937

40-
CHECK(HACKERRANK_WARMUP_firstN("", 0) == nullptr);
41-
CHECK(HACKERRANK_WARMUP_lastN("", 0) == nullptr);
38+
CHECK(HACKERRANK_WARMUP_timeConversion("") == nullptr);
39+
40+
CHECK(HACKERRANK_WARMUP_timeConversion("aa:bb:ccXM") == nullptr);
4241
}

0 commit comments

Comments
 (0)