【问题标题】:Clojure reduce with argument destructuringClojure 减少参数解构
【发布时间】:2020-12-27 18:28:37
【问题描述】:

我目前正在执行一项任务,为简单的“压缩/编码”算法提出解决方案。 目标是压缩字符串中后续相同的字母:"AABBBCCCC" --> "2A3B4C"

虽然这个解决方案有几种(并且可能更优雅)的方法,但我在尝试派生一个单一的 reduce 函数来计算相同字母的后续出现并构建输出数组时遇到了困难:

(reduce (fn [[a counter seq] b]
   (if (= a b) [b (inc counter) seq] ([b 0 (conj(conj seq b )counter)] )))
   [ "" 0 [] ] 
   "AABBBCCCC")

但是,麻烦已经从我对减速器函数的解构尝试开始了:

fn [[char int []] char] -> [char int []]

我已经知道使用identity 宏可以解决该问题的另一种方法。但是,我仍然想让减速器工作。 非常感谢任何建议和帮助!

【问题讨论】:

    标签: clojure


    【解决方案1】:

    reduce 变体可能是这样的:

    (defn process [s]
      (->> (reduce (fn [[res counter a] b]
                     (if (= a b)
                       [res (inc counter) b]
                       [(conj res counter a) 1 b]))
                   [[] 0 nil]
                   s)
           (apply conj)
           (drop 2)
           (apply str)))
    
    user> (process "AABBCCCCC")
    ;;=> "2A2B5C"
    

    虽然我可能会使用 clojure 的序列函数:

    (->> "AABBCCCC"
         (eduction (partition-by identity)
                   (mapcat (juxt count first)))
         (apply str))
    ;;=> "2A2B4C"
    

    【讨论】:

    • 太棒了!这是一个非常有用的回复,正是我一直在寻找的信息。看来我至少正确地理解了 reducer 函数的逻辑部分!不过,我还是纠结于整个函数的骨架和后续处理步骤的类型逻辑(defn process [s] (->> (reduce (fn s) (apply conj )(drop 2) (apply str)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2018-10-29
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2016-03-26
    • 2011-03-10
    相关资源
    最近更新 更多