diff options
| author | Mistivia <i@mistivia.com> | 2024-02-25 20:11:54 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-02-25 20:11:54 +0800 |
| commit | 515ecbf5a20a8e432a998b0a543bedcb1bd64cf4 (patch) | |
| tree | 6353c603a8cf0276553f420205f8d1c730a318ce /04 | |
| parent | e191b610c11326b587cf0b01fd6fc37b8d07bb19 (diff) | |
reorg code
Diffstat (limited to '04')
| -rw-r--r-- | 04/1.rkt | 29 | ||||
| -rw-r--r-- | 04/2.rkt | 47 |
2 files changed, 76 insertions, 0 deletions
diff --git a/04/1.rkt b/04/1.rkt new file mode 100644 index 0000000..e5bae92 --- /dev/null +++ b/04/1.rkt @@ -0,0 +1,29 @@ +#lang racket + +(require "../lib/utils.rkt") +(require "../lib/obj.rkt") + +(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 (point card) + (define wins (length (filter (λ (x) (member x (card 'win-nums))) (card 'nums)))) + (if (= wins 0) + 0 + (expt 2 (- wins 1)))) + +(apply + (map point (map parse-card lines))) diff --git a/04/2.rkt b/04/2.rkt new file mode 100644 index 0000000..97977ec --- /dev/null +++ b/04/2.rkt @@ -0,0 +1,47 @@ +#lang racket + +(require "../lib/utils.rkt") +(require "../lib/obj.rkt") + +(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 (λ (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 |
