aboutsummaryrefslogtreecommitdiff
path: root/advent-of-code/2023
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2024-02-25 20:11:54 +0800
committerMistivia <i@mistivia.com>2024-02-25 20:11:54 +0800
commit515ecbf5a20a8e432a998b0a543bedcb1bd64cf4 (patch)
tree6353c603a8cf0276553f420205f8d1c730a318ce /advent-of-code/2023
parente191b610c11326b587cf0b01fd6fc37b8d07bb19 (diff)
reorg code
Diffstat (limited to 'advent-of-code/2023')
-rw-r--r--advent-of-code/2023/.gitignore1
-rw-r--r--advent-of-code/2023/01/1.rkt16
-rw-r--r--advent-of-code/2023/01/2.rkt30
-rw-r--r--advent-of-code/2023/02/1.rkt52
-rw-r--r--advent-of-code/2023/02/2.rkt44
-rw-r--r--advent-of-code/2023/03/1.rkt84
-rw-r--r--advent-of-code/2023/03/2.rkt102
-rw-r--r--advent-of-code/2023/04/1.rkt29
-rw-r--r--advent-of-code/2023/04/2.rkt47
-rwxr-xr-xadvent-of-code/2023/05/1.rkt71
-rwxr-xr-xadvent-of-code/2023/05/2.rkt109
-rw-r--r--advent-of-code/2023/06/1.rkt32
-rw-r--r--advent-of-code/2023/06/2.rkt29
-rw-r--r--advent-of-code/2023/07/1.rkt80
-rw-r--r--advent-of-code/2023/07/2.rkt87
-rw-r--r--advent-of-code/2023/08/1.rkt47
-rw-r--r--advent-of-code/2023/08/2.rkt60
-rw-r--r--advent-of-code/2023/09/1.rkt27
-rw-r--r--advent-of-code/2023/09/2.rkt26
-rw-r--r--advent-of-code/2023/10/1.rkt83
-rw-r--r--advent-of-code/2023/10/2.rkt112
21 files changed, 0 insertions, 1168 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)))
-