使用序列中的输入值进行 clojure 映射转换

问题描述 投票:0回答:1

需要帮助使用函数从地图转换数据

(defn transform-map-1 [past-step dir]
  (cond (= dir "v")
        (list (first (first past-step))
              (+ -1 (first (first past-step))))
        (= dir "^")
        (list (first (first past-step))
              (+ 1 (first (first past-step))))
        (= dir ">")
        (list (+ 1 (first (first past-step)))
              (first (first past-step)))
        (= dir "<")
        (list (+ -1 (first (first past-step)))
              (first (first past-step)))))

此函数采用 x,y 格式的两个输入坐标作为过去的步骤,并使用上下左右的 dir 来给出更新坐标

我想做的有一系列方向,并为每个目录返回更新的坐标

输入刺“^>v<" , output should be ((0,1) (1,1) (1,0) (0,0)

我们从坐标 (0.0) 开始,第一个转换的输出成为第二个字符的输入

我能得到的最好的结果是,但它给了我一个错误

(map (transform-map-1 ['(0, 0)] %1)(char-array string-test))
clojure
1个回答
0
投票

您已接近实施。

我看到的问题是:

  • 调用

    %1
    中的
    transform-map-1
    仅在使用以下格式的 匿名函数 中有效:
    #( ... use %1 %2 %3 etc inside)

  • 您的函数期望方向是字符串,但映射字符串将导致对字符序列进行迭代,这不是您的函数所期望的。一个技巧是将单个字符串转换为多个 1 字符字符串是

    (map str your-string)
    ,它使用
    str
    Char
    转换为
    String

通过这两项更改,对函数的调用将如下所示:

(def test-string "^>v<")

(map #(transform-map-1 ['(0, 0)] %1) (map str test-string))
;; returns: ((0 1) (1 0) (0 -1) (-1 0))

您稍后可以学习其他一些可以帮助您解决难题的东西:

  • 解构将帮助您分解各个组件中的参数并给它们命名,以便更容易处理
  • 风格:大多数 Clojure 开发者会将一对坐标表示为 2 大小的向量,可以用方括号书写:
    [x y]
  • Reduce:如果您有一个执行单步的函数,您可以reduce包含运动的集合并获得最终位置。通过reductions,如果您需要完整的路径,您还可以获得所有中间步骤。
© www.soinside.com 2019 - 2024. All rights reserved.