Skip to content

Commit f5e988b

Browse files
committed
2024, dag 19 med typehint
1 parent 1971277 commit f5e988b

File tree

1 file changed

+56
-2
lines changed

1 file changed

+56
-2
lines changed

notebooks/y2024/d19.clj

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
^:kindly/hide-code
12
(ns y2024.d19
23
(:require
34
[advent-of-code-clj.input :as input]))
@@ -33,7 +34,7 @@ bbrgwb")
3334
; mønstrene, og resten av duken matcher et mønster. Altså en rekursiv
3435
; algritme:
3536

36-
(defn valid-pattern? [patterns towel]
37+
(defn valid-pattern? [patterns ^String towel]
3738
(if (= "" towel)
3839
true
3940
(some
@@ -78,7 +79,7 @@ bbrgwb")
7879

7980
(def valid-patterns
8081
(memoize
81-
(fn [patterns towel]
82+
(fn [patterns ^String towel]
8283
(if (= "" towel)
8384
1
8485
(transduce (map (fn [p]
@@ -101,3 +102,56 @@ bbrgwb")
101102
(comment
102103
(time
103104
(part-2 (input/get-input 2024 19))))
105+
106+
; ## Del 1 og 2 med typehints
107+
108+
; Det viser seg at algoritmene egentlig ikke er så trege! Algoritmen bruker mye tid på reflection fordi
109+
; vi kaller `.startsWith` på en variabel som kompilatoren ikke kan garantere at alltid er en `String`.
110+
111+
; Se [dokumentasjon om type hinting](https://clojure.org/reference/java_interop#typehints)
112+
113+
; Når kjører koden med reflection-warning finner vi de to stedene som er særlig utsatt fordi de er i en
114+
; "hot loop":
115+
116+
^:kind/hiccup
117+
[:pre "(set! *warn-on-reflection* true)"]
118+
119+
^:kind/hiccup
120+
[:pre "Reflection warning,... - call to method startsWith can't be resolved (target class is unknown)."]
121+
122+
; Hvis vi lager nye type-hintede versjoner av `valid-pattern`-algoritmene kuttes kjøretiden ned til et mer
123+
; akseptabelt nivå (~80ms og ~300ms):
124+
125+
(defn valid-pattern?-hinted [patterns ^String towel]
126+
(if (= "" towel)
127+
true
128+
(some
129+
(fn [p]
130+
(when (.startsWith towel p)
131+
(valid-pattern?-hinted patterns (subs towel (count p) (count towel)))))
132+
patterns)))
133+
134+
(def valid-patterns-hinted
135+
(memoize
136+
(fn [patterns ^String towel]
137+
(if (= "" towel)
138+
1
139+
(transduce (map (fn [p]
140+
(if (.startsWith towel p)
141+
(valid-patterns-hinted patterns (subs towel (count p) (count towel)))
142+
0)))
143+
+ patterns)))))
144+
145+
(defn part-1-hinted [input]
146+
(let [[patterns towels] (parse input)]
147+
(count (keep #(valid-pattern?-hinted patterns %)
148+
towels))))
149+
150+
(delay (part-1-hinted (input/get-input 2024 19)))
151+
152+
(defn part-2-hinted [input]
153+
(let [[patterns towels] (parse input)]
154+
(transduce (map #(valid-patterns-hinted patterns %))
155+
+ towels)))
156+
157+
(delay (part-2-hinted (input/get-input 2024 19)))

0 commit comments

Comments
 (0)