diff options
Diffstat (limited to 'advent-of-code')
| -rw-r--r-- | advent-of-code/2023/.gitignore | 1 | ||||
| -rw-r--r-- | advent-of-code/2023/01/1.rkt | 16 | ||||
| -rw-r--r-- | advent-of-code/2023/01/2.rkt | 30 | ||||
| -rw-r--r-- | advent-of-code/2023/02/1.rkt | 52 | ||||
| -rw-r--r-- | advent-of-code/2023/02/2.rkt | 44 | ||||
| -rw-r--r-- | advent-of-code/2023/03/1.rkt | 84 | ||||
| -rw-r--r-- | advent-of-code/2023/03/2.rkt | 102 | ||||
| -rw-r--r-- | advent-of-code/2023/04/1.rkt | 29 | ||||
| -rw-r--r-- | advent-of-code/2023/04/2.rkt | 47 | ||||
| -rwxr-xr-x | advent-of-code/2023/05/1.rkt | 71 | ||||
| -rwxr-xr-x | advent-of-code/2023/05/2.rkt | 109 | ||||
| -rw-r--r-- | advent-of-code/2023/06/1.rkt | 32 | ||||
| -rw-r--r-- | advent-of-code/2023/06/2.rkt | 29 | ||||
| -rw-r--r-- | advent-of-code/2023/07/1.rkt | 80 | ||||
| -rw-r--r-- | advent-of-code/2023/07/2.rkt | 87 | ||||
| -rw-r--r-- | advent-of-code/2023/08/1.rkt | 47 | ||||
| -rw-r--r-- | advent-of-code/2023/08/2.rkt | 60 | ||||
| -rw-r--r-- | advent-of-code/2023/09/1.rkt | 27 | ||||
| -rw-r--r-- | advent-of-code/2023/09/2.rkt | 26 | ||||
| -rw-r--r-- | advent-of-code/2023/10/1.rkt | 83 | ||||
| -rw-r--r-- | advent-of-code/2023/10/2.rkt | 112 | ||||
| -rw-r--r-- | advent-of-code/lib/obj.rkt | 32 | ||||
| -rw-r--r-- | advent-of-code/lib/utils.rkt | 36 |
23 files changed, 0 insertions, 1236 deletions
diff --git a/advent-of-code/2023/.gitignore b/advent-of-code/2023/.gitignore deleted file mode 100644 index 770eab4..0000000 --- a/advent-of-code/2023/.gitignore +++ /dev/null @@ -1 +0,0 @@ -input
\ No newline at end of file diff --git a/advent-of-code/2023/01/1.rkt b/advent-of-code/2023/01/1.rkt deleted file mode 100644 index 8953e84..0000000 --- a/advent-of-code/2023/01/1.rkt +++ /dev/null @@ -1,16 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define fp (open-input-file "input")) - -(define lines (get-lines fp)) - -(define (extract-number line) - (define number-list (filter char-numeric? (string->list line))) - (set! number-list (map (λ (c) - (string->number (list->string (list c)))) - number-list)) - (+ (last number-list) (* 10 (car number-list)))) - -(apply + (map extract-number lines)) diff --git a/advent-of-code/2023/01/2.rkt b/advent-of-code/2023/01/2.rkt deleted file mode 100644 index f39d87c..0000000 --- a/advent-of-code/2023/01/2.rkt +++ /dev/null @@ -1,30 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define fp (open-input-file "input")) - -(define lines (get-lines fp)) - -(define (replace-digit str) - (set! str (string-replace str "one" "o1ne")) - (set! str (string-replace str "two" "t2wo")) - (set! str (string-replace str "three" "t3hree")) - (set! str (string-replace str "four" "f4our")) - (set! str (string-replace str "five" "f5ive")) - (set! str (string-replace str "six" "s6ix")) - (set! str (string-replace str "seven" "s7even")) - (set! str (string-replace str "eight" "e8ight")) - (set! str (string-replace str "nine" "n9ine")) - str) - -(define (extract-number rawline) - (define line (replace-digit rawline)) - (define number-list (filter char-numeric? (string->list line))) - (set! number-list (map (λ (c) - (string->number (list->string (list c)))) - number-list)) - (+ (last number-list) (* 10 (car number-list)))) - -(display (apply + (map extract-number lines))) -(newline) diff --git a/advent-of-code/2023/02/1.rkt b/advent-of-code/2023/02/1.rkt deleted file mode 100644 index 500e916..0000000 --- a/advent-of-code/2023/02/1.rkt +++ /dev/null @@ -1,52 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define fp (open-input-file "input")) - -(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 (λ (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)))))) - -(apply + (map cadr - (filter (λ (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 deleted file mode 100644 index 7da2cd2..0000000 --- a/advent-of-code/2023/02/2.rkt +++ /dev/null @@ -1,44 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define fp (open-input-file "input")) - -(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 (λ (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/03/1.rkt b/advent-of-code/2023/03/1.rkt deleted file mode 100644 index 5e86227..0000000 --- a/advent-of-code/2023/03/1.rkt +++ /dev/null @@ -1,84 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") -(require "../../lib/obj.rkt") - -(define (read-input) - (call-with-input-file "input" - (λ (fp) - (list->vector (get-lines fp))))) - -(define schema (read-input)) - -(define (char-at line col) - (string-ref (vector-ref schema line) col)) - -(define height (vector-length schema)) -(define width (string-length (vector-ref schema 0))) - -(define make-num (obj-maker 'line 'col 'value 'length)) - -(define (scan-nums) - (define nums '()) - (let loop ((i 0)) - (if (>= i height) - (void) - (let () - (let loop ((j 0)) - (define curline (vector-ref schema i)) - (if (>= j width) - (void) - (let () - (define next 1) - (define (find-next) - (if (or (>= (+ j next) 140) - (not (char-numeric? (char-at i (+ j next))))) - (void) - (let () - (set! next (+ 1 next)) - (find-next)))) - (if (char-numeric? (char-at i j)) - (let () - (find-next) - (define value (string->number (substring curline j (+ j next)))) - (set! nums (cons (make-num i j value next) nums))) - (void)) - (loop (+ j next))))) - (loop (+ 1 i))))) - (reverse nums)) -(define nums (scan-nums)) - -(define (is-symbol? c) - (and (not (char-numeric? c)) - (not (char=? #\. c)))) - -(define (collect-adjacent num) - (define left - (if (= 0 (num 'col)) - '() - (list (char-at (num 'line) (- (num 'col) 1))))) - (define right - (if (= width (+ (num 'col) (num 'length))) - '() - (list (char-at (num 'line) (+ (num 'col) (num 'length)))))) - (define up - (if (= 0 (num 'line)) - '() - (string->list - (substring (vector-ref schema (- (num 'line) 1)) - (max 0 (- (num 'col) 1)) - (min width (+ (num 'col) (num 'length) 1)))))) - (define down - (if (= (- height 1) (num 'line)) - '() - (string->list - (substring (vector-ref schema (+ (num 'line) 1)) - (max 0 (- (num 'col) 1)) - (min width (+ (num 'col) (num 'length) 1)))))) - (append left right up down)) - -(define (is-part-num? num) - (findf is-symbol? (collect-adjacent num))) - -(apply + (map (λ (x) (x 'value)) - (filter is-part-num? nums)))
\ No newline at end of file diff --git a/advent-of-code/2023/03/2.rkt b/advent-of-code/2023/03/2.rkt deleted file mode 100644 index 71c3221..0000000 --- a/advent-of-code/2023/03/2.rkt +++ /dev/null @@ -1,102 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") -(require "../../lib/obj.rkt") - -(define (read-input) - (call-with-input-file "input" - (λ (fp) - (list->vector (get-lines fp))))) - -(define schema (read-input)) - -(define (char-at line col) - (string-ref (vector-ref schema line) col)) - -(define height (vector-length schema)) -(define width (string-length (vector-ref schema 0))) - -(define make-num (obj-maker 'line 'col 'value 'length)) - -(define (scan-nums) - (define nums '()) - (let loop ((i 0)) - (if (>= i height) - (void) - (let () - (let loop ((j 0)) - (define curline (vector-ref schema i)) - (if (>= j width) - (void) - (let () - (define next 1) - (define (find-next) - (if (or (>= (+ j next) 140) - (not (char-numeric? (char-at i (+ j next))))) - (void) - (let () - (set! next (+ 1 next)) - (find-next)))) - (if (char-numeric? (char-at i j)) - (let () - (find-next) - (define value (string->number (substring curline j (+ j next)))) - (set! nums (cons (make-num i j value next) nums))) - (void)) - (loop (+ j next))))) - (loop (+ 1 i))))) - (reverse nums)) -(define nums (scan-nums)) - -(define (collect-adjacent-positions num) - (define (position-range line start end) - (define delta (- end start)) - (map list (repeat delta line) (range start end))) - (define left - (if (= 0 (num 'col)) - '() - (list (list (num 'line) (- (num 'col) 1))))) - (define right - (if (= width (+ (num 'col) (num 'length))) - '() - (list (list (num 'line) (+ (num 'col) (num 'length)))))) - (define up - (if (= 0 (num 'line)) - '() - (position-range (- (num 'line) 1) - (max 0 (- (num 'col) 1)) - (min width (+ (num 'col) (num 'length) 1))))) - (define down - (if (= (- height 1) (num 'line)) - '() - (position-range (+ (num 'line) 1) - (max 0 (- (num 'col) 1)) - (min width (+ (num 'col) (num 'length) 1))))) - (append left right up down)) - -(define asterisks (make-hash)) - -(define (mark-adj-asterisk num) - (define adjs (collect-adjacent-positions num)) - (define (mark coord) - (if (not (char=? #\* (char-at (car coord) (cadr coord)))) - (void) - (let () - (when (not (hash-has-key? asterisks coord)) - (hash-set! asterisks coord '())) - (hash-set! asterisks coord (cons (num 'value) (hash-ref asterisks coord)))))) - (for-each mark adjs)) - -(for-each mark-adj-asterisk nums) - -(define aster-list (hash->list asterisks)) - -(define (is-gear? aster) - (define nums-list (cdr aster)) - (= 2 (length nums-list))) - -(define (power aster) - (define nums-list (cdr aster)) - (* (car nums-list) (cadr nums-list))) - -(apply + (map power (filter is-gear? aster-list))) diff --git a/advent-of-code/2023/04/1.rkt b/advent-of-code/2023/04/1.rkt deleted file mode 100644 index e8dd242..0000000 --- a/advent-of-code/2023/04/1.rkt +++ /dev/null @@ -1,29 +0,0 @@ -#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/advent-of-code/2023/04/2.rkt b/advent-of-code/2023/04/2.rkt deleted file mode 100644 index eec9632..0000000 --- a/advent-of-code/2023/04/2.rkt +++ /dev/null @@ -1,47 +0,0 @@ -#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 diff --git a/advent-of-code/2023/05/1.rkt b/advent-of-code/2023/05/1.rkt deleted file mode 100755 index 352e10c..0000000 --- a/advent-of-code/2023/05/1.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 " ")))) - -(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 deleted file mode 100755 index 8e39c40..0000000 --- a/advent-of-code/2023/05/2.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 " ")))))) - -(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) (λ (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 - (λ (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/06/1.rkt b/advent-of-code/2023/06/1.rkt deleted file mode 100644 index 5496476..0000000 --- a/advent-of-code/2023/06/1.rkt +++ /dev/null @@ -1,32 +0,0 @@ -#lang racket - -(define in (open-input-file "input")) - -(define (read-num-list) - (define line (read-line in)) - (map - string->number - (string-split - (cadr (string-split (string-trim line) ":"))))) - -(define times (read-num-list)) -(define distances (read-num-list)) - -(define games (map cons times distances)) - -(define (calc time hold-time) - (* hold-time (- time hold-time))) - -(define (solve time distance) - (define (loop counter hold-time) - (if (> hold-time time) - counter - (if (> (calc time hold-time) distance) - (loop (+ 1 counter) (+ 1 hold-time)) - (loop counter (+ 1 hold-time))))) - (loop 0 0)) - -(display (apply * (map - (λ (x) (solve (car x) (cdr x))) - games))) -(newline) diff --git a/advent-of-code/2023/06/2.rkt b/advent-of-code/2023/06/2.rkt deleted file mode 100644 index 2d666ed..0000000 --- a/advent-of-code/2023/06/2.rkt +++ /dev/null @@ -1,29 +0,0 @@ -#lang racket - -(define in (open-input-file "input")) - -(define (read-num) - (define line (read-line in)) - (string->number - (apply - string-append - (string-split - (cadr (string-split (string-trim line) ":")))))) - -(define time (read-num)) -(define distance (read-num)) - -(define (calc time hold-time) - (* hold-time (- time hold-time))) - -(define (solve time distance) - (define (loop counter hold-time) - (if (> hold-time time) - counter - (if (> (calc time hold-time) distance) - (loop (+ 1 counter) (+ 1 hold-time)) - (loop counter (+ 1 hold-time))))) - (loop 0 0)) - -(display (solve time distance)) -(newline) diff --git a/advent-of-code/2023/07/1.rkt b/advent-of-code/2023/07/1.rkt deleted file mode 100644 index 286a0e8..0000000 --- a/advent-of-code/2023/07/1.rkt +++ /dev/null @@ -1,80 +0,0 @@ -#lang racket - -(define input - (with-input-from-file "input" - (λ () - (let loop ((cards '())) - (define line (read-line)) - (if (or (eof-object? line) - (= 0 (string-length line))) - (reverse cards) - (let () - (define splited-line (string-split line)) - (define hand (car splited-line)) - (define bid (string->number (cadr splited-line))) - (loop (cons (list hand bid) cards)))))))) - -(define (card-number char) - (cond ((eq? char #\A) 12) - ((eq? char #\K) 11) - ((eq? char #\Q) 10) - ((eq? char #\J) 9) - ((eq? char #\T) 8) - (else (- (string->number (make-string 1 char)) - 2)))) - -(define (hand-type hand) - (define vec (make-vector 13 0)) - (let loop ((i 0)) - (if (>= i 5) - (vector->list (vector-sort vec >)) - (let () - (define index (card-number (string-ref hand i))) - (vector-set! vec index (+ 1 (vector-ref vec index))) - (loop (+ i 1)))))) - -(define (hand-type<? type1 type2) - (if (or (null? type1) - (null? type2)) - #f - (if (= (car type1) (car type2)) - (hand-type<? (cdr type1) (cdr type2)) - (< (car type1) (car type2))))) - -(define (hand-type=? type1 type2) - (if (null? type1) - #t - (if (= (car type1) (car type2)) - (hand-type=? (cdr type1) (cdr type2)) - #f))) - -(define (raw-hand<? hand1 hand2) - (define h1 (map card-number (string->list hand1))) - (define h2 (map card-number (string->list hand2))) - (hand-type<? h1 h2)) - -(define (hand<? hand1 hand2) - (define type1 (hand-type hand1)) - (define type2 (hand-type hand2)) - (if (hand-type=? type1 type2) - (raw-hand<? hand1 hand2) - (hand-type<? type1 type2))) - -(define sorted-cards - (sort input (λ (a b) - (hand<? (car a) (car b))))) - -(define (calc-points card) - (* (cadar card) (cadr card))) - -(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))))) - -(define result - (apply + (map calc-points (enumerate sorted-cards)))) - -(display result) -(newline) diff --git a/advent-of-code/2023/07/2.rkt b/advent-of-code/2023/07/2.rkt deleted file mode 100644 index 07ff61b..0000000 --- a/advent-of-code/2023/07/2.rkt +++ /dev/null @@ -1,87 +0,0 @@ -#lang racket - -(define input - (with-input-from-file "input" - (λ () - (let loop ((cards '())) - (define line (read-line)) - (if (or (eof-object? line) - (= 0 (string-length line))) - (reverse cards) - (let () - (define splited-line (string-split line)) - (define hand (car splited-line)) - (define bid (string->number (cadr splited-line))) - (loop (cons (list hand bid) cards)))))))) - -(define (card-number char) - (cond ((eq? char #\A) 12) - ((eq? char #\K) 11) - ((eq? char #\Q) 10) - ((eq? char #\J) 0) - ((eq? char #\T) 9) - (else (- (string->number (make-string 1 char)) - 1)))) - -(define (joker-transform type) - (define joker-num (vector-ref type 0)) - (vector-set! type 0 0) - (vector-sort! type >) - (vector-set! type 0 (+ joker-num (vector-ref type 0))) - type) - -(define (hand-type hand) - (define vec (make-vector 13 0)) - (let loop ((i 0)) - (if (>= i 5) - (vector->list (joker-transform vec)) - (let () - (define index (card-number (string-ref hand i))) - (vector-set! vec index (+ 1 (vector-ref vec index))) - (loop (+ i 1)))))) - -(define (hand-type<? type1 type2) - (if (or (null? type1) - (null? type2)) - #f - (if (= (car type1) (car type2)) - (hand-type<? (cdr type1) (cdr type2)) - (< (car type1) (car type2))))) - -(define (hand-type=? type1 type2) - (if (null? type1) - #t - (if (= (car type1) (car type2)) - (hand-type=? (cdr type1) (cdr type2)) - #f))) - -(define (raw-hand<? hand1 hand2) - (define h1 (map card-number (string->list hand1))) - (define h2 (map card-number (string->list hand2))) - (hand-type<? h1 h2)) - -(define (hand<? hand1 hand2) - (define type1 (hand-type hand1)) - (define type2 (hand-type hand2)) - (if (hand-type=? type1 type2) - (raw-hand<? hand1 hand2) - (hand-type<? type1 type2))) - -(define sorted-cards - (sort input (λ (a b) - (hand<? (car a) (car b))))) - -(define (calc-points card) - (* (cadar card) (cadr card))) - -(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))))) - -(define result - (apply + (map calc-points (enumerate sorted-cards)))) - -(display result) -(newline) diff --git a/advent-of-code/2023/08/1.rkt b/advent-of-code/2023/08/1.rkt deleted file mode 100644 index 81424a1..0000000 --- a/advent-of-code/2023/08/1.rkt +++ /dev/null @@ -1,47 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define lines - (call-with-input-file "input" - (lambda (fp) - (get-lines fp)))) - -(define instructions (string->list (car lines))) - -(define (make-instruction-generator) - (define cur instructions) - (lambda () - (when (null? cur) - (set! cur instructions)) - (define ret (car cur)) - (set! cur (cdr cur)) - ret)) - -(define next-instruction (make-instruction-generator)) - -(set! lines (cddr lines)) - -(define (parse-map str) - (define p1 (string-split str "=")) - (define key (string-trim (car p1))) - (define val-str (string-trim (cadr p1))) - (define value (list (substring val-str 1 4) (substring val-str 6 9))) - (cons key value)) - -(define the-map (make-hash (map parse-map lines))) - -(define (simulate start end) - (let loop ((i 0) (cur start)) - (if (string=? cur end) - i - (let () - (define instruction (next-instruction)) - (define mapping (hash-ref the-map cur)) - (define next - (if (char=? instruction #\L) - (car mapping) - (cadr mapping))) - (loop (+ 1 i) next))))) - -(simulate "AAA" "ZZZ")
\ No newline at end of file diff --git a/advent-of-code/2023/08/2.rkt b/advent-of-code/2023/08/2.rkt deleted file mode 100644 index c0c55ea..0000000 --- a/advent-of-code/2023/08/2.rkt +++ /dev/null @@ -1,60 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define lines - (call-with-input-file "input" - (lambda (fp) - (get-lines fp)))) - -(define instructions (string->list (car lines))) - -(define (make-instruction-generator) - (define cur instructions) - (lambda () - (when (null? cur) - (set! cur instructions)) - (define ret (car cur)) - (set! cur (cdr cur)) - ret)) - -(define next-instruction (make-instruction-generator)) - -(set! lines (cddr lines)) - -(define (parse-map str) - (define p1 (string-split str "=")) - (define key (string-trim (car p1))) - (define val-str (string-trim (cadr p1))) - (define value (list (substring val-str 1 4) (substring val-str 6 9))) - (cons key value)) - -(define the-map (make-hash (map parse-map lines))) - -(define (is-start? str) - (char=? #\A (string-ref str 2))) - -(define (is-end? str) - (char=? #\Z (string-ref str 2))) - -(define (simulate start) - (let loop ((i 0) (cur start)) - (if (is-end? cur) - i - (let () - (define instruction (next-instruction)) - (define (next-point point) - (define mapping (hash-ref the-map point)) - (if (char=? instruction #\L) - (car mapping) - (cadr mapping))) - (loop (+ 1 i) (next-point cur)))))) - - -(define starts - (let () - (define lst (hash->list the-map)) - (define keys (map car lst)) - (filter is-start? keys))) - -(apply lcm (map simulate starts))
\ No newline at end of file diff --git a/advent-of-code/2023/09/1.rkt b/advent-of-code/2023/09/1.rkt deleted file mode 100644 index 531c5dd..0000000 --- a/advent-of-code/2023/09/1.rkt +++ /dev/null @@ -1,27 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define lines - (call-with-input-file "input" - (λ (fp) - (get-lines fp)))) - -(define (parse-data line) - (map string->number (string-split line))) - -(define data (map parse-data lines)) - -(define (diff lst) - (let loop ((cur lst) (ret '())) - (if (or (null? cur) (null? (cdr cur))) - (reverse ret) - (loop (cdr cur) (cons (- (cadr cur) (car cur)) ret))))) - -(define (predict lst) - (if (andmap (λ (x) (= x (car lst))) lst) - (car lst) - (+ (last lst) (predict (diff lst))))) - -(apply + (map predict data)) - diff --git a/advent-of-code/2023/09/2.rkt b/advent-of-code/2023/09/2.rkt deleted file mode 100644 index b747b97..0000000 --- a/advent-of-code/2023/09/2.rkt +++ /dev/null @@ -1,26 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define lines - (call-with-input-file "input" - (λ (fp) - (get-lines fp)))) - -(define (parse-data line) - (map string->number (string-split line))) - -(define data (map parse-data lines)) - -(define (diff lst) - (let loop ((cur lst) (ret '())) - (if (or (null? cur) (null? (cdr cur))) - (reverse ret) - (loop (cdr cur) (cons (- (cadr cur) (car cur)) ret))))) - -(define (predict lst) - (if (andmap (λ (x) (= x (car lst))) lst) - (car lst) - (- (car lst) (predict (diff lst))))) - -(apply + (map predict data)) diff --git a/advent-of-code/2023/10/1.rkt b/advent-of-code/2023/10/1.rkt deleted file mode 100644 index e4911aa..0000000 --- a/advent-of-code/2023/10/1.rkt +++ /dev/null @@ -1,83 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define lines - (call-with-input-file "input" - (λ (fp) - (get-lines fp)))) - -(define diagram (list->vector lines)) -(define height (vector-length diagram)) -(define width (string-length (vector-ref diagram 0))) -(define (char-at x y) - (string-ref (vector-ref diagram y) x)) - -(define (find-start) - (let loop ((x 0) (y 0)) - (if (>= y height) - #f - (if (>= x width) - (loop 0 (+ y 1)) - (if (char=? #\S (char-at x y)) - (cons x y) - (loop (+ x 1) y)))))) - -(define start (find-start)) - -(define (valid-pos? pos) - (define x (car pos)) - (define y (cdr pos)) - (and (and (>= x 0) (< x width)) - (and (>= y 0) (< y height)))) - -(define first-pos - (let () - (define up (cons (car start) (- (cdr start) 1))) - (define down (cons (car start) (+ (cdr start) 1))) - (define left (cons (- (car start) 1) (cdr start))) - (define right (cons (+ (car start) 1) (cdr start))) - (cond ((and (valid-pos? up) - (member (char-at (car up) (cdr up)) (list #\| #\F #\7))) - up) - ((and (valid-pos? down) - (member (char-at (car down) (cdr down)) (list #\| #\L #\J ))) - down) - ((and (valid-pos? left) - (member (char-at (car left) (cdr left)) (list #\- #\F #\L ))) - left) - ((and (valid-pos? right) - (member (char-at (car right) (cdr right)) (list #\- #\7 #\J))) - right)))) - -(define (next cur recent) - (define up (cons (car cur) (- (cdr cur) 1))) - (define down (cons (car cur) (+ (cdr cur) 1))) - (define left (cons (- (car cur) 1) (cdr cur))) - (define right (cons (+ (car cur) 1) (cdr cur))) - (define c (char-at (car cur) (cdr cur))) - (define possible-pos - (cond ((char=? c #\|) (list up down)) - ((char=? c #\-) (list left right)) - ((char=? c #\F) (list right down)) - ((char=? c #\L) (list up right)) - ((char=? c #\7) (list left down)) - ((char=? c #\J) (list up left)))) - (let loop ((cur possible-pos)) - (if (not (equal? (car cur) recent)) - (car cur) - (loop (cdr cur))))) - -(define (simulate) - (let loop ((i 0) (cur first-pos) (recent start)) - (if (equal? cur start) - i - (let () - (define next-loc (next cur recent)) - (loop (+ i 1) next-loc cur))))) - -(define loop-length (simulate)) - -(if (= 0 (modulo loop-length 2)) - (/ loop-length 2) - (+ 1 (quotient loop-length 2))) diff --git a/advent-of-code/2023/10/2.rkt b/advent-of-code/2023/10/2.rkt deleted file mode 100644 index 3653a94..0000000 --- a/advent-of-code/2023/10/2.rkt +++ /dev/null @@ -1,112 +0,0 @@ -#lang racket - -(require "../../lib/utils.rkt") - -(define lines - (call-with-input-file "input" - (λ (fp) - (get-lines fp)))) - -(define diagram (list->vector lines)) -(define height (vector-length diagram)) -(define width (string-length (vector-ref diagram 0))) -(define (char-at x y) - (string-ref (vector-ref diagram y) x)) - -(define (find-start) - (let loop ((x 0) (y 0)) - (if (>= y height) - #f - (if (>= x width) - (loop 0 (+ y 1)) - (if (char=? #\S (char-at x y)) - (cons x y) - (loop (+ x 1) y)))))) - -(define start (find-start)) - -(define (valid-pos? pos) - (define x (car pos)) - (define y (cdr pos)) - (and (and (>= x 0) (< x width)) - (and (>= y 0) (< y height)))) - -(define first-pos - (let () - (define up (cons (car start) (- (cdr start) 1))) - (define down (cons (car start) (+ (cdr start) 1))) - (define left (cons (- (car start) 1) (cdr start))) - (define right (cons (+ (car start) 1) (cdr start))) - (cond ((and (valid-pos? up) - (member (char-at (car up) (cdr up)) (list #\| #\F #\7))) - up) - ((and (valid-pos? down) - (member (char-at (car down) (cdr down)) (list #\| #\L #\J ))) - down) - ((and (valid-pos? left) - (member (char-at (car left) (cdr left)) (list #\- #\F #\L ))) - left) - ((and (valid-pos? right) - (member (char-at (car right) (cdr right)) (list #\- #\7 #\J))) - right)))) - -(define (next cur recent) - (define up (cons (car cur) (- (cdr cur) 1))) - (define down (cons (car cur) (+ (cdr cur) 1))) - (define left (cons (- (car cur) 1) (cdr cur))) - (define right (cons (+ (car cur) 1) (cdr cur))) - (define c (char-at (car cur) (cdr cur))) - (define possible-pos - (cond ((char=? c #\|) (list up down)) - ((char=? c #\-) (list left right)) - ((char=? c #\F) (list right down)) - ((char=? c #\L) (list up right)) - ((char=? c #\7) (list left down)) - ((char=? c #\J) (list up left)))) - (let loop ((cur possible-pos)) - (if (not (equal? (car cur) recent)) - (car cur) - (loop (cdr cur))))) - -(define pipes (make-hash)) - -(define (simulate) - (let loop ((i 0) (cur first-pos) (recent start)) - (hash-set! pipes cur '()) - (if (equal? cur start) - i - (let () - (define next-loc (next cur recent)) - (loop (+ i 1) next-loc cur))))) - -(define (mark-junk) - (let loop ((x 0) (y 0)) - (if (>= y height) - (void) - (if (>= x width) - (loop 0 (+ y 1)) - (let () - (when (and (not (hash-has-key? pipes (cons x y))) - (not (char=? #\. (char-at x y)))) - (string-set! (vector-ref diagram y) x #\.)) - (loop (+ 1 x) y)))))) - -(let () - (simulate) - (mark-junk) - (void)) - -(define (ray-cast-find s) - (let loop ((i 0) (flag #f) (ret 0)) - (if (>= i width) - ret - (let () - (define char (string-ref s i)) - (if (and flag (char=? char #\.)) - (loop (+ 1 i) flag (+ 1 ret)) - (if (member char (list #\| #\F #\7)) - (loop (+ 1 i) (not flag) ret) - (loop (+ 1 i) flag ret))))))) - -(apply + (map ray-cast-find (vector->list diagram))) - diff --git a/advent-of-code/lib/obj.rkt b/advent-of-code/lib/obj.rkt deleted file mode 100644 index 8ffc401..0000000 --- a/advent-of-code/lib/obj.rkt +++ /dev/null @@ -1,32 +0,0 @@ -#lang racket - -(provide obj-maker - obj-set - obj-show) - -(define (alist->obj alist) - (λ key - (if (null? key) - alist - (cadr (assoc (car key) alist))))) - -(define (obj-maker . fields) - (λ 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/lib/utils.rkt b/advent-of-code/lib/utils.rkt deleted file mode 100644 index 2ce8a51..0000000 --- a/advent-of-code/lib/utils.rkt +++ /dev/null @@ -1,36 +0,0 @@ -#lang racket - -(provide get-lines - enumerate - repeat - split-list-by) - -(define (repeat n e) - (let loop ((i 0) (ret '())) - (if (>= i n) - ret - (loop (+ 1 i) (cons e ret))))) - -(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))))) - -(define (split-list-by e lst . eq) - (define cmp (if (null? eq) equal? eq)) - (let loop ((ret '()) - (cur '()) - (lst lst)) - (if (null? lst) - (reverse (cons (reverse cur) ret)) - (if (cmp e (car lst)) - (loop (cons (reverse cur) ret) '() (cdr lst)) - (loop ret (cons (car lst) cur) (cdr lst)))))) |
