diff options
| author | Mistivia <i@mistivia.com> | 2024-02-12 14:53:06 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-02-12 14:53:06 +0800 |
| commit | cee6b1449ea6e2f75a3b2ddc860b5137f885a895 (patch) | |
| tree | f2f9282e58fd5fed4eb4a52a43b7ae57fc90616f /advent-of-code/2023/07/part1.rkt | |
| parent | 989114a87a416f86cb62e1de98ed78ddbab60bad (diff) | |
solve advent of code 2023 day 07 part 1
Diffstat (limited to 'advent-of-code/2023/07/part1.rkt')
| -rw-r--r-- | advent-of-code/2023/07/part1.rkt | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/advent-of-code/2023/07/part1.rkt b/advent-of-code/2023/07/part1.rkt new file mode 100644 index 0000000..a22571d --- /dev/null +++ b/advent-of-code/2023/07/part1.rkt @@ -0,0 +1,80 @@ +#lang racket + +(define input + (with-input-from-file "input" + (lambda () + (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 (lambda (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) |
