Как обновить значение 2D вектора по определенному индексу в clojure? - PullRequest
0 голосов
/ 28 мая 2019

Я решаю проблему с поиском сокровищ и хочу изменить значение моих векторных данных.Итак, как я могу это сделать?

Я пробовал так много вещей, но у меня ничего не получалось.Я пробовал ассоциировать, обновлять, ассоциировать, обновлять и все.

(println (update-in data [row col] "+"))

(def data1 (-> data (assoc-in [0 0] \+)))

(println data1)

Итак, мой вектор такой:

["---#--###----" 
 "---#---#-#---" 
 "-#-####---##-" 
 "-#------#----" 
 "-############" 
 "------------@"]

, и я хочу изменить - на +.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Вам нужно будет уточнить структуру данных, чтобы assoc-in работал с ней. Такие функции, как assoc-in и update-in, работают с вложенными структурами данных ключ-значение, такими как карты и векторы. Я бы порекомендовал функцию приема, как показано ниже:

(defn create-maze [m]
  (into [] (map vec) m))

Это дает вам вектор векторов, схожий по природе с двумерным массивом. Затем вы можете предоставить вспомогательную функцию для вывода лабиринта на экран:

(defn print-maze [m]
  (doseq [line m]
    (->> line (apply str) println)))

Теперь, когда у вас есть способ вернуться назад и вперед из строкового представления, теперь вы можете использовать assoc-in в промежуточной форме для создания лабиринтов с измененным содержимым:

(->
  (create-maze data)
  (assoc-in [0 0] \+)
  (assoc-in [3 4] \+)
  print-maze)
0 голосов
/ 28 мая 2019

Строки и векторы неизменны в Clojure, поэтому вы можете создать только копию объекта с обновленным содержимым.

Кроме того, вы можете вызывать assoc или update только для встроенных структур данных Clojure. Вам нужно сначала преобразовать строку в вектор. После обновления вы можете преобразовать его обратно в строку, вызвав (apply str ...).

(defn to-plus [data x y]
  (update data y (fn [row] (apply str (assoc (vec row) x \+)))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...