From a19a1b970e5dd6983be8660ef6e0f5929fb5a149 Mon Sep 17 00:00:00 2001 From: Mistivia Date: Thu, 15 Feb 2024 18:42:35 +0800 Subject: refactor --- advent-of-code/2023/01/1.rkt | 10 +--- advent-of-code/2023/01/2.rkt | 10 +--- advent-of-code/2023/02/1.rkt | 15 +----- advent-of-code/2023/02/2.rkt | 9 +--- advent-of-code/2023/04/1.rkt | 8 +-- advent-of-code/2023/04/2.rkt | 8 +-- advent-of-code/2023/04/input | 2 +- advent-of-code/2023/05/1.rkt | 71 +++++++++++++++++++++++++ advent-of-code/2023/05/2.rkt | 109 ++++++++++++++++++++++++++++++++++++++ advent-of-code/2023/05/part1.rkt | 71 ------------------------- advent-of-code/2023/05/part2.rkt | 109 -------------------------------------- advent-of-code/2023/lib/obj.rkt | 32 +++++++++++ advent-of-code/2023/lib/utils.rkt | 17 ++++++ 13 files changed, 240 insertions(+), 231 deletions(-) create mode 100755 advent-of-code/2023/05/1.rkt create mode 100755 advent-of-code/2023/05/2.rkt delete mode 100755 advent-of-code/2023/05/part1.rkt delete mode 100755 advent-of-code/2023/05/part2.rkt create mode 100644 advent-of-code/2023/lib/obj.rkt create mode 100644 advent-of-code/2023/lib/utils.rkt diff --git a/advent-of-code/2023/01/1.rkt b/advent-of-code/2023/01/1.rkt index 0c69be5..58475ed 100644 --- a/advent-of-code/2023/01/1.rkt +++ b/advent-of-code/2023/01/1.rkt @@ -1,14 +1,8 @@ #lang racket -(define fp (open-input-file "input")) -(define sum 0) +(require "../lib/utils.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)) diff --git a/advent-of-code/2023/01/2.rkt b/advent-of-code/2023/01/2.rkt index 85602da..85a0fd6 100644 --- a/advent-of-code/2023/01/2.rkt +++ b/advent-of-code/2023/01/2.rkt @@ -1,14 +1,8 @@ #lang racket -(define fp (open-input-file "input")) -(define sum 0) +(require "../lib/utils.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)) diff --git a/advent-of-code/2023/02/1.rkt b/advent-of-code/2023/02/1.rkt index 4382a66..ab1e4c2 100644 --- a/advent-of-code/2023/02/1.rkt +++ b/advent-of-code/2023/02/1.rkt @@ -1,13 +1,8 @@ #lang racket -(define fp (open-input-file "input")) +(require "../lib/utils.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)) @@ -51,12 +46,6 @@ #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))) diff --git a/advent-of-code/2023/02/2.rkt b/advent-of-code/2023/02/2.rkt index 8975a27..da45d56 100644 --- a/advent-of-code/2023/02/2.rkt +++ b/advent-of-code/2023/02/2.rkt @@ -1,13 +1,8 @@ #lang racket -(define fp (open-input-file "input")) +(require "../lib/utils.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)) diff --git a/advent-of-code/2023/04/1.rkt b/advent-of-code/2023/04/1.rkt index 30ea62f..a1edde2 100644 --- a/advent-of-code/2023/04/1.rkt +++ b/advent-of-code/2023/04/1.rkt @@ -1,14 +1,8 @@ #lang racket +(require "../lib/utils.rkt") (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)) diff --git a/advent-of-code/2023/04/2.rkt b/advent-of-code/2023/04/2.rkt index cf874d2..a9d751f 100644 --- a/advent-of-code/2023/04/2.rkt +++ b/advent-of-code/2023/04/2.rkt @@ -1,14 +1,8 @@ #lang racket +(require "../lib/utils.rkt") (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)) diff --git a/advent-of-code/2023/04/input b/advent-of-code/2023/04/input index ab0c373..f23b21e 100644 --- a/advent-of-code/2023/04/input +++ b/advent-of-code/2023/04/input @@ -194,4 +194,4 @@ Card 193: 13 33 98 37 19 86 32 15 95 96 | 56 90 5 60 24 21 46 73 29 3 58 75 77 Card 194: 77 6 10 48 14 79 73 51 49 25 | 86 12 37 23 43 34 5 89 97 27 53 70 75 19 15 79 45 26 1 73 68 36 2 78 18 Card 195: 94 57 24 37 46 75 73 10 29 5 | 78 25 21 48 22 46 38 76 19 17 64 32 88 99 63 12 20 41 16 7 14 54 81 97 89 Card 196: 76 48 15 89 44 50 79 80 52 78 | 93 55 21 18 73 31 47 20 97 83 87 30 6 24 77 74 67 45 76 65 37 43 42 98 38 -Card 197: 67 21 75 10 9 6 47 88 45 70 | 91 95 58 82 52 50 87 81 78 13 64 53 57 14 55 25 36 76 19 86 56 2 16 54 1 +Card 197: 67 21 75 10 9 6 47 88 45 70 | 91 95 58 82 52 50 87 81 78 13 64 53 57 14 55 25 36 76 19 86 56 2 16 54 1 \ No newline at end of file diff --git a/advent-of-code/2023/05/1.rkt b/advent-of-code/2023/05/1.rkt new file mode 100755 index 0000000..f0ad5ed --- /dev/null +++ b/advent-of-code/2023/05/1.rkt @@ -0,0 +1,71 @@ +#lang racket + +(define port (open-input-file "input")) + +(define seed + (let () + (define nums-str + (string-trim + (list-ref (string-split (read-line port) ":") 1))) + (map string->number (string-split nums-str " ")))) + +(begin (read-line port) (void)) + +(define (read-line-convert-eof port) + (define line (read-line port)) + (if (eof-object? line) "" line)) + +(define (read-map) + (define (loop ret) + (define line (string-trim (read-line-convert-eof port))) + (if (= 0 (string-length line)) + (reverse ret) + (loop (cons (map string->number (string-split line " ")) + ret)))) + (read-line port) + (loop '())) + +(define s2s (read-map)) +(define s2f (read-map)) +(define f2w (read-map)) +(define w2l (read-map)) +(define l2t (read-map)) +(define t2h (read-map)) +(define h2l (read-map)) +(define maps (list s2s s2f f2w w2l l2t t2h h2l)) + +(define (gen-mapper the-map) + (define (mapper x) + (define (loop the-map) + (if (null? the-map) + x + (let () + (define cur-map (car the-map)) + (define target (car cur-map)) + (define start (cadr cur-map)) + (define len (caddr cur-map)) + (if (and (>= x start) + (<= x (+ start len))) + (+ target (- x start)) + (loop (cdr the-map)))))) + (loop the-map)) + mapper) + +(define mappers (map gen-mapper maps)) + + +(define (comp-func funcs) + (define procs (reverse funcs)) + (define (comp-rec arg) + (if (null? procs) + arg + (let ((proc (car procs)) + (rest (cdr procs))) + (set! procs rest) + (proc (comp-rec arg))))) + comp-rec) + +(define (find-location x) + ((comp-func mappers) x)) + +(display (apply min (map find-location seed))) diff --git a/advent-of-code/2023/05/2.rkt b/advent-of-code/2023/05/2.rkt new file mode 100755 index 0000000..5024c1e --- /dev/null +++ b/advent-of-code/2023/05/2.rkt @@ -0,0 +1,109 @@ +#lang racket + +(define port (open-input-file "input")) + +(define seed + (let () + (define nums-str + (string-trim + (list-ref (string-split (read-line port) ":") 1))) + (define (pairing l) + (define (loop ret l) + (if (null? l) + ret + (loop + (cons (cons + (car l) + (+ (car l) (cadr l))) + ret) + (cddr l)))) + (loop '() l)) + (reverse + (pairing (map string->number (string-split nums-str " ")))))) + +(begin (read-line port) (void)) + +(define (read-line-convert-eof port) + (define line (read-line port)) + (if (eof-object? line) "" line)) + +(define (read-map) + (define (loop ret) + (define line (string-trim (read-line-convert-eof port))) + (if (= 0 (string-length line)) + (sort (reverse ret) (lambda (x y) (< (cadr x) (cadr y)))) + (loop (cons (map string->number (string-split line " ")) + ret)))) + (read-line port) + (loop '())) + +(define s2s (read-map)) +(define s2f (read-map)) +(define f2w (read-map)) +(define w2l (read-map)) +(define l2t (read-map)) +(define t2h (read-map)) +(define h2l (read-map)) +(define maps (list s2s s2f f2w w2l l2t t2h h2l)) + +(define (range-map mlist r) + ;; r :: Range :: (start . end) + ;; mlist :: List of (Map :: (dest, src, len)) + (define (loop result mlist r) + (define start (car r)) + (define end (cdr r)) + (if (null? mlist) + (cons r result) + (let () + (define cur-map (car mlist)) + (define map-target (car cur-map)) + (define map-start (cadr cur-map)) + (define map-end (+ map-start (caddr cur-map))) + (define offset (- map-target map-start)) + (define (pair-offset p) (cons (+ offset (car p)) (+ offset (cdr p)))) + (cond ((<= end start) + result) + ((>= start map-end) + (loop result (cdr mlist) r)) + ((>= start map-start) + (loop + (cons (pair-offset (cons start (min end map-end))) + result) + (cdr mlist) + (cons (min end map-end) end))) + ((<= end map-start) + (cons r result)) + ((< start map-start) + (loop + (cons (cons start map-start) result) + mlist + (cons map-start end))) + (else (error "unhandled cond in range-map")))))) + (reverse (loop '() mlist r))) + +(define (gen-range-mapper the-map) + (define (mapper range-list) + (apply append + (map + (lambda (range) + (range-map the-map range)) + range-list))) + mapper) + +(define mappers (map gen-range-mapper maps)) + +(define (comp-func funcs) + (define procs (reverse funcs)) + (define (comp-rec arg) + (if (null? procs) + arg + (let ((proc (car procs)) + (rest (cdr procs))) + (set! procs rest) + (proc (comp-rec arg))))) + comp-rec) + +(define (find-location x) + ((comp-func mappers) x)) + +(display (apply min (map car (find-location seed)))) diff --git a/advent-of-code/2023/05/part1.rkt b/advent-of-code/2023/05/part1.rkt deleted file mode 100755 index 64b8f84..0000000 --- a/advent-of-code/2023/05/part1.rkt +++ /dev/null @@ -1,71 +0,0 @@ -#lang racket - -(define port (open-input-file "input")) - -(define seed - (let () - (define nums-str - (string-trim - (list-ref (string-split (read-line port) ":") 1))) - (map string->number (string-split nums-str " ")))) - -(define _ (read-line port)) - -(define (read-line-convert-eof port) - (define line (read-line port)) - (if (eof-object? line) "" line)) - -(define (read-map) - (define (loop ret) - (define line (string-trim (read-line-convert-eof port))) - (if (= 0 (string-length line)) - (reverse ret) - (loop (cons (map string->number (string-split line " ")) - ret)))) - (read-line port) - (loop '())) - -(define s2s (read-map)) -(define s2f (read-map)) -(define f2w (read-map)) -(define w2l (read-map)) -(define l2t (read-map)) -(define t2h (read-map)) -(define h2l (read-map)) -(define maps (list s2s s2f f2w w2l l2t t2h h2l)) - -(define (gen-mapper the-map) - (define (mapper x) - (define (loop the-map) - (if (null? the-map) - x - (let () - (define cur-map (car the-map)) - (define target (car cur-map)) - (define start (cadr cur-map)) - (define len (caddr cur-map)) - (if (and (>= x start) - (<= x (+ start len))) - (+ target (- x start)) - (loop (cdr the-map)))))) - (loop the-map)) - mapper) - -(define mappers (map gen-mapper maps)) - - -(define (comp-func funcs) - (define procs (reverse funcs)) - (define (comp-rec arg) - (if (null? procs) - arg - (let ((proc (car procs)) - (rest (cdr procs))) - (set! procs rest) - (proc (comp-rec arg))))) - comp-rec) - -(define (find-location x) - ((comp-func mappers) x)) - -(display (apply min (map find-location seed))) diff --git a/advent-of-code/2023/05/part2.rkt b/advent-of-code/2023/05/part2.rkt deleted file mode 100755 index 97d07e1..0000000 --- a/advent-of-code/2023/05/part2.rkt +++ /dev/null @@ -1,109 +0,0 @@ -#lang racket - -(define port (open-input-file "input")) - -(define seed - (let () - (define nums-str - (string-trim - (list-ref (string-split (read-line port) ":") 1))) - (define (pairing l) - (define (loop ret l) - (if (null? l) - ret - (loop - (cons (cons - (car l) - (+ (car l) (cadr l))) - ret) - (cddr l)))) - (loop '() l)) - (reverse - (pairing (map string->number (string-split nums-str " ")))))) - -(define _ (read-line port)) - -(define (read-line-convert-eof port) - (define line (read-line port)) - (if (eof-object? line) "" line)) - -(define (read-map) - (define (loop ret) - (define line (string-trim (read-line-convert-eof port))) - (if (= 0 (string-length line)) - (sort (reverse ret) (lambda (x y) (< (cadr x) (cadr y)))) - (loop (cons (map string->number (string-split line " ")) - ret)))) - (read-line port) - (loop '())) - -(define s2s (read-map)) -(define s2f (read-map)) -(define f2w (read-map)) -(define w2l (read-map)) -(define l2t (read-map)) -(define t2h (read-map)) -(define h2l (read-map)) -(define maps (list s2s s2f f2w w2l l2t t2h h2l)) - -(define (range-map mlist r) - ;; r :: Range :: (start . end) - ;; mlist :: List of (Map :: (dest, src, len)) - (define (loop result mlist r) - (define start (car r)) - (define end (cdr r)) - (if (null? mlist) - (cons r result) - (let () - (define cur-map (car mlist)) - (define map-target (car cur-map)) - (define map-start (cadr cur-map)) - (define map-end (+ map-start (caddr cur-map))) - (define offset (- map-target map-start)) - (define (pair-offset p) (cons (+ offset (car p)) (+ offset (cdr p)))) - (cond ((<= end start) - result) - ((>= start map-end) - (loop result (cdr mlist) r)) - ((>= start map-start) - (loop - (cons (pair-offset (cons start (min end map-end))) - result) - (cdr mlist) - (cons (min end map-end) end))) - ((<= end map-start) - (cons r result)) - ((< start map-start) - (loop - (cons (cons start map-start) result) - mlist - (cons map-start end))) - (else (error "unhandled cond in range-map")))))) - (reverse (loop '() mlist r))) - -(define (gen-range-mapper the-map) - (define (mapper range-list) - (apply append - (map - (lambda (range) - (range-map the-map range)) - range-list))) - mapper) - -(define mappers (map gen-range-mapper maps)) - -(define (comp-func funcs) - (define procs (reverse funcs)) - (define (comp-rec arg) - (if (null? procs) - arg - (let ((proc (car procs)) - (rest (cdr procs))) - (set! procs rest) - (proc (comp-rec arg))))) - comp-rec) - -(define (find-location x) - ((comp-func mappers) x)) - -(display (apply min (map car (find-location seed)))) diff --git a/advent-of-code/2023/lib/obj.rkt b/advent-of-code/2023/lib/obj.rkt new file mode 100644 index 0000000..9217976 --- /dev/null +++ b/advent-of-code/2023/lib/obj.rkt @@ -0,0 +1,32 @@ +#lang racket + +(provide obj-maker + obj-set + obj-show) + +(define (alist->obj alist) + (lambda key + (if (null? key) + alist + (cadr (assoc (car key) alist))))) + +(define (obj-maker . fields) + (lambda inits + (define alist (map list fields inits)) + (alist->obj alist))) + +(define (obj-set record key value) + (define alist (record)) + (define new-alist + (let loop ((new-list '()) (cur alist) (is-set #f)) + (if (null? cur) + (if is-set + new-list + (cons (list key value) new-list)) + (let () + (if (eq? key (caar cur)) + (loop (cons (list key value) new-list) (cdr cur) #t) + (loop (cons (car cur) new-list) (cdr cur) is-set)))))) + (alist->obj new-alist)) + +(define (obj-show x) (x)) \ No newline at end of file diff --git a/advent-of-code/2023/lib/utils.rkt b/advent-of-code/2023/lib/utils.rkt new file mode 100644 index 0000000..946bb86 --- /dev/null +++ b/advent-of-code/2023/lib/utils.rkt @@ -0,0 +1,17 @@ +#lang racket + +(provide get-lines + enumerate) + +(define (get-lines fp) + (let loop ((lines '())) + (define l (read-line fp)) + (if (eof-object? l) + (reverse lines) + (loop (cons l lines))))) + +(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))))) \ No newline at end of file -- cgit v1.0