組み合わせの数3

com n k = (map length $ group $ sort $ map sort $ pow n ["a","b"]) !! k
          where
            mul as bs = concat $ map (\x -> map(++ x) as)  bs
            pow 1 xs = xs
            pow n xs = mul xs (pow (n-1) xs)

組み合わせを実際に作って、数を数えて、二項係数配列を作って、!!で取り出すバージョン。

 mul ["a","b","e"] ["c","d"] == ["ac","bc","ec","ad","bd","ed"]

 pow 5 ["a","b"] ==
  ["aaaaa","baaaa","abaaa","bbaaa","aabaa",
   "babaa","abbaa","bbbaa","aaaba","baaba",
   "ababa","bbaba","aabba","babba","abbba",
   "bbbba","aaaab","baaab","abaab","bbaab",
   "aabab","babab","abbab","bbbab","aaabb",
   "baabb","ababb","bbabb","aabbb","babbb",
   "abbbb","bbbbb"]

  com 6 3 == [1,6,15,20,15,6,1] !! 3 == 20