iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0
Software Development

clojure 30 days系列 第 27

clojure 30 days - day 27

  • 分享至 

  • xImage
  •  

Problem Description

The goal of this exercise is to convert a string to a new string where each character in the new string is "(" if that character appears only once in the original string, or ")" if that character appears more than once in the original string. Ignore capitalization when determining if a character is a duplicate.

Examples
"din" => "((("
"recede" => "()()()"
"Success" => ")())())"
"(( @" => "))(("
Notes
Assertion messages may be unclear about what they display in some languages. If you read "...It Should encode XXX", the "XXX" is the expected result, not the input!

Note

keywords:
- clojure.string/lower-case: converts string to lowercase for case-insensitive comparison
- *frequencies: returns a map of characters to their occurrence counts
- map: transforms each character based on its frequency
- *apply str: concatenates the sequence of "(" and ")" into a string

Implementation

; implement
(defn encode-dups [text]
  (let [lowered (clojure.string/lower-case text)
        freq  (frequencies lowered)]
    (apply str (map #(if (= 1 (freq %)) "(" ")") lowered))))

; test
; execute implement function
(defn tester [text exp]
  (= (encode-dups text) exp))

; args & exception
(comment
  (tester "din" "(((")
  (tester "recede" "()()()")
  (tester "(( @" "))((")
  (tester "Success" ")())())")
  (tester "ABC" "(((")
  (tester "AaBbC" "))))("))

上一篇
clojure 30 days - day 26
下一篇
clojure 30 days - day 28
系列文
clojure 30 days30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言