お題:文字列を先頭から見て同じところまで除去
このお題の挑発に乗り、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]
全く一致部分がないとシーケンスのシーケンスじゃなくて元の文字列のシーケンスで返るところもちょっと嫌。