2024 Clojure状态调查!中分享您的观点。

欢迎!请参阅关于页面了解更多此功能的信息。

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
...