Skip to content

Commit 8b42d74

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

File tree

3 files changed

+30
-67
lines changed

3 files changed

+30
-67
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: 22 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -8,76 +8,38 @@
88
#include <stdlib.h>
99
#include <string.h>
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);
20+
size_t s_len = strnlen(s, HACKERRANK_WARMUP_LONG_TIME_FORMAT_SIZE);
2621

27-
result[n] = '\0';
28-
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);
26+
char hour_str[HACKERRANK_WARMUP_HOUR_FORMAT_SIZE + 1];
4727

48-
result[n] = '\0';
49-
50-
return result;
51-
}
28+
hour_str[0] = s[0];
29+
hour_str[1] = s[1];
30+
hour_str[2] = '\0';
5231

53-
char *HACKERRANK_WARMUP_timeConversion(const char *s) {
54-
char *meridian = HACKERRANK_WARMUP_lastN(s, 2);
55-
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,15 @@ 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+
strncpy(conversion, s, HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE);
57+
conversion[HACKERRANK_WARMUP_SHORT_TIME_FORMAT_SIZE] = '\0';
9358

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

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

10164
return conversion;
10265
}

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)