Using the list comprehension (for) along with a helper function (index) (def y (list "#####" "#...O" "#.#.#" "I.#.#" "#...#" "#####"))
(defn index [s] (map #(vector %1 %2) s (range))) (defn index-maze [maze-str] (reduce conj {} (for [r (index maze-str) c (index (first r))] {[(second r) (second c)] (first c)}))) (index-maze y) The index function takes a sequence and returns a sequence of vectors with the value and the index. (index [:a :b :c]) => ([:a 0] [:b 1] [:c 2]) A similar function exists in the clojure contrib seq-utils: http://richhickey.github.com/clojure-contrib/seq-utils-api.html#clojure.contrib.seq-utils/indexed The for call then uses this index function to create the index for rows and columns. Then use reduce to create a map with all the entries. On Aug 12, 6:49 am, johanmartinsson <martinsson.jo...@gmail.com> wrote: > Hello, > > I'm trying to find an elegant way of indexing a two-dimensional sequence > with the coordinates as keys. > > The input is something like. > > ( > > "#####" > > "#...O" > > "#.#.#" > > "I.#.#" > > "#...#" > > "#####") > > The midje test below indicates what kind of behaviour I'm looking for. I > can't come up with a solution that is elegant. I'm sure there are better > ways to do this, especially in such a sequence oriented language as clojure. > Would someone please give me a hand here? > > (defn- index-maze [str-maze] > > (let [width (count (first str-maze)) > > symbols (flatten (map seq str-maze)) > > total-size (count symbols)] > > (apply conj > > (for [position (range total-size) > > :let [row (quot position width) > > column (mod position width) > > sym (nth symbols position)]] > > {[row column] sym})))) > > (fact > > "makes a map with the coordinates as keys symbols as values" > > (index-maze '("#I#" > > "#O#")) => (in-any-order { > > [0 0] \# > > [0 1] \I > > [0 2] \# > > [1 0] \# > > [1 1] \O > > [1 2] \#})) > > Regards > > Johan Martinsson -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en