Clojure 2024 调查问卷! 中分享您的想法。

欢迎!有关如何操作的一些更多信息,请参阅关于 页面。

0
语法和读取器

我正在解决罗马数字的 Clojure 练习。
我有一个
(def roman-numerals {"M" 1000 "D" 500 "C" 100 "L" 50 "X" 10 "V" 5 "I" 1})
并且我想将比如 "XVI" 转换为数字 - 就从这个开始。

(map #(println %) (sequence "XIV"))
打印
`X
(nilI
nilV
nil)`

并且

(map #(get roman-numerals %) (sequence "XIV"))
产生
(nil nil nil)

如何让映射使用序列中的实际字符呢?

(sequence "XIV") => (\X \I \V)

2 答案

0

编辑
 
最佳答案

尝试

(def roman-numerals {\M 1000 \D 500 \C 100 \L 50 \X 10 \V 5 \I 1})
(map roman-numerals "XVI")
;;=> (10 5 1)

如果您想在映射中保留字符串

(map #(roman-numerals (str %)) (sequence "XIV"))
对我来说,答案是在Clojure中,字符不是字符串,因此我需要使用字符键而不是字符串键。
0

字符可以被转换成字符串(任何东西都可以),使用 str,所以一种方法是把字符串作为一个字符序列操作,映射为字符串,然后在你的映射中查找,就像以前一样。另一种选择是使用前面提到的作为键的字符。

(def roman-numerals
 {"M" 1000 "D" 500 "C" 100 "L" 50 "X" 10 "V" 5 "I" 1})
(defn unroman [numeral]
   (->> numeral
       (map (comp roman-numerals str))
       (reduce +)))

user> (unroman "XIV")
16
...