在 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)
它来自这里
我能想到的两种方法:
使用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/join和Long/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)