数字再次回到数字

Chr*_*phy 0 clojure

在 Clojure 中,很容易从数字中获取数字列表:

user=> (digits 234432)
(2 3 4 4 3 2)

user=> (map type (digits 22))
(java.lang.Long java.lang.Long)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何反过来——如何从数字列表中创建一个数字?

编辑好点,这里是:

(defn digits [n]
  (->> n str (map (comp read-string str))))
Run Code Online (Sandbox Code Playgroud)

它来自这里

Dog*_*ert 5

我能想到的两种方法:

使用reduce

boot.user=> (reduce (fn [a b] (+ b (* a 10))) 0 '(1 2 3 4 5))
12345
Run Code Online (Sandbox Code Playgroud)

使用clojure.string/joinLong/parseLong

boot.user=> (Long/parseLong (clojure.string/join '(1 2 3 4 5)))
12345
Run Code Online (Sandbox Code Playgroud)

请注意,如果任何数字大于 9,则两种方式的行为是不同的。

如果您需要支持 bigint,您可以这样做:

boot.user=> (def digits (repeat 100 1))
#'boot.user/digits
boot.user=> digits
(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
boot.user=> (reduce (fn [a b] (+ b (* a 10))) 0N digits)
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111N
boot.user=> (bigint (clojure.string/join digits))
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111N
Run Code Online (Sandbox Code Playgroud)