4

私は4clojureの問題29に取り組んでいます:「Get the Caps」

(= (__ "HeLlO, WoRlD!") "HLOWRD")

REPL に解決策を書きました:

user=> (apply str (filter (fn [foo] (some #(= % foo) 
         (map char (range 65 91)))) "AbC"))
"AC"

しかし、ご覧のとおり、私のパラメーター「AbC」は 2 つの括弧でネストされています。4clojure テストで使用できるように、パラメーターを外側に移動するにはどうすればよいでしょうか? 私は間違った方法で問題に取り組みましたか?

4

3 に答える 3

5

a パラメーターを外側に移動する必要はありません。フィルター関数の作成に使用したのと同じ手法を使用できます。つまり、次のようにしfnます。

(fn [string] 
  (apply str 
    (filter 
      (fn [foo] (some #(= % foo) (map char (range 65 91)))) 
      string)))

この例として、次の 2 つのステートメントは同じです。

(+ 1 2 3)
((fn [n] (+ 1 2 n)) 3)

ただし、実際に質問に答えるには、comp("compose") を使用partialし、パラメーターを移動してeta 変換を許可することができます(これは、実行しようとしている操作の最後の部分の技術的な名前です)。

(comp (partial apply str)
      (partial filter (fn [foo] (some #(= % foo) 
                                       (map char (range 65 91))))))

この式は、文字列を受け取り、大文字をフィルタリングしてから文字列に戻す関数になりました (comp右から左に関数を適用することに注意してください)。

(NB、最後の表現はおそらく Clojure の慣用句ではありません。最初の方法、または他の提案の 1 つの方が優れています。)

于 2012-04-28T11:39:19.090 に答える
3

関数をソリューションとして渡す必要があります。何かのようなもの:

(fn [text] 
    (apply str (filter (fn [foo] (some #(= % foo) 
                                        (map char (range 65 91)))) 
                       text)))

Character.isUpperCaseを使用して、すべての大文字をフィルタリングすることもできます。(filter (fn [ch] (Character/isUpperCase ch) text)

于 2012-04-28T11:36:27.070 に答える
2

私は 4Clojure に詳しくありませんが、許可されている場合はclojure.string/replace.

次のようにしてください。

(fn [s] (clojure.string/replace s #"[^A-Z]" ""))

A から Z の範囲にないものはすべて、空の文字列に置き換えられます。

于 2012-04-28T11:39:43.900 に答える