お題:文字列を先頭から見て同じところまで除去

このお題の挑発に乗り、Clojureで書いてみました。
しかしなんかダサい。猛烈にダサい感じが。こんなに関数を並べなくても一発で書けそうな気がするんだが、手続き型っぽく「先頭の一文字が全て同じか」「だったら先頭を切って次へ」的な発想になったのが敗因だろうか。

(defn collect-first [v]
  (let [c1 (first v)]
    (cond (not (nil? c1))
      (cons (first c1) (collect-first (rest v))))))

(defn all-first-are-same? [v]
  (= (count (distinct (collect-first v))) 1 ))

(defn remove-first [v]
  (let [c1 (first v)]
    (cond (not (nil? c1))
      (cons (rest c1)(remove-first (rest v))))))

(defn drop-start-same [v]
  (if (all-first-are-same? v)
    (drop-start-same (remove-first v))
    v))


(println (drop-start-same  ["abcdef" "abc123"]))
; => ((d e f) (1 2 3))
(println (drop-start-same ["あいさんさん" "あいどる" "あいうえお" "あいんしゅたいん"]))
; => ((さ ん さ ん) (ど る) (う え お) (ん し ゅ た い ん))
(println (drop-start-same ["12345" "67890" "abc"]))
; => [12345 1267890 abc]

全く一致部分がないとシーケンスのシーケンスじゃなくて元の文字列のシーケンスで返るところもちょっと嫌。