楽しみのために、私はPeterNorvigのUdacityCS212コース(Pythonで教えられています)をClojureを学ぶための手段として使用しています。
このコースでは、指定された頻度で発生するシーケンスの最初の要素を返す関数があります。
def kind(n, ranks):
"""Return the first rank that this hand has
exactly n-of-a-kind of. Return None if there
is no n-of-a-kind in the hand."""
for r in ranks:
if ranks.count(r) == n: return r
return None
私はこれをclojureのワンライナーとして行う方法を理解しましたが、それはなんと恐ろしいワンライナーです:
(defn n-of-kind
[n ranks]
"Detect whether a hand rank contains n of a kind, returning first
rank that contains exactly n elements"
(first (keys (into {} (filter #(= (second %) n) (frequencies ranks))))))
(n-of-kind 3 [5 5 5 3 3]) ;; correctly returns 5
私の直感は、より良い方法がなければならないということです。頻度関数は非常に便利ですが、このコードの残りの部分は、値を検索してそのキーを返すだけです。頻度関数が値ではなく頻度をキーとしてマップを返した場合、((頻度ランク)n)のようなことを行うことができます。
誰かがこれを行うためのより読みやすい/簡潔な方法を提案できますか?