diff options
| author | Mistivia <i@mistivia.com> | 2024-02-15 17:49:56 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-02-15 17:51:00 +0800 |
| commit | f163146fe4b31f1b9e4e25f7f61a5c6928e2fe5b (patch) | |
| tree | e3e99fc5eb674c783ac2947a4276f1b92a892a64 /advent-of-code/2023/04/2.rkt | |
| parent | 58709a89622062b527b242f65aa0501a4efd47d3 (diff) | |
refactor advent of code 2023 day 04 from c to racket
Diffstat (limited to 'advent-of-code/2023/04/2.rkt')
| -rw-r--r-- | advent-of-code/2023/04/2.rkt | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/advent-of-code/2023/04/2.rkt b/advent-of-code/2023/04/2.rkt new file mode 100644 index 0000000..cf874d2 --- /dev/null +++ b/advent-of-code/2023/04/2.rkt @@ -0,0 +1,53 @@ +#lang racket + +(require "../lib/obj.rkt") + +(define (get-lines fp) + (let loop ((lines '())) + (define l (read-line fp)) + (if (eof-object? l) + (reverse lines) + (loop (cons l lines))))) + +(define fp (open-input-file "input")) + +(define lines (get-lines fp)) + +(define (strip-head s) + (string-trim (cadr (string-split s ":")))) + +(set! lines (map strip-head lines)) + +(define make-card (obj-maker 'win-nums 'nums)) + +(define (parse-card s) + (define lst (string-split s "|")) + (define win-nums (map string->number (string-split (car lst)))) + (define nums (map string->number (string-split (cadr lst)))) + (make-card win-nums nums)) + +(define cards (map parse-card lines)) + +(define card-count (make-vector (length cards) 1)) + +(define (win-count card) + (length (filter (lambda (x) (member x (card 'win-nums))) (card 'nums)))) + +(define card-vec (list->vector cards)) + +(let loop ((i 0)) + (if (>= i (vector-length card-count)) + (void) + (let () + (define win-cnt (win-count (vector-ref card-vec i))) + (let loop ((j (+ i 1))) + (if (or (>= j (vector-length card-count)) + (>= j (+ 1 i win-cnt))) + (void) + (let () + (vector-set! card-count j (+ (vector-ref card-count i) + (vector-ref card-count j))) + (loop (+ 1 j))))) + (loop (+ 1 i))))) + +(apply + (vector->list card-count))
\ No newline at end of file |
