๐Ÿ“ฆ Bogdanp / aoc2020

๐Ÿ“„ day18.rkt ยท 44 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#lang racket/base

(require racket/list
         racket/match
         racket/port)

(define (calc line [tbl (hasheq + 1 * 1)])
  (define e
    (read (open-input-string (format "(~a)" line))))
  (define (prec op)
    (hash-ref tbl op))
  (let loop ([e e] [nums null] [ops  null])
    (define (push-num e* num)
      (loop e* (cons num nums) ops))
    (define (push-op e* op)
      (cond
        [(null? ops) (loop e* nums (cons op ops))]
        [(< (prec (car ops)) (prec op)) (loop e* nums (cons op ops))]
        [else (loop e* (cons ((car ops) (cadr nums) (car nums)) (cddr nums)) (cons op (cdr ops)))]))
    (match e
      [(? null?)
       (for/fold ([nums nums] #:result (car nums))
                 ([op (in-list ops)])
         (cons (op (cadr nums) (car nums)) (cddr nums)))]
      [(cons (? list? sub-e) e*)
       (push-num e* (loop sub-e null null))]
      [(cons '+ e*) (push-op  e* +)]
      [(cons '* e*) (push-op  e* *)]
      [(cons  n e*) (push-num e* n)])))

(define lines
  (call-with-input-file "input18.txt" port->lines))

(=
 (apply + (for/list ([line (in-list lines)])
            (calc line)))
 11297104473091)

(=
 (apply + (let ([tbl (hasheq + 2 * 1)])
            (for/list ([line (in-list lines)])
              (calc line tbl))))
 185348874183674)