代码之家  ›  专栏  ›  技术社区  ›  rezwits

Clojure重序函数

  •  0
  • rezwits  · 技术社区  · 8 年前

    我必须承认,我还是个新手。我经常发现,如果我在Clojure文档中搜索,我会找到我要找的函数。;)

    但我对这件事很紧张,但也许我会走运。

    我有一个纸牌游戏。每个玩家手上有1-9张牌。

    这些牌一次从牌组顶部抽出一张牌放到他们手中。

    这样做的目的是将手中的每张卡12345678,并将订单更改为他们提供的新订单31487652。

    数据格式如下:

    (:hand player)
    
    [{:name : "Troll", :_id : 39485723},
    {:name : "Ranger", :_id : 87463293},
    {:name : "Archer", :_id : 78462721},
    {:name : "Orc", :_id : 12346732},
    {:name : "Orc", :_id : 13445130},
    {:name : "Spell", :_id : 23429900},
    {:name : "Dagger", :_id : 44573321}]
    

    我唯一的问题是,我可以用传统的编程语言来考虑这个问题,我的意思是简单,你只要把数据复制到另一个数组,哈哈,但我的意思是我们不喜欢clojure吗?。。。

    谢谢你的帮助/建议/回答。。。

    附录1

    (defn vec-order [n]
      (into [] (if (pos? n)
                 (conj (vec-order (quot n 10)) (mod n 10) )
                 [])))
    
    (defn new-index [index new-order] (.indexOf new-order (inc index)))
    
    (defn re-order [state side value]
      (println (get-in @state [side :hand]))
      (update @state [side :hand]
              (fn [hand]
                (->> hand
                     (map-indexed (fn [index card] [(new-index index (vec-order value)) card]))
                     (sort-by first)
                     (mapv second))))
      (println (get-in @state [side :hand])))
    

    这是我当前的代码,用于提取数据。有一个巨大的@状态,玩家站在一边。我使用:

    (println (get-in @state [side :hand]))
    

    谢谢你,一定要帮我走这么远。

    3 回复  |  直到 8 年前
        1
  •  3
  •   Piotrek Bzdyl    8 年前

    如果你有你所需要的元素顺序作为一个向量,你可以 sort-by 通过函数返回该向量中卡片的索引:

    (let [cards [1 2 3 4 5 6 7 8]
          my-order [3 1 4 8 7 6 5 2]]
      (sort-by #(.indexOf my-order %) cards))
    ;; => (3 1 4 8 7 6 5 2)
    
        2
  •  1
  •   dpassen    8 年前

    update 这将允许我们返回一个新的播放器,如果我们这样调用它的话,它的函数将应用到手上。

    (update player :hand (fn [hand] ... ))
    

    一旦我们有了这个基本结构,下一个能帮助我们的功能就是 map-indexed

    sort-by 索引,最后 mapv

    所以,最终的结构看起来像:

    (defn sort-hand [player new-order]
      (update
        player
        :hand
        (fn [hand]
         (->> hand 
              (map-indexed (fn [index card] [(new-index index new-order) card]))
              (sort-by first)
              (mapv second)))))
    

    为了让这一切顺利进行 new-order 向量像吗 [3 1 4 8 7 6 5 2]

    new-index ,

    .indexOf 这样地 (defn new-index [index new-order] (.indexOf new-order (inc index)))

        3
  •  0
  •   rezwits    8 年前

    (defn vec-order [n]
      (into [] (if (pos? n)
                 (conj (vec-order (quot n 10)) (mod n 10) )
                 [])))
    
    (defn new-index [new-order index] (.indexOf new-order (inc index)))
    
    (defn re-order [state side value]
      (swap! state update-in [side :hand]
                 (fn [hand]
                   (->> hand
                        (map-indexed (fn [index card] [(new-index (vec-order value) index) card]))
                        (sort-by first)
                        (mapv second)))))
    

    作品!!!100%

    推荐文章