diff options
| author | Mistivia <i@mistivia.com> | 2024-02-25 20:11:54 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-02-25 20:11:54 +0800 |
| commit | 515ecbf5a20a8e432a998b0a543bedcb1bd64cf4 (patch) | |
| tree | 6353c603a8cf0276553f420205f8d1c730a318ce /advent-of-code/2023/07 | |
| parent | e191b610c11326b587cf0b01fd6fc37b8d07bb19 (diff) | |
reorg code
Diffstat (limited to 'advent-of-code/2023/07')
| -rw-r--r-- | advent-of-code/2023/07/1.rkt | 80 | ||||
| -rw-r--r-- | advent-of-code/2023/07/2.rkt | 87 |
2 files changed, 0 insertions, 167 deletions
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) |
