aboutsummaryrefslogtreecommitdiff
path: root/advent-of-code
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2024-02-14 18:51:22 +0800
committerMistivia <i@mistivia.com>2024-02-14 18:51:22 +0800
commit2cedcf3dfdf44863129c84a55218c265075fd229 (patch)
treed8456f640288e0bfea86cf60b0bc4e38fe1dce5d /advent-of-code
parentc3e3f8127767541a88c2c211878341f33c03f055 (diff)
refactor advent of code 2023 day 02 from c to racket
Diffstat (limited to 'advent-of-code')
-rw-r--r--advent-of-code/2023/01/1.rkt (renamed from advent-of-code/2023/01/part1.rkt)0
-rw-r--r--advent-of-code/2023/01/2.rkt (renamed from advent-of-code/2023/01/part2.rkt)0
-rw-r--r--advent-of-code/2023/02/1.rkt63
-rw-r--r--advent-of-code/2023/02/2.rkt49
-rw-r--r--advent-of-code/2023/02/Makefile14
-rw-r--r--advent-of-code/2023/02/part1.c75
-rw-r--r--advent-of-code/2023/02/part2.c73
7 files changed, 112 insertions, 162 deletions
diff --git a/advent-of-code/2023/01/part1.rkt b/advent-of-code/2023/01/1.rkt
index 0c69be5..0c69be5 100644
--- a/advent-of-code/2023/01/part1.rkt
+++ b/advent-of-code/2023/01/1.rkt
diff --git a/advent-of-code/2023/01/part2.rkt b/advent-of-code/2023/01/2.rkt
index 85602da..85602da 100644
--- a/advent-of-code/2023/01/part2.rkt
+++ b/advent-of-code/2023/01/2.rkt
diff --git a/advent-of-code/2023/02/1.rkt b/advent-of-code/2023/02/1.rkt
new file mode 100644
index 0000000..4382a66
--- /dev/null
+++ b/advent-of-code/2023/02/1.rkt
@@ -0,0 +1,63 @@
+#lang racket
+
+(define fp (open-input-file "input"))
+
+(define (get-lines fp)
+ (let loop ((lines '()))
+ (define l (read-line fp))
+ (if (eof-object? l)
+ (reverse lines)
+ (loop (cons l lines)))))
+
+(define lines (get-lines fp))
+
+(define (extract-game line)
+ (define game-str (cadr (string-split line ":")))
+ (define sets-str (string-split game-str ";"))
+ (set! sets-str (map string-trim sets-str))
+ (map extract-set sets-str))
+
+(define (extract-set str)
+ (define r 0)
+ (define g 0)
+ (define b 0)
+ (define balls (string-split str ","))
+ (set! balls
+ (map (lambda (s)
+ (define pair (map string-trim (string-split s " ")))
+ (list (string->number (car pair)) (cadr pair)))
+ balls))
+ (let loop ((balls balls))
+ (if (null? balls)
+ '()
+ (let ()
+ (define ball (car balls))
+ (define number (car ball))
+ (define color (cadr ball))
+ (cond ((string=? "red" color) (set! r number))
+ ((string=? "green" color) (set! g number))
+ ((string=? "blue" color) (set! b number)))
+ (loop (cdr balls)))))
+ (list r g b))
+
+(define (possible? game)
+ (if (null? game)
+ #t
+ (let ()
+ (define head (car game))
+ (if (or (> (car head) 12) ; r
+ (> (cadr head) 13) ; g
+ (> (caddr head) 14)) ; b
+ #f
+ (possible? (cdr game))))))
+
+(define (enumerate lst)
+ (let loop ((i 1) (ret '()) (remain lst))
+ (if (null? remain)
+ (reverse ret)
+ (loop (+ 1 i) (cons (list (car remain) i) ret) (cdr remain)))))
+
+(apply + (map cadr
+ (filter (lambda (game)
+ (possible? (car game)))
+ (enumerate (map extract-game lines)))))
diff --git a/advent-of-code/2023/02/2.rkt b/advent-of-code/2023/02/2.rkt
new file mode 100644
index 0000000..8975a27
--- /dev/null
+++ b/advent-of-code/2023/02/2.rkt
@@ -0,0 +1,49 @@
+#lang racket
+
+(define fp (open-input-file "input"))
+
+(define (get-lines fp)
+ (let loop ((lines '()))
+ (define l (read-line fp))
+ (if (eof-object? l)
+ (reverse lines)
+ (loop (cons l lines)))))
+
+(define lines (get-lines fp))
+
+(define (extract-game line)
+ (define game-str (cadr (string-split line ":")))
+ (define sets-str (string-split game-str ";"))
+ (set! sets-str (map string-trim sets-str))
+ (map extract-set sets-str))
+
+(define (extract-set str)
+ (define r 0)
+ (define g 0)
+ (define b 0)
+ (define balls (string-split str ","))
+ (set! balls
+ (map (lambda (s)
+ (define pair (map string-trim (string-split s " ")))
+ (list (string->number (car pair)) (cadr pair)))
+ balls))
+ (let loop ((balls balls))
+ (if (null? balls)
+ '()
+ (let ()
+ (define ball (car balls))
+ (define number (car ball))
+ (define color (cadr ball))
+ (cond ((string=? "red" color) (set! r number))
+ ((string=? "green" color) (set! g number))
+ ((string=? "blue" color) (set! b number)))
+ (loop (cdr balls)))))
+ (list r g b))
+
+(define (power game)
+ (define rs (map car game))
+ (define gs (map cadr game))
+ (define bs (map caddr game))
+ (* (apply max rs) (apply max gs) (apply max bs)))
+
+(apply + (map power (map extract-game lines)))
diff --git a/advent-of-code/2023/02/Makefile b/advent-of-code/2023/02/Makefile
deleted file mode 100644
index 44480b6..0000000
--- a/advent-of-code/2023/02/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-all: run
-
-run: part1 part2
- ./part1
- ./part2
-
-part1: part1.c
- gcc -g -I../lib/ ../lib/*.c part1.c -o part1
-
-part2: part2.c
- gcc -g -I../lib/ ../lib/*.c part2.c -o part2
-
-clean:
- rm part1 part2
diff --git a/advent-of-code/2023/02/part1.c b/advent-of-code/2023/02/part1.c
deleted file mode 100644
index 194bf2f..0000000
--- a/advent-of-code/2023/02/part1.c
+++ /dev/null
@@ -1,75 +0,0 @@
-#include <stdio.h>
-#include <assert.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "str.h"
-#include "vec.h"
-
-typedef struct {
- int r,g,b;
-} set_t;
-
-typedef struct {
- int length;
- set_t sets[64];
-} game_t;
-
-game_t games[100];
-
-void parse_set(const char *str, set_t *set) {
- void* strs = str_split(str, ',');
- set->r = 0;
- set->g = 0;
- set->b = 0;
- for (int i = 0; i < vec_size(strs); i++) {
- char *str = vec_get(strs, i);
- void* infos = str_split(str, ' ');
- if (strcmp(vec_get(infos, 1), "red") == 0) {
- set->r = strtol(vec_get(infos, 0), NULL, 10);
- } else if (strcmp(vec_get(infos, 1), "blue") == 0) {
- set->b = strtol(vec_get(infos, 0), NULL, 10);
- } else if (strcmp(vec_get(infos, 1), "green") == 0) {
- set->g = strtol(vec_get(infos, 0), NULL, 10);
- }
- }
-}
-
-void parse_game(const char *line, game_t *game) {
- void *strs = str_split(line, ':');
- void *sets_str = str_split(vec_get(strs, 1), ';');
- for (int i = 0; i < vec_size(sets_str); i++) {
- set_t s;
- parse_set(str_strip(vec_get(sets_str, i)), &s);
- game->sets[i] = s;
- }
- game->length = vec_size(sets_str);
-}
-
-int is_possible(game_t *game) {
- for (int i = 0; i < game->length; i++) {
- if (game->sets[i].r <= 12
- && game->sets[i].g <= 13
- && game->sets[i].b <= 14) {
- continue;
- }
- return 0;
- }
- return 1;
-}
-
-int main() {
- FILE *fp = fopen("./input", "r");
- int sum = 0;
- for (int i = 0; i < 100; i++) {
- char *line = fgetline(fp);
- parse_game(line, &games[i]);
- }
- for (int i = 0; i < 100; i++) {
- if (is_possible(&games[i])) {
- sum += i + 1;
- }
- }
- printf("%d\n", sum);
- return 0;
-}
diff --git a/advent-of-code/2023/02/part2.c b/advent-of-code/2023/02/part2.c
deleted file mode 100644
index 697a431..0000000
--- a/advent-of-code/2023/02/part2.c
+++ /dev/null
@@ -1,73 +0,0 @@
-#include <stdio.h>
-#include <assert.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "str.h"
-#include "vec.h"
-
-typedef struct {
- int r,g,b;
-} set_t;
-
-typedef struct {
- int length;
- set_t sets[64];
-} game_t;
-
-game_t games[100];
-
-void parse_set(const char *str, set_t *set) {
- void* strs = str_split(str, ',');
- set->r = 0;
- set->g = 0;
- set->b = 0;
- for (int i = 0; i < vec_size(strs); i++) {
- char *str = vec_get(strs, i);
- void* infos = str_split(str, ' ');
- if (strcmp(vec_get(infos, 1), "red") == 0) {
- set->r = strtol(vec_get(infos, 0), NULL, 10);
- } else if (strcmp(vec_get(infos, 1), "blue") == 0) {
- set->b = strtol(vec_get(infos, 0), NULL, 10);
- } else if (strcmp(vec_get(infos, 1), "green") == 0) {
- set->g = strtol(vec_get(infos, 0), NULL, 10);
- }
- }
-}
-
-void parse_game(const char *line, game_t *game) {
- void *strs = str_split(line, ':');
- void *sets_str = str_split(vec_get(strs, 1), ';');
- for (int i = 0; i < vec_size(sets_str); i++) {
- set_t s;
- parse_set(str_strip(vec_get(sets_str, i)), &s);
- game->sets[i] = s;
- }
- game->length = vec_size(sets_str);
-}
-
-int power(game_t *game) {
- int maxr = 0;
- int maxg = 0;
- int maxb = 0;
- for (int i = 0; i < game->length; i++) {
- if (game->sets[i].r > maxr) maxr = game->sets[i].r;
- if (game->sets[i].g > maxg) maxg = game->sets[i].g;
- if (game->sets[i].b > maxb) maxb = game->sets[i].b;
- }
- return maxr * maxg * maxb;
-}
-
-int main() {
- FILE *fp = fopen("./input", "r");
- int sum = 0;
- for (int i = 0; i < 100; i++) {
- char *line = fgetline(fp);
- parse_game(line, &games[i]);
- }
- for (int i = 0; i < 100; i++) {
- sum += power(&games[i]);
- }
- printf("%d\n", sum);
- return 0;
-}