Skip to content

Instantly share code, notes, and snippets.

@delexi
Created December 25, 2014 20:37
Show Gist options
  • Save delexi/5e29a9ab0bdecb6cdec1 to your computer and use it in GitHub Desktop.
Save delexi/5e29a9ab0bdecb6cdec1 to your computer and use it in GitHub Desktop.
;; 1. Unhandled java.lang.IllegalArgumentException
;; Don't know how to create ISeq from:
;; doublets.solver$doublets$doublets_rec__3564$fn__3569
;; RT.java: 505 clojure.lang.RT/seqFrom
;; RT.java: 486 clojure.lang.RT/seq
;; core.clj: 133 clojure.core/seq
;; core.clj: 2551 clojure.core/map/fn
;; LazySeq.java: 40 clojure.lang.LazySeq/sval
;; LazySeq.java: 49 clojure.lang.LazySeq/seq
;; RT.java: 484 clojure.lang.RT/seq
;; core.clj: 133 clojure.core/seq
;; core.clj: 2551 clojure.core/map/fn
;; LazySeq.java: 40 clojure.lang.LazySeq/sval
;; LazySeq.java: 49 clojure.lang.LazySeq/seq
;; RT.java: 484 clojure.lang.RT/seq
;; core.clj: 133 clojure.core/seq
;; core.clj: 624 clojure.core/apply
;; solver.clj: 21 doublets.solver/doublets/doublets-rec
;; solver.clj: 25 doublets.solver/doublets
;; REPL: 1 doublets.solver/eval3577
;; Compiler.java: 6703 clojure.lang.Compiler/eval
;; Compiler.java: 6666 clojure.lang.Compiler/eval
;; core.clj: 2927 clojure.core/eval
;; main.clj: 239 clojure.main/repl/read-eval-print/fn
;; main.clj: 239 clojure.main/repl/read-eval-print
;; main.clj: 257 clojure.main/repl/fn
;; main.clj: 257 clojure.main/repl
;; RestFn.java: 1096 clojure.lang.RestFn/invoke
;; interruptible_eval.clj: 56 clojure.tools.nrepl.middleware.interruptible-eval/evaluate/fn
;; AFn.java: 152 clojure.lang.AFn/applyToHelper
;; AFn.java: 144 clojure.lang.AFn/applyTo
;; core.clj: 624 clojure.core/apply
;; core.clj: 1862 clojure.core/with-bindings*
;; RestFn.java: 425 clojure.lang.RestFn/invoke
;; interruptible_eval.clj: 41 clojure.tools.nrepl.middleware.interruptible-eval/evaluate
;; interruptible_eval.clj: 171 clojure.tools.nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
;; core.clj: 2402 clojure.core/comp/fn
;; interruptible_eval.clj: 138 clojure.tools.nrepl.middleware.interruptible-eval/run-next/fn
;; AFn.java: 22 clojure.lang.AFn/run
;; ThreadPoolExecutor.java: 1145 java.util.concurrent.ThreadPoolExecutor/runWorker
;; ThreadPoolExecutor.java: 615 java.util.concurrent.ThreadPoolExecutor$Worker/run
;; Thread.java: 745 java.lang.Thread/run
(ns doublets.solver
(:require [clojure.java.io :as io]
[clojure.edn :as edn]
[clojure.set :as sets]))
(def words (-> "words.edn"
(io/resource)
(slurp)
(read-string)))
(defn doublets [word1 word2]
(letfn [(doublets-rec [from visited available to]
(cond
(= from to) visited
(empty? available) []
:else (let [neighbours (-> available
(map (fn [x] [x (diff from x)]))
(filter #(= (% 0) 1))
(map #(% 1)))]
(apply concat
(map
#(doublets-rec % (conj visited %)
(sets/difference available %) to)
neighbours)))))]
(doublets-rec word1 [] (into #{} words) word2)))
(defn diff [w1 w2]
"Positionally compares the given collections and returns the number of differing elements."
(+ (Math/abs (- (count w1) (count w2)))
(count (filter #(not (= (% 0) (% 1))) (map #(into [] %&) w1 w2)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment