2011-05-13 4 views
4

私は、次の質問(ハスケル - 関数型プログラミングのクラフト)があります。ハスケル - 関数プログラミングのクラフト(行使4.3)

は、関数の定義に

howManyEqua1 :: Int -> Int -> Int -> Int 
を与えます

3つの引数のうち等しい数のものが返されるので、

howManyEqua1 :: 34 25 36 = 0 
howManyEqual :: 34 25 34 = 2 
howManyEqual :: 34 34 34 = 3 

私が与えた答えは次のとおりです。

howManyEqual :: Int -> Int -> Int -> Int 
howManyEqual a  b  c 
    | a == b && b == c   = 3 
    | a == b      = 2 
    | b == c      = 2 
    | a == c      = 2 
    | otherwise     = 0 

しかし、私はそれを分類するためのより良い方法があると考えているが、どのように確認していません。

+0

私はまだ答えを持っていないのはなぜ? – maclunian

+4

スタックオーバーフローはユニコードではありません。彼らはそれが好きなら、人々は答えます。 :) –

+2

...ユニコーンが現れたら、彼らは風船で来る。すごい。 –

答えて

7

方法について:

howManyEqual a b c 
    | a == b && b == c   = 3 
    | a /= b && a /= c && b /= c = 0 
    | otherwise     = 2 
+1

しかし、用語が1つだけの場合はどうなりますか? –

+1

何に等しい? – Sean

+0

冗談を言う。私の心の中で面白く聞こえた。 –

2

私は思っている:

howManyEqual a b c 
    | a == b && b == c   = 3 
    | a == b || b == c || a == c = 2 
    | otherwise     = 0 

私はそれがショーンのより/悪化しましだかはわかりません。

||怠惰のため、平均テスト数が少なくなるかもしれません。

5

または:

howManyEqual a b c = case length.nub $ [a,b,c] of 
    1 -> 3 
    2 -> 2 
    3 -> 0 

更新:出発点とluquiの汎化定義としてryanerの答えを使用して

、我々はまた、(N Nログ)この1つのライナーを使用し、Oとの一般的なソリューションを持つことができます複雑さ:

howManyEqualG = sum.filter (>1).map length.group.sort 
-- Now, specialized to three: 
howManyEqual a b c = howManyEqualG [a,b,c] 
+0

あなたは私を打つ。私はまったく同じことを投稿しようとしていた!それは非正統だが、興味深い選択肢である。 –

+0

私は知っておく必要があるために少しオフトラックと思われる、あなたの答えのおかげで! – maclunian

+0

これが-1を得た理由を知らない。これは、* n *引数の一般的な解を求めるトラック上の唯一のものです。 +1 – luqui

1

1つのライナーは、警備員を避ける:

import Data.List 

howManyEqual :: Int -> Int -> Int -> Int 
howManyEqual a b c  = maximum $ 0 : (filter (> 1) . map length . group . sort) [a,b,c] 

しかしこれは明らかに非効率的であると関数合成用のやり過ぎのように思えます。

入力が巨大なリストの場合、最も多くの要素がどれくらいの数であるかを数えたい場合は、このようなアルゴリズムを使用するのが理にかなっています。これはO(n log n)です。

2

少し面白いソリューション:

howManyEqual a b c = [0,2,42,3] !! (length $ filter id [a == b, b == c, a == c]) 

[編集]

短い:

import Data.List 
howManyEqual a b c = [42,3,2,0] !! (length $ nub [a,b,c]) 
+0

興味深く創造的です。私はそれが好きです :) – JKnight