我正在使用Advent of Code 2018 Day 6,在其中我需要存储位置的2D地图,然后根据其坐标进行映射+过滤。我正在考虑将位置存储在2D向量中,以便向量的索引表示其坐标,因为这是我在命令式语言中所做的。
但是,大多数序列操作只将元素传递给函数,因此无法从传递给函数的函数访问元素的索引。 map
。是的,map-indexed
存在,但是每次我对数据进行操作时,都有两个嵌套的调用并不很干净。
我看到一些建议,将索引或本例中的(x,y)坐标对与元素存储在向量[[[0, 0] "loc1"] [[0, 1] "loc2"] ...]
中。这将比使用嵌套的map-indexed
调用更好,还是有一种更干净,更惯用的替代方法来存储2D数据并使用其索引访问数据?
答案 0 :(得分:1)
您可以使用matrices:
(require '[clojure.core.matrix :as m])
(def A (m/matrix [[1 4 56] [5 2 8] [35 1 677]]))
(m/emap-indexed (fn [[x y] v] (prn [x y v])) A)
答案 1 :(得分:1)
对于此特定问题,问题的2D本质并不重要。因此,我建议将这些点存储为地图的矢量,如下所示:
{:x x
:y y
:nearest-point :A}
和类似的位置:
{:x x
:y y
:name :A}
例如。对于每个点,请在位置上循环并保存最接近的位置。然后,扔掉无限个:
(remove #(is-it-infinite? %) points)
然后
(group-by :nearest-point points)
和count
每组的大小以得出最终答案。