diff options
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) |
