63 lines
2.3 KiB
Racket
63 lines
2.3 KiB
Racket
#lang racket
|
|
|
|
(module+ test
|
|
(require rackunit))
|
|
|
|
(define (read-input filename)
|
|
(with-input-from-file filename
|
|
(lambda ()
|
|
(for/list ([line (in-lines)])
|
|
(parse-expression line)))))
|
|
|
|
(define (parse-expression str)
|
|
(read (open-input-string (string-append "(" str ")"))))
|
|
|
|
(define (eval-left lst)
|
|
(match lst
|
|
[(? number? x) x]
|
|
[(list x) x]
|
|
[(list-rest a '+ b r)
|
|
(eval-left (cons (+ (eval-left a) (eval-left b)) r))]
|
|
[(list-rest a '* b r)
|
|
(eval-left (cons (* (eval-left a) (eval-left b)) r))]))
|
|
|
|
(define (part1 filename)
|
|
(define input (read-input filename))
|
|
(apply + (map eval-left input)))
|
|
|
|
(module+ test
|
|
(check-equal? (eval-left (parse-expression "1 + 2 * 3 + 4 * 5 + 6")) 71)
|
|
(check-equal? (eval-left (parse-expression "1 + (2 * 3) + (4 * (5 + 6))")) 51)
|
|
(check-equal? (eval-left (parse-expression "2 * 3 + (4 * 5)")) 26)
|
|
(check-equal? (eval-left (parse-expression "5 + (8 * 3 + 9 + 3 * 4 * 3)")) 437)
|
|
(check-equal? (eval-left (parse-expression "5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))")) 12240)
|
|
(check-equal? (eval-left (parse-expression "((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2")) 13632))
|
|
|
|
(module+ main
|
|
(displayln (part1 "input")))
|
|
|
|
(define (eval-left-priority lst)
|
|
(match lst
|
|
[(? number? x) x]
|
|
[(list x) x]
|
|
[(list-rest a '* b '+ c r)
|
|
(eval-left-priority (list* a '* (+ (eval-left-priority b) (eval-left-priority c)) r))]
|
|
[(list-rest a '+ b r)
|
|
(eval-left-priority (cons (+ (eval-left-priority a) (eval-left-priority b)) r))]
|
|
[(list-rest a '* b r)
|
|
(eval-left-priority (cons (* (eval-left-priority a) (eval-left-priority b)) r))]))
|
|
|
|
(module+ test
|
|
(check-equal? (eval-left-priority (parse-expression "1 + 2 * 3 + 4 * 5 + 6")) 231)
|
|
(check-equal? (eval-left-priority (parse-expression "1 + (2 * 3) + (4 * (5 + 6))")) 51)
|
|
(check-equal? (eval-left-priority (parse-expression "2 * 3 + (4 * 5)")) 46)
|
|
(check-equal? (eval-left-priority (parse-expression "5 + (8 * 3 + 9 + 3 * 4 * 3)")) 1445)
|
|
(check-equal? (eval-left-priority (parse-expression "5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))")) 669060)
|
|
(check-equal? (eval-left-priority (parse-expression "((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2")) 23340))
|
|
|
|
(define (part2 filename)
|
|
(define input (read-input filename))
|
|
(apply + (map eval-left-priority input)))
|
|
|
|
(module+ main
|
|
(displayln (part2 "input")))
|