Как обновить значение 2D-вектора по определенному индексу в clojure?

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

Я пробовал так много вещей, но ничего не работало для меня. Я пробовал assoc, update, assoc-in, update-in и все такое.

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

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

(println data1)

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

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

и я хочу перемен - с +.

Возможный дубликат Обработка файла посимвольно в Clojure

Alan Thompson 28.05.2019 05:32

Вы трое должны объединиться: stackoverflow.com/questions/56333082/…stackoverflow.com/questions/56334248/…stackoverflow.com/questions/56334579/…

cfrick 28.05.2019 09:36

Удивительно, как много их... Я мог бы написать блог об основах.

pete23 30.05.2019 21:49
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
3
463
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

(defn to-plus [data x y]
  (update data y (fn [row] (apply str (assoc (vec row) x \+)))))
Ответ принят как подходящий

Вам придется уточнить структуру данных, чтобы 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)

Другие вопросы по теме