You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure技术问询:如何从ASCII地图数组中获取字符坐标

在Clojure中查找ASCII地图里指定字符的坐标

嘿,作为Clojure初学者遇到这个问题太正常了,咱们一步步来搞定它!你的需求是从字符串数组构成的ASCII地图里,找到某个字符的(行,列)坐标——看你例子里P对应(2,3),应该是用1-based的计数方式(行和列都从1开始算),那咱们就按这个逻辑来实现。

核心解决方案

先直接给你能用的函数,之后再拆解细节帮你理解:

(defn find-char-coords [map-array target-char]
  (for [[row-idx row-str] (map-indexed vector map-array)
        [col-idx char] (map-indexed vector row-str)
        :when (= char target-char)]
    [(inc row-idx) (inc col-idx)]))

函数细节拆解(适合初学者)

  1. 遍历行并记录索引:(map-indexed vector map-array) 会把地图数组里的每一行字符串和它的索引(从0开始)配对,比如你的地图数组会变成类似 [[0 "+-----+"] [1 "|XPX X|"] ...] 的结构。
  2. 遍历每行字符并记录列索引:嵌套的(map-indexed vector row-str) 会把当前行的每个字符和它的列索引(同样从0开始)配对,比如 "|XPX X|" 会变成 [[0 \|] [1 \X] [2 \P] ...]。
  3. 过滤目标字符::when (= char target-char) 只保留和目标字符完全匹配的项。
  4. 转成1-based坐标:(inc row-idx) 和 (inc col-idx) 把0起始的索引转换成你需要的1起始计数(如果习惯用0-based坐标,直接去掉inc就行)。

测试你的例子

把你的地图代入函数试试:

(def my-map ["+-----+" "|XPX X|" "|X   X|" "|X XX|" "|X   X|" "|XX DX|" "+-----+"])

; 注意Clojure里字符字面量要加\,比如\P而不是"P"
(find-char-coords my-map \P)
;; 输出:([2 3])

额外实用小技巧

  • 如果地图里有多个相同字符,这个函数会返回所有匹配的坐标列表,比如查找\X会得到一堆结果;
  • 如果你只需要第一个匹配的坐标,用first包裹就行:(first (find-char-coords my-map \P));
  • 别混淆字符和字符串:Clojure里\P是字符类型,"P"是字符串类型,行字符串里的每个元素是字符,所以一定要用\开头的字符字面量来匹配。

内容的提问来源于stack exchange,提问作者David Furnam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:54:06