Guest User

Untitled

a guest
Jul 18th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.66 KB | None | 0 0
  1. (defn is-wsp?
  2. [c]
  3. (if (#{space tab newline return} c) true))
  4.  
  5. (defn collapse-wsp
  6. [coll]
  7. (mapcat
  8. (fn [[first-elem :as s]]
  9. (if (is-wsp? first-elem) [space] s))
  10. (partition-by is-wsp? coll)))
  11.  
  12. => (apply str (collapse-wsp "t ar std t r n f rn"))
  13. " a s d f "
  14.  
  15. (defn lazy-collapse
  16. ([coll is-collapsable-item? collapsed-item-representation] (lazy-collapse coll is-collapsable-item? collapsed-item-representation false))
  17. ([coll is-collapsable-item? collapsed-item-representation in-collapsable-segment?]
  18. (let [step (fn [coll in-collapsable-segment?]
  19. (when-let [item (first coll)]
  20. (if (is-collapsable-item? item)
  21. (if in-collapsable-segment?
  22. (recur (rest coll) true)
  23. (cons collapsed-item-representation (lazy-collapse (rest coll) is-collapsable-item? collapsed-item-representation true)))
  24. (cons item (lazy-collapse (rest coll) is-collapsable-item? collapsed-item-representation false)))))]
  25. (lazy-seq (step coll in-collapsable-segment?)))))
  26.  
  27. user=> (map
  28. (fn [collapse]
  29. (println (class collapse) (str "|" (apply str (collapse test-str is-wsp? space)) "|"))
  30. (time (dotimes [_ 1000000] (collapse test-str is-wsp? space)))
  31. (time (dotimes [_ 1000000] (first (collapse test-str is-wsp? space))))
  32. (time (dotimes [_ 1000000] (second (collapse test-str is-wsp? space))))
  33. (time (dotimes [_ 1000000] (last (collapse test-str is-wsp? space)))))
  34. [collapse-overthink collapse-smith collapse-normand lazy-collapse])
  35.  
  36. user$collapse_overthink | a s d f |
  37. "Elapsed time: 153.490591 msecs"
  38. "Elapsed time: 3064.721629 msecs"
  39. "Elapsed time: 4337.932487 msecs"
  40. "Elapsed time: 24797.222682 msecs"
  41.  
  42. user$collapse_smith | a s d f |
  43. "Elapsed time: 141.474904 msecs"
  44. "Elapsed time: 812.998848 msecs"
  45. "Elapsed time: 2112.331739 msecs"
  46. "Elapsed time: 10750.224816 msecs"
  47.  
  48. user$collapse_normand | a s d f |
  49. "Elapsed time: 314.978309 msecs"
  50. "Elapsed time: 1423.779761 msecs"
  51. "Elapsed time: 1669.660257 msecs"
  52. "Elapsed time: 8074.759077 msecs"
  53.  
  54. user$lazy_collapse | a s d f |
  55. "Elapsed time: 169.906088 msecs"
  56. "Elapsed time: 638.030401 msecs"
  57. "Elapsed time: 1195.445016 msecs"
  58. "Elapsed time: 6050.945856 msecs"
  59.  
  60. (defn collapse [xs pred rep]
  61. (when-let [x (first xs)]
  62. (lazy-seq
  63. (if (pred x)
  64. (cons rep (collapse (drop-while pred (rest xs)) pred rep))
  65. (cons x (collapse (rest xs) pred rep))))))
  66.  
  67. (defn collapse [col pred rep]
  68. (let [f (fn [[x & more :as xs]] (if (pred x) [rep] xs))]
  69. (mapcat f (partition-by #(if (pred %) true) col))))
  70.  
  71. $ clj collapse.clj
  72. SuperHorst: "Elapsed time: 58535.737037 msecs"
  73. Overthink: "Elapsed time: 70154.744605 msecs"
  74. M Smith: "Elapsed time: 89484.984606 msecs"
  75. Eric Normand: "Elapsed time: 83121.309838 msecs"
  76.  
  77. (def test-str "t ar std t r n f rn")
  78. (def is-ws? #{space tab newline return})
  79.  
  80. user=> (apply str (collapse test-str is-ws? space))
  81. " a s d f "
  82.  
  83. user=> (collapse (range 1 110) #(= 2 (count (str %))) X)
  84. (1 2 3 4 5 6 7 8 9 X 100 101 102 103 104 105 106 107 108 109)
  85.  
  86. user=> (type (collapse test-str is-ws? space))
  87. clojure.lang.LazySeq
  88. user=> (type (collapse (range 1 110) #(= 2 (count (str %))) X))
  89. clojure.lang.LazySeq
  90.  
  91. (defn collapse-bug [col pred rep]
  92. (let [f (fn [x] (if (pred x) rep x))]
  93. (map (comp f first) (partition-by f col))))
  94.  
  95. user=> (.replaceAll "t ar std t r n f rn" "\s+" " ")
  96. " a s d f "
  97.  
  98. (defn is-blank? [^Character c] (not (nil? (#{space tab newline return} c))))
  99.  
  100. (defn collapse [coll fun replacement]
  101. (first (reduce (fn [[res replaced?] el]
  102. (if (fun el)
  103. (if replaced?
  104. [res replaced?]
  105. [(conj res replacement) true])
  106. [(conj res el) false]))
  107. [[] false] coll)))
  108.  
  109. (def aa-str "t ar std t r n f rn")
  110.  
  111. user> (apply str (collapse aa-str is-blank? space))
  112. " a s d f "
  113.  
  114. user> (collapse [1 1 2 3 1 1 1 4 5 6 1 1] #(= % 1) 9)
  115. [9 2 3 9 4 5 6 9]
  116.  
  117. <!-- language: lang-clojure -->
  118. (defn collapse [ss pred replacement]
  119. (lazy-seq
  120. (if-let [s (seq ss)]
  121. (let [[f & rr] s]
  122. (if (pred f)
  123. (cons replacement (collapse (drop-while pred rr) pred replacement))
  124. (cons f (collapse rr pred replacement)))))))
  125.  
  126. USER> (remove #(Character/isWhitespace %) "t ar std t r n f rn")
  127. (a s d f)
  128.  
  129. (defn collapse [l p v]
  130. (cond
  131. (nil? (seq l))
  132. nil
  133. (p (first l))
  134. (lazy-seq (cons v (collapse (drop-while p l) p v)))
  135. :otherwise
  136. (lazy-seq (cons (first l) (collapse (rest l) p v)))))
Add Comment
Please, Sign In to add comment