
Untitled
By: a guest on
May 1st, 2012 | syntax:
None | size: 0.82 KB | hits: 19 | expires: Never
;; t2ru's solution to Word Chains
;; https://4clojure.com/problem/82
(letfn [(diff1? [xs ys]
(let [xs (seq xs) [x & rxs] xs ys (seq ys) [y & rys] ys]
(cond (and (nil? xs) (nil? ys)) false
(= x y) (diff1? rxs rys)
true (or (= rxs rys) (= rxs ys) (= xs rys)))))
(candidates [difflist words]
(map #(vector (conj difflist %) (disj words %))
(if (empty? difflist) words
(filter #(diff1? % (first difflist)) words))))
(chains? [difflist words]
(if (empty? words) true
(let [next-cands (candidates difflist words)]
(if (empty? next-cands) false
(some #(apply chains? %) next-cands)))))]
(fn word-chains? [words]
(boolean (chains? nil words))))