我特林解決這樣的問題的格式打印出他們:的Clojure:查找字符串的「1」的位置和間隔
鑑於組成的「1」和「0」的字符串,找到「1」的所有位置,並以間隔的格式打印它們。
例如: "00101110101110" => 3, 5-7, 9, 11-13
我(醜)解決方案:
(defn bar [x]
(letfn [(foo [mystr]
(->>
(map-indexed vector mystr)
(filter #(= (second %) \1))
(map (comp inc first))
(partition-all 2 1)
(filter #(= 2 (count %)))))]
(let [y (map #(if (> (- (second %) (first %)) 1) (print (first %) ", " (second %) "-")) (foo x))]
(print (ffirst y) "-" y (last (last (foo x)))))))
說明:
起初,我發現的 「1」 給定字符串中的位置:
(->>
(map-indexed vector mystr)
(filter #(= (second %) \1))
(map (comp inc first)))
"00101110101110" => (3 5 6 7 9 11 12 13)
然後,我將位置列表分割成2元素元組序列。如果有一個1-元件元組在該序列結束時,拖放:
(->>
(map-indexed vector mystr)
(filter #(= (second %) \1))
(map (comp inc first))
(partition-all 2 1)
(filter #(= 2 (count %))))
"00101110101110" => ((3 5) (5 6) (6 7) (7 9) (9 11) (11 12) (12 13))
最後,打印出在第一元組中的第一位置,而第二個在最後一個元組,同時僱用 (map #(if (> (- (second %) (first %)) 1) (print (first %) ", " (second %) "-")) (foo x))
獲取中間部分。
輸入: (bar "00101110101110")
最終結果: 3 , 5 -nil - (nil nil 7 , 9 -nil 9 , 11 -nil nil nil nil) 13
我的問題:
- 我如何刪除
nil
進入決賽結果如何呢? - 如何以更簡潔的方式解決此問題?