2012-04-28 24 views
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「嵌套在兩個圓括號中。我如何將參數移動到外部,以便在4環測試中使用它?我是否以錯誤的方式處理了這個問題?

回答

5

你並不需要的參數移動到外面,你可以使用你所使用的相同的技術創建過濾功能,即,與fn

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

作爲這樣的一個例子,下面的兩個語句是相同的:

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

然而,真正回答你的問題,你可以使用comp(「撰寫」)和partial移動參數允許eta conversion(即你正在試圖做的操縱的最後部分的技術名稱) :

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

現在這個表達式是一個函數,需要一個字符串,過濾大寫字母,然後將其轉換回字符串(即通告從comp從右到左應用功能)。

(NB,那最後可能表達不是很地道的Clojure;第一種方法,或者別人的建議之一,是更好的。)

+0

謝謝Huon。我需要使用** comp **方法將我的解決方案融入4clojure的「測驗」系統。其他解決方案在正則表達式(** re-seq **)上使用** apply str **,但沒關係 - 它強化了兩個概念 - comp和re-seq。 – 2012-04-29 02:39:37

+0

@SoniaHamilton,如果使用假名發佈某人的真實姓名(即使他們的真實姓名與該假名相關聯),也是非常不禮貌的!但很高興聽到:) – huon 2012-04-29 02:44:50

+0

另外,@SoniaHamilton,你*可以在4clojure.com上使用'fn'的匿名函數語法:'(fn [x](* 2 x))'是[問題的工作解決方案15](http://www.4clojure.com/problem/15)。 – huon 2012-04-29 03:03:56

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)

+0

感謝Nikita。 ** dbaupp **的解決方案更有幫助 - 在4clojure「測驗」中,文本位於任何括號外,因此將其變爲fn不起作用... – 2012-04-29 02:41:13

+1

@SoniaHamilton它確實有效。我用'fn'解決了同樣的任務:'(fn [text](apply str(filter#(Character/isUpperCase%)text)))' – 2012-04-29 16:41:24

2

我不熟悉4Clojure,但如果它允許,你可以使用clojure.string/replace

下應該做的伎倆:

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

一切,是不在範圍A到Z被替換爲空字符串。