From 5eb6bd32ca4102bf29c7fabd26984c1c7c351c1e Mon Sep 17 00:00:00 2001 From: Mistivia Date: Sun, 21 Dec 2025 21:26:24 +0800 Subject: day 5 part1 --- 05/Makefile | 13 ++++++ 05/part1.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 05/part2.c | 0 3 files changed, 149 insertions(+) create mode 100644 05/Makefile create mode 100644 05/part1.c create mode 100644 05/part2.c diff --git a/05/Makefile b/05/Makefile new file mode 100644 index 0000000..a8f700f --- /dev/null +++ b/05/Makefile @@ -0,0 +1,13 @@ +all: part1 part2 + +part1: part1.c + gcc -g part1.c -o part1 -lalgds + +part2: part2.c + gcc -g part2.c -o part2 -lalgds + +1: part1 + cat input | ./part1 + +2: part2 + cat input | ./part2 \ No newline at end of file diff --git a/05/part1.c b/05/part1.c new file mode 100644 index 0000000..0ad59b8 --- /dev/null +++ b/05/part1.c @@ -0,0 +1,136 @@ +#include +#include +#include +#include + +#include +#include + +#define PANIC do { \ + fprintf(stderr, "panic at %s:%d\n", __FILE__, __LINE__); \ + abort(); \ +} while (0) + +void expect_char(char e) { + int c = fpeek(stdin); + if (c != e) { + PANIC; + } + fgetc(stdin); +} + +void skip_space() { + while (1) { + int c = fpeek(stdin); + if (c == EOF) return; + if (isspace(c)) { + fgetc(stdin); + } else { + return; + } + } +} + +bool string2long(const char *s, long *num) { + char *end; + errno = 0; + *num = strtol(s, &end, 10); + if (end == s) { + return false; + } + if (errno != 0) { + return false; + } + return true; +} + +int64_t parse_integer() { + long ret; + StrBuilder sb; + StrBuilder_init(&sb); + while (1) { + int c = fpeek(stdin); + if (isdigit(c)) { + fgetc(stdin); + StrBuilder_append_char(&sb, c); + } else { + break; + } + } + if (strlen(sb.buf) == 0) { + PANIC; + } + StrBuilder_append_char(&sb, '\0'); + if (!string2long(sb.buf, &ret)) { + PANIC; + } + free(sb.buf); + return ret; +} + +typedef struct { + int64_t start; + int64_t end; +} Range; + +void Range_show(Range self, FILE *fp) { + fprintf(fp, "%ld-%ld", self.start, self.end); +} + +VECTOR_DEF(Range) +VECTOR_IMPL(Range) + +Range parse_range() { + Range ret; + ret.start = parse_integer(); + expect_char('-'); + ret.end = parse_integer(); + expect_char('\n'); + return ret; +} + +int main() { + RangeVector ranges; + RangeVector_init(&ranges); + int c; + while (1) { + c = fpeek(stdin); + if (c == '\n') { + break; + } else if (isdigit(c)) { + Range r = parse_range(); + RangeVector_push_back(&ranges, r); + } else { + PANIC; + } + } + expect_char('\n'); + LongVector ids; + LongVector_init(&ids); + while (1) { + c = fpeek(stdin); + if (isdigit(c)) { + long id = parse_integer(); + LongVector_push_back(&ids, id); + c = fpeek(stdin); + if (c == EOF) break; + expect_char('\n'); + } + } + int count = 0; + for (int i = 0; i < LongVector_len(&ids); i++) { + long n = ids.buffer[i]; + for (int j = 0; j < RangeVector_len(&ranges); j++) { + Range r = ranges.buffer[j]; + if (n >= r.start && n <= r.end) { + count++; + break; + } + } + } + printf("%d\n", count); + + RangeVector_free(&ranges); + LongVector_free(&ids); + return 0; +} \ No newline at end of file diff --git a/05/part2.c b/05/part2.c new file mode 100644 index 0000000..e69de29 -- cgit v1.0