處理一些2015 AoC問題以學習clojure ...下面是第40次迭代的足夠快,但在此之後爬得很快。我和其他幾個人的解決辦法相比,我不明白爲什麼這麼慢。我試圖用反覆認爲它和循環一樣高效(並避免堆棧消耗)。有一件事我沒有100%清楚,就是在使用復發和使用循環復發之間存在顯着差異。我對它進行了兩種測試,沒有看到任何區別。clojure「look-and say」序列
(def data "3113322113")
(defn encode-string [data results count]
(let [prev (first data)
curr (second data)]
(cond (empty? data) results
(not= prev curr)
(recur (rest data) (str results count prev) 1)
:else (recur (rest data) results (inc count)))))
(count
(nth (iterate #(encode-string % "" 1) data) 40 #_50))
一個解決方案,我爲基準對布魯斯Hauman的,這是非常好的示例:
(defn count-encode [x]
(apply str
(mapcat
(juxt count first)
(partition-by identity x))))
我在我的解決方案意識到我正在反覆迭代非常大的字符串,但我不知道看看布魯斯的速度如此之快,因爲雖然他沒有明確地迭代,但分區可能在幕後迭代。