From 515ecbf5a20a8e432a998b0a543bedcb1bd64cf4 Mon Sep 17 00:00:00 2001 From: Mistivia Date: Sun, 25 Feb 2024 20:11:54 +0800 Subject: reorg code --- .gitignore | 1 + 01/1.rkt | 16 +++ 01/2.rkt | 30 ++++++ 02/1.rkt | 52 ++++++++++ 02/2.rkt | 44 ++++++++ 03/1.rkt | 84 ++++++++++++++++ 03/2.rkt | 102 +++++++++++++++++++ 04/1.rkt | 29 ++++++ 04/2.rkt | 47 +++++++++ 05/1.rkt | 71 +++++++++++++ 05/2.rkt | 109 ++++++++++++++++++++ 06/1.rkt | 32 ++++++ 06/2.rkt | 29 ++++++ 07/1.rkt | 80 +++++++++++++++ 07/2.rkt | 87 ++++++++++++++++ 08/1.rkt | 47 +++++++++ 08/2.rkt | 60 +++++++++++ 09/1.rkt | 27 +++++ 09/2.rkt | 26 +++++ 10/1.rkt | 83 +++++++++++++++ 10/2.rkt | 112 +++++++++++++++++++++ README.md | 4 +- advent-of-code/2023/.gitignore | 1 - advent-of-code/2023/01/1.rkt | 16 --- advent-of-code/2023/01/2.rkt | 30 ------ advent-of-code/2023/02/1.rkt | 52 ---------- advent-of-code/2023/02/2.rkt | 44 -------- advent-of-code/2023/03/1.rkt | 84 ---------------- advent-of-code/2023/03/2.rkt | 102 ------------------- advent-of-code/2023/04/1.rkt | 29 ------ advent-of-code/2023/04/2.rkt | 47 --------- advent-of-code/2023/05/1.rkt | 71 ------------- advent-of-code/2023/05/2.rkt | 109 -------------------- advent-of-code/2023/06/1.rkt | 32 ------ advent-of-code/2023/06/2.rkt | 29 ------ advent-of-code/2023/07/1.rkt | 80 --------------- advent-of-code/2023/07/2.rkt | 87 ---------------- advent-of-code/2023/08/1.rkt | 47 --------- advent-of-code/2023/08/2.rkt | 60 ----------- advent-of-code/2023/09/1.rkt | 27 ----- advent-of-code/2023/09/2.rkt | 26 ----- advent-of-code/2023/10/1.rkt | 83 --------------- advent-of-code/2023/10/2.rkt | 112 --------------------- advent-of-code/lib/obj.rkt | 32 ------ advent-of-code/lib/utils.rkt | 36 ------- codewars/6-kyu/pyramid-array/solution.rkt | 14 --- .../7-kyu/a-rule-of-divisibility-by-7/solution.rkt | 15 --- leetcode/1-two-sum/solution.rkt | 16 --- leetcode/20-valid-parentheses/solution.rkt | 33 ------ lib/obj.rkt | 32 ++++++ lib/utils.rkt | 36 +++++++ test junk/junk | 0 52 files changed, 1238 insertions(+), 1316 deletions(-) create mode 100644 .gitignore create mode 100644 01/1.rkt create mode 100644 01/2.rkt create mode 100644 02/1.rkt create mode 100644 02/2.rkt create mode 100644 03/1.rkt create mode 100644 03/2.rkt create mode 100644 04/1.rkt create mode 100644 04/2.rkt create mode 100755 05/1.rkt create mode 100755 05/2.rkt create mode 100644 06/1.rkt create mode 100644 06/2.rkt create mode 100644 07/1.rkt create mode 100644 07/2.rkt create mode 100644 08/1.rkt create mode 100644 08/2.rkt create mode 100644 09/1.rkt create mode 100644 09/2.rkt create mode 100644 10/1.rkt create mode 100644 10/2.rkt delete mode 100644 advent-of-code/2023/.gitignore delete mode 100644 advent-of-code/2023/01/1.rkt delete mode 100644 advent-of-code/2023/01/2.rkt delete mode 100644 advent-of-code/2023/02/1.rkt delete mode 100644 advent-of-code/2023/02/2.rkt delete mode 100644 advent-of-code/2023/03/1.rkt delete mode 100644 advent-of-code/2023/03/2.rkt delete mode 100644 advent-of-code/2023/04/1.rkt delete mode 100644 advent-of-code/2023/04/2.rkt delete mode 100755 advent-of-code/2023/05/1.rkt delete mode 100755 advent-of-code/2023/05/2.rkt delete mode 100644 advent-of-code/2023/06/1.rkt delete mode 100644 advent-of-code/2023/06/2.rkt delete mode 100644 advent-of-code/2023/07/1.rkt delete mode 100644 advent-of-code/2023/07/2.rkt delete mode 100644 advent-of-code/2023/08/1.rkt delete mode 100644 advent-of-code/2023/08/2.rkt delete mode 100644 advent-of-code/2023/09/1.rkt delete mode 100644 advent-of-code/2023/09/2.rkt delete mode 100644 advent-of-code/2023/10/1.rkt delete mode 100644 advent-of-code/2023/10/2.rkt delete mode 100644 advent-of-code/lib/obj.rkt delete mode 100644 advent-of-code/lib/utils.rkt delete mode 100644 codewars/6-kyu/pyramid-array/solution.rkt delete mode 100644 codewars/7-kyu/a-rule-of-divisibility-by-7/solution.rkt delete mode 100644 leetcode/1-two-sum/solution.rkt delete mode 100644 leetcode/20-valid-parentheses/solution.rkt create mode 100644 lib/obj.rkt create mode 100644 lib/utils.rkt delete mode 100644 test junk/junk diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f9177e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +input diff --git a/01/1.rkt b/01/1.rkt new file mode 100644 index 0000000..82c109b --- /dev/null +++ b/01/1.rkt @@ -0,0 +1,16 @@ +#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/01/2.rkt b/01/2.rkt new file mode 100644 index 0000000..1f43996 --- /dev/null +++ b/01/2.rkt @@ -0,0 +1,30 @@ +#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/02/1.rkt b/02/1.rkt new file mode 100644 index 0000000..3ccd4ad --- /dev/null +++ b/02/1.rkt @@ -0,0 +1,52 @@ +#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/02/2.rkt b/02/2.rkt new file mode 100644 index 0000000..0d680ac --- /dev/null +++ b/02/2.rkt @@ -0,0 +1,44 @@ +#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/03/1.rkt b/03/1.rkt new file mode 100644 index 0000000..55a4281 --- /dev/null +++ b/03/1.rkt @@ -0,0 +1,84 @@ +#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/03/2.rkt b/03/2.rkt new file mode 100644 index 0000000..238ed2c --- /dev/null +++ b/03/2.rkt @@ -0,0 +1,102 @@ +#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/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 diff --git a/05/1.rkt b/05/1.rkt new file mode 100755 index 0000000..352e10c --- /dev/null +++ b/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/05/2.rkt b/05/2.rkt new file mode 100755 index 0000000..8e39c40 --- /dev/null +++ b/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) (λ (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/06/1.rkt b/06/1.rkt new file mode 100644 index 0000000..5496476 --- /dev/null +++ b/06/1.rkt @@ -0,0 +1,32 @@ +#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/06/2.rkt b/06/2.rkt new file mode 100644 index 0000000..2d666ed --- /dev/null +++ b/06/2.rkt @@ -0,0 +1,29 @@ +#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/07/1.rkt b/07/1.rkt new file mode 100644 index 0000000..286a0e8 --- /dev/null +++ b/07/1.rkt @@ -0,0 +1,80 @@ +#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-typelist hand1))) + (define h2 (map card-number (string->list hand2))) + (hand-typenumber (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-typelist hand1))) + (define h2 (map card-number (string->list hand2))) + (hand-typelist (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/08/2.rkt b/08/2.rkt new file mode 100644 index 0000000..a56d874 --- /dev/null +++ b/08/2.rkt @@ -0,0 +1,60 @@ +#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/09/1.rkt b/09/1.rkt new file mode 100644 index 0000000..6623096 --- /dev/null +++ b/09/1.rkt @@ -0,0 +1,27 @@ +#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/09/2.rkt b/09/2.rkt new file mode 100644 index 0000000..5c25482 --- /dev/null +++ b/09/2.rkt @@ -0,0 +1,26 @@ +#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/10/1.rkt b/10/1.rkt new file mode 100644 index 0000000..3d9801c --- /dev/null +++ b/10/1.rkt @@ -0,0 +1,83 @@ +#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/10/2.rkt b/10/2.rkt new file mode 100644 index 0000000..0d9c5a6 --- /dev/null +++ b/10/2.rkt @@ -0,0 +1,112 @@ +#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/README.md b/README.md index 83d6336..f23289c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# Practice +# Advent of Code 2023 in Racket -This code repository is the records of my solutions to problems on websites such as Advent of Code and CodeWars. Many of the problems are at the beginner level, so this code repository may have limited utility for others. +My solutions of [Advent of Code 2023](https://adventofcode.com/2023) in [Racket](https://racket-lang.org/). 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-typelist hand1))) - (define h2 (map card-number (string->list hand2))) - (hand-typenumber (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-typelist hand1))) - (define h2 (map card-number (string->list hand2))) - (hand-typelist (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)))))) diff --git a/codewars/6-kyu/pyramid-array/solution.rkt b/codewars/6-kyu/pyramid-array/solution.rkt deleted file mode 100644 index 0d6a00b..0000000 --- a/codewars/6-kyu/pyramid-array/solution.rkt +++ /dev/null @@ -1,14 +0,0 @@ -#lang racket - -;; https://www.codewars.com/kata/515f51d438015969f7000013 - -(provide pyramid) - -(define (pyramid n) - (define (loop ret level cur) - (define next (cons 1 cur)) - (if (= level n) - (reverse ret) - (loop (cons next ret) (+ level 1) next))) - (loop '() 0 '())) - diff --git a/codewars/7-kyu/a-rule-of-divisibility-by-7/solution.rkt b/codewars/7-kyu/a-rule-of-divisibility-by-7/solution.rkt deleted file mode 100644 index 6859107..0000000 --- a/codewars/7-kyu/a-rule-of-divisibility-by-7/solution.rkt +++ /dev/null @@ -1,15 +0,0 @@ -#lang racket - -;; https://www.codewars.com/kata/55e6f5e58f7817808e00002e - -(provide seven) - -(define (seven m) - (define (impl cur steps) - (define x (quotient cur 10)) - (define y (modulo cur 10)) - (define next (- x (* 2 y))) - (if (< cur 100) - (cons cur steps) - (impl next (+ 1 steps)))) - (impl m 0)) diff --git a/leetcode/1-two-sum/solution.rkt b/leetcode/1-two-sum/solution.rkt deleted file mode 100644 index e155160..0000000 --- a/leetcode/1-two-sum/solution.rkt +++ /dev/null @@ -1,16 +0,0 @@ -#lang racket - -;; https://leetcode.com/problems/two-sum/description/ - -(define/contract (two-sum nums target) - (-> (listof exact-integer?) exact-integer? (listof exact-integer?)) - (define h (make-hash)) - (define (loop nums index) - (define n (car nums)) - (define diff (- target n)) - (if (hash-has-key? h diff) - (list index (hash-ref h diff)) - (let () - (hash-set! h n index) - (loop (cdr nums) (+ 1 index))))) - (loop nums 0)) diff --git a/leetcode/20-valid-parentheses/solution.rkt b/leetcode/20-valid-parentheses/solution.rkt deleted file mode 100644 index 559b90c..0000000 --- a/leetcode/20-valid-parentheses/solution.rkt +++ /dev/null @@ -1,33 +0,0 @@ -#lang racket - -;; https://leetcode.com/problems/valid-parentheses/ - -(define (is-left-paren c) - (or (eq? c #\u28) - (eq? c #\[) - (eq? c #\{))) - -(define (right-paren c) - (cond ((eq? c #\u28) #\u29) - ((eq? c #\[) #\]) - ((eq? c #\{) #\}))) - -(define/contract (is-valid s) - (-> string? boolean?) - (define (loop s stack) - (if (= 0 (string-length s)) - (null? stack) - (let () - (define c (string-ref s 0)) - (define remain (substring s 1)) - (if (is-left-paren c) - (loop remain (cons c stack)) - (if (null? stack) - #f - (let () - (define stack-top (car stack)) - (if (eq? c (right-paren stack-top)) - (loop remain (cdr stack)) - #f))))))) - (loop s '())) - diff --git a/lib/obj.rkt b/lib/obj.rkt new file mode 100644 index 0000000..8ffc401 --- /dev/null +++ b/lib/obj.rkt @@ -0,0 +1,32 @@ +#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/lib/utils.rkt b/lib/utils.rkt new file mode 100644 index 0000000..2ce8a51 --- /dev/null +++ b/lib/utils.rkt @@ -0,0 +1,36 @@ +#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)))))) diff --git a/test junk/junk b/test junk/junk deleted file mode 100644 index e69de29..0000000 -- cgit v1.0