/
day02.clj
66 lines (53 loc) · 1.52 KB
/
day02.clj
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
(ns advent-of-code-2019.day02
(:require [clojure.java.io :as io]
[clojure.string :as s]))
(set! *unchecked-math* :warn-on-boxed)
(set! *warn-on-reflection* true)
;; load data
(def program (mapv read-string
(-> (io/resource "day02.txt")
(slurp)
(s/split #","))))
;; program creator with initial data
(defn make-program
[noun verb]
(-> program
(assoc 1 noun)
(assoc 2 verb)))
;; execute opcode
(defn process
[f program ^long iter]
(assoc program (program (+ iter 3))
(f (program (program (inc iter)))
(program (program (+ iter 2))))))
(defn executor
([program] (executor program 0))
([program ^long iter]
(condp = (program iter)
1 (recur (process + program iter) (+ iter 4))
2 (recur (process * program iter) (+ iter 4))
99 program)))
(def executor-0 (comp first executor make-program))
(def part-1 (executor-0 12 2))
(set! *unchecked-math* true)
;; OBSERVED
;;
;; difference between consecutive nouns for given verb (any) is constant
;; verb is added to the difference
(def difference
(let [r-verb (int (rand 100))]
(->> (range 100)
(map #(executor-0 % r-verb))
(partition 2 1)
(map (partial apply -))
(distinct)
(first)
(-))))
;; => 460800
(def offset (executor-0 0 0))
;; => 797908
(def target 19690720)
(def target- (- target offset))
(def noun (quot target- difference))
(def verb (mod target- difference))
(def part-2 (+ verb (* 100 noun)))