Я решаю задачу поиска сокровищ и хочу изменить значение векторных данных. Итак, как я могу это сделать?
Я пробовал так много вещей, но ничего не работало для меня. Я пробовал assoc, update, assoc-in, update-in и все такое.
(println (update-in data [row col] "+"))
(def data1 (-> data (assoc-in [0 0] \+)))
(println data1)
Итак, мой вектор такой
["---#--###----"
"---#---#-#---"
"-#-####---##-"
"-#------#----"
"-############"
"------------@"]
и я хочу перемен -
с +
.
Вы трое должны объединиться: stackoverflow.com/questions/56333082/…stackoverflow.com/questions/56334248/…stackoverflow.com/questions/56334579/…
Удивительно, как много их... Я мог бы написать блог об основах.
Строки и векторы неизменяемы в 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)
Возможный дубликат Обработка файла посимвольно в Clojure