diff options
| author | Abigail <abigail@abigail.be> | 2021-08-30 19:57:50 +0200 |
|---|---|---|
| committer | Abigail <abigail@abigail.be> | 2021-08-30 19:57:50 +0200 |
| commit | 83559ddd9bede17f2141bf98e61fd36f538a9e61 (patch) | |
| tree | b507654be70722479e169f46ec90fbb73f2e3f7d /challenge-128/abigail | |
| parent | 4754fdce9596dea8d5a6694d698150254acbd36e (diff) | |
| download | perlweeklychallenge-club-83559ddd9bede17f2141bf98e61fd36f538a9e61.tar.gz perlweeklychallenge-club-83559ddd9bede17f2141bf98e61fd36f538a9e61.tar.bz2 perlweeklychallenge-club-83559ddd9bede17f2141bf98e61fd36f538a9e61.zip | |
C solution for week 128, part 2
Diffstat (limited to 'challenge-128/abigail')
| -rw-r--r-- | challenge-128/abigail/README.md | 1 | ||||
| -rw-r--r-- | challenge-128/abigail/c/ch-2.c | 106 |
2 files changed, 107 insertions, 0 deletions
diff --git a/challenge-128/abigail/README.md b/challenge-128/abigail/README.md index 034d2135be..eb32303239 100644 --- a/challenge-128/abigail/README.md +++ b/challenge-128/abigail/README.md @@ -66,6 +66,7 @@ station, so we need minimum 3 platforms. ### Solutions * [AWK](awk/ch-2.awk) +* [C](awk/ch-2.c) * [Perl](perl/ch-2.pl) ### Blog diff --git a/challenge-128/abigail/c/ch-2.c b/challenge-128/abigail/c/ch-2.c new file mode 100644 index 0000000000..260fb60332 --- /dev/null +++ b/challenge-128/abigail/c/ch-2.c @@ -0,0 +1,106 @@ +# include <stdlib.h> +# include <stdio.h> +# include <string.h> + +/* + * See ../README.md + */ + +/* + * Run as: cc -o ch-2.o ch-2.c; ./ch-2.o < input-file + */ +# define MINUTES_PER_DAY 24 * 60 + +int main (void) { + char * arrival_line = NULL; + char * departure_line = NULL; + size_t a_len = 0; + size_t d_len = 0; + size_t a_str_len; + size_t d_str_len; + + if ((a_str_len = getline (&arrival_line, &a_len, stdin)) == -1) { + perror ("Failed to read arrival line"); + exit (1); + } + if ((d_str_len = getline (&departure_line, &d_len, stdin)) == -1) { + perror ("Failed to read departurerrival line"); + exit (1); + } + + /* + * Turn any non-digits into spaces. + */ + char * line_ptr = arrival_line; + while (* line_ptr) { + if (* line_ptr < '0' || * line_ptr > '9') { + * line_ptr = ' '; + } + line_ptr ++; + } + + line_ptr = departure_line; + while (* line_ptr) { + if (* line_ptr < '0' || * line_ptr > '9') { + * line_ptr = ' '; + } + line_ptr ++; + } + + /* + * Initialize the trains array: a counter for every minute in a day + */ + unsigned int trains [MINUTES_PER_DAY]; + for (size_t i = 0; i < MINUTES_PER_DAY; i ++) { + trains [i] = 0; + } + + /* + * Scan over the arrival/departure times + */ + int a_hour, a_minute, d_hour, d_minute; + int a_skip = 0; + int d_skip = 0; + char * a_ptr = arrival_line; + char * d_ptr = departure_line; + while (sscanf (a_ptr, "%d %d%n", &a_hour, &a_minute, &a_skip) == 2 && + sscanf (d_ptr, "%d %d%n", &d_hour, &d_minute, &d_skip) == 2) { + int arrival = a_hour * 60 + a_minute; + int departure = d_hour * 60 + d_minute; + a_ptr += a_skip; + d_ptr += d_skip; + + /* + * Count the number of trains there are in the station for each + * minute of the day + */ + for (int i = arrival; i <= departure; i ++) { + trains [i] ++; + } + if (departure < arrival) { + for (int i = 0; i <= departure; i ++) { + trains [i] ++; + } + for (int i = arrival; i < MINUTES_PER_DAY; i ++) { + trains [i] ++; + } + } + } + + /* + * Find the maximum number of trains + */ + int max = 0; + for (int i = 0; i < MINUTES_PER_DAY; i ++) { + if (max < trains [i]) { + max = trains [i]; + } + } + + printf ("%d\n", max); + + free (arrival_line); + free (departure_line); + + return (0); +} |
