Duc de Toscane avec Haskell

Toujours plus court avec Haskell...

Haskell
import qualified Data.List 
import qualified Data.Map
import System.Random 
 
-- on fabrique un flux d'entiers compris entre 1 et 6 à partir de la graine 2^31 - 1
lancers = randomRs (1,6) (mkStdGen $ 2^31 - 1) :: [Int]
 
-- on fabrique un flux de n-uplets à partir du flux précédent
par_paquets n flux = tete : (par_paquets n queue) where (tete,queue) = splitAt n flux
 
-- on fait la somme de chaque paquet : on a un flux de somme de lancers de 3 dés
toscane = map sum $ par_paquets 3 lancers
 
-- on ordonne la liste, on la regroupe puis on compte chaque occurence et on renvoie le couple (x, occ de x) 
-- compte est un dictionnaire (Map)
compte liste = Data.Map.fromList $ map (\l@(x:xs) -> (x,length l)) . Data.List.group . Data.List.sort $ liste
 
-- par exemple avec 100 000 lancers
dic = compte (take 100000 toscane)
 
-- on obtient les sorties de 9 et 10 avec 
-- Data.Map.lookup 9 dic
-- Data.Map.lookup 10 dic
 
Par exemple, pour 100 000 lancers de 3 dés :
 
*Main> Data.Map.lookup 9 dic
Just 11712
*Main> Data.Map.lookup 10 dic
Just 12666

courtesy of webmatter.de