-
Notifications
You must be signed in to change notification settings - Fork 0
/
day-8.clj
69 lines (59 loc) · 1.69 KB
/
day-8.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
67
68
69
(ns day-8 (:require [hashp.core]))
(def parse-int #(Integer/parseInt %))
(defn parse [instruction]
(->> (clojure.string/split instruction #" ")
((fn [[instr offset]]
{:instr (keyword instr)
:offset (parse-int offset)}))))
(defn next-i [i {:keys [instr offset]}]
(case instr
:nop (inc i)
:acc (inc i)
:jmp (+ i offset)))
(defn next-acc [acc {:keys [instr offset]}]
(case instr
:acc (+ acc offset)
acc))
(defn execute [i acc visited? instructions]
(cond
(visited? i) {:nonterm acc}
(>= i (count instructions)) {:term acc}
:else (let [instr (instructions i)]
(recur (next-i i instr)
(next-acc acc instr)
(conj visited? i)
instructions))))
(defn puzzle1 [program]
(->> (clojure.string/split-lines program)
(map parse)
(vec)
(execute 0 0 #{})
(:nonterm)))
(defn mangle-nop [instructions]
(for [[i {:keys [instr offset]}] (map-indexed vector instructions)
:when (= :nop instr)]
(assoc instructions i {:instr :jmp :offset offset})))
(defn mangle-jmp [instructions]
(for [[i {:keys [instr offset]}] (map-indexed vector instructions)
:when (= :jmp instr)]
(assoc instructions i {:instr :nop :offset offset})))
(defn puzzle2 [program]
(->> (clojure.string/split-lines program)
(map parse)
(vec)
((juxt mangle-nop mangle-jmp))
(apply concat)
(map (partial execute 0 0 #{}))
(some :term)))
(comment (def input (->> (slurp "input8.txt"))))
(comment (def input "nop +0
acc +1
jmp +4
acc +3
jmp -3
acc -99
acc +1
jmp -4
acc +6"))
(comment (time (puzzle1 input)))
(comment (time (puzzle2 input)))