aboutsummaryrefslogtreecommitdiff
path: root/racket/aoc2019/day-02/day-02.rkt
blob: 56019e80a4818ab44e65bc8661088bd031b95dfb (plain)
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
#lang racket

(require advent-of-code
         threading)

(define initial-opcodes
  (parameterize ([current-readtable (make-readtable #f #\, #\space #f)])
    (port->list read (open-aoc-input (find-session) 2019 2 #:cache #true))))

;; part 1
(define (edit-opcode ocs oc-1 oc-2)
  (~> ocs (list-set 1 oc-1) (list-set 2 oc-2)))

(define (run-intcode ocs)
  (for/fold ([ocs ocs] #:result (car ocs))
            ([pointer (in-range 0 (length initial-opcodes) 4)] #:break (= 99 (list-ref ocs pointer)))
    (define op
      (match (list-ref ocs pointer)
        [1 +]
        [2 *]))
    (list-set ocs
              (list-ref ocs (+ 3 pointer))
              (op (list-ref ocs (list-ref ocs (+ 1 pointer)))
                  (list-ref ocs (list-ref ocs (+ 2 pointer)))))))

(~> initial-opcodes (edit-opcode 12 2) run-intcode)

;; part 2
(for*/first ([noun (inclusive-range 0 99)]
             [verb (inclusive-range 0 99)]
             #:when (~> initial-opcodes (edit-opcode noun verb) run-intcode (= 19690720)))
  (+ (* 100 noun) verb))