这个 clojure 数字函数是如何工作的?
How does this clojure digits function work?
我正在解决 4clojure 问题。我遇到了 #120 的这个答案,这是我自己完全想不到的:
(fn sum-square [coll]
(let [digits (fn [n] (map #(- (int %) 48) (str n)))
square #(* % %)
sum-digits (fn [n] (reduce + (map square (digits n))))]
(count (filter #(< % (sum-digits %)) coll))))
我真正想了解的部分是它的数字部分是如何工作的。
(fn [n] (map #(- (int %) 48) (str n))
我真的很困惑
(map #(- (int %) 48) "10")
returns
(1 0)
你能解释一下这是如何工作的吗?我很困惑为什么 n 必须变成一个字符串,为什么它然后又变成一个整数,为什么它减去 48。我敢肯定一定有一些非常巧妙的技巧我错过了。
谢谢!
地图上下文中的“10”可以被视为字符序列(在本例中为 \1 和 \0)
然后 int
将 \1 转换为 ascii 49,将 \0 转换为 ascii 48
然后 - 48
将 49 转换为 1 并将 48 转换为 0
我正在解决 4clojure 问题。我遇到了 #120 的这个答案,这是我自己完全想不到的:
(fn sum-square [coll]
(let [digits (fn [n] (map #(- (int %) 48) (str n)))
square #(* % %)
sum-digits (fn [n] (reduce + (map square (digits n))))]
(count (filter #(< % (sum-digits %)) coll))))
我真正想了解的部分是它的数字部分是如何工作的。
(fn [n] (map #(- (int %) 48) (str n))
我真的很困惑
(map #(- (int %) 48) "10")
returns
(1 0)
你能解释一下这是如何工作的吗?我很困惑为什么 n 必须变成一个字符串,为什么它然后又变成一个整数,为什么它减去 48。我敢肯定一定有一些非常巧妙的技巧我错过了。
谢谢!
地图上下文中的“10”可以被视为字符序列(在本例中为 \1 和 \0)
然后 int
将 \1 转换为 ascii 49,将 \0 转换为 ascii 48
然后 - 48
将 49 转换为 1 并将 48 转换为 0