This works for all cases were I transform the matrix using map, but I also transform it using reverse and assoc.
On Thursday, May 8, 2014 8:02:03 PM UTC-4, Jason Ozias wrote: > > Take a look at mapv. If you aren't dealing with lazy sequence, it'll map > the function across and convert the output to a vector. > > On Thursday, May 8, 2014 7:28:47 PM UTC-4, Joseph Rollins wrote: >> >> I am confused about the best way to assure that I am dealing with a >> vector when dealing with core library functions that often return seq where >> I then lose my ability to access it using associative accesses (get-in >> specifically). >> >> My particular use case is as follows: >> >> I am modeling a matrix as nested vectors >> >> [[0 0 0] [0 1 1] [0 1 1]] >> >> represents >> >> 0 0 0 >> 0 1 1 >> 0 1 1 >> >> I know matrix libraries exist, but for the sake of learning am rolling my >> own functionality. I have several functions that operate on this: >> >> (defn transpose [piece] >> (apply mapv vector piece)) >> >> (defn translate-block >> ([mm] (let [one? #(if (= 1 %) true false)] >> (translate-block mm one?))) >> ([mm f] (map #(map f %) mm))) >> >> (defn rotate-left [b] >> (->> b >> transpose >> reverse)) >> >> The problem I am running into is that these do not output nested vectors, >> but nested seqs (due to all of the map operations). I am using these >> matrices to program Tetris, and I am writing a function that takes a Tetris >> block, a Tetris board (both represented as matrices) and a position of the >> block inside the board. The function is supposed to determine if the >> placement of the block is valid (not overlapping already placed blocks: >> >> (defn is-valid? >> "Determine if a game state is valid (is current piece place-able)." >> [{board :board {:keys [piece pos]} :piece}] >> (let [[x y] pos >> coords (for [rows (range (count piece)) >> cols (range (count (first piece)))] >> [[rows cols] [(+ y rows) (+ x cols)]])] >> (map (fn [[c cc]] >> (and (get-in board cc) (get-in piece c))) >> coords))) >> >> The matrices hold true and false values for if occupied. When testing >> this function I realized get-in was just returning nil because it wouldnt >> get in a seq (non-associative). What is the best way to assure that when I >> need associative guarantees that they haven't been thrown away through >> previous transformations of the board or piece matrices? >> >> The two choices I see are making sure every function that operates on the >> matrices explicitly outputs nested vectors again, or transforming the input >> to functions that need the guarantees to nested vectors explicitly. Am I >> missing something here, or, if not, what is the idiomatic way to solve this >> problem? >> >> Thanks >> >> -Joseph >> > -- 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.