diff options
| author | Mistivia <i@mistivia.com> | 2024-02-16 11:07:30 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-02-16 11:07:30 +0800 |
| commit | e1a5304af2c35ff83819546953309764e24656d4 (patch) | |
| tree | 8992bf2a489e4dc7f6ff3b9661aae5a50d08cab9 /advent-of-code/2023/07/part1.rkt | |
| parent | a19a1b970e5dd6983be8660ef6e0f5929fb5a149 (diff) | |
refactor from c to racket
Diffstat (limited to 'advent-of-code/2023/07/part1.rkt')
| -rw-r--r-- | advent-of-code/2023/07/part1.rkt | 80 |
1 files changed, 0 insertions, 80 deletions
diff --git a/advent-of-code/2023/07/part1.rkt b/advent-of-code/2023/07/part1.rkt deleted file mode 100644 index a22571d..0000000 --- a/advent-of-code/2023/07/part1.rkt +++ /dev/null @@ -1,80 +0,0 @@ -#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) |
