【问题标题】:Idiomatic way to get every digit of a number获取数字的每个数字的惯用方法
【发布时间】:2014-03-31 20:32:23
【问题描述】:

获取数字的每个数字并将它们放入序列中的惯用方法是什么?

目前我在做

(map #(Integer/parseInt %) (map str ((comp seq str) 123456)))

,有点丑……

有什么想法吗?

【问题讨论】:

标签: clojure


【解决方案1】:
(for [n  (str 123456)] 
     (- (byte n) 48))

【讨论】:

    【解决方案2】:
     (map #(Character/getNumericValue %) (str 123456))
    

    【讨论】:

      【解决方案3】:

      我认为用惰性序列编写这个很好,即使你实际上不能使用惰性,因为你是从“错误”的一端构建它:

      (defn digits [x]
        (rseq (mapv #(rem % 10)
                    (->> x
                         (iterate #(quot % 10))
                         (take-while pos?)))))
      

      如果你愿意,你可以写一个不使用 mapv 或 rseq 的数字*,并以向后的顺序懒惰地返回数字。

      【讨论】:

      • 我更喜欢你的风格,但对我来说运行速度较慢。有没有办法加快这个速度?
      • 我无法想象这会成为任何合理的 Clojure 应用程序的瓶颈。谁在乎它是不是很快?
      • 没人!但我发现作为一种学习练习,当我尝试加快速度时,我会学到很多东西。
      • 采取惰性序列非常酷,但似乎@Ankur 的答案更紧凑,我们通常没有很长的数字......
      【解决方案4】:

      怎么样:

      (defn digits
          [x]
          (if (< x 10)
              [x]
              (conj (digits (quot x 10))
                    (rem x 10))))
      
      user=>(digits 123456)
      [1 2 3 4 5 6]
      

      【讨论】:

        猜你喜欢
        • 2019-05-31
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-24
        • 2018-04-07
        • 1970-01-01
        • 2014-05-09
        相关资源
        最近更新 更多