-- From -- -- Lista ut barnens ålder från tre ledtrådar. -- -- I veckans gåta träffas efter många år de två matematikerna Lasse och Hasse -- som i ungdomen delade lägenhet i studenthuset. Lasse frågar Hasse hur många -- barn han har och hur gamla de är. -- -- Hasse vill testa Lasses logiska förmåga och ger bara tre ledtrådar: -- -- 1. Produkten av mina tre barns ålder är 36. -- -- 2. Summan av barnens ålder är den samma som numret på vår gemensamma -- studentlägenhet. -- -- 3. Mitt äldsta barn är rödhårigt. -- -- När Lasse hörde den tredje ledtråden kunde han snabbt räkna ut deras ålder. -- -- Hur gamla är de tre barnen? -- Metod: -- -- * Skapa alla trippler med produkten 36 -- * Filtrera bort dubletter modulo permutation (nub . map sort) -- * Skapa grupper av trippler som har samma summa -- * Filtrera bort singleton-grupper -- * Nu finns det bara en 2-element-grupp kvar import Data.List -- All triples whose product is 36 candidates1 :: [[Int]] candidates1 = [[a,b,c] | a <- [1..36], b <- [1..36], c <- [1..36], a*b*c == 36] -- Remove duplicates candidates2 = nub $ map sort candidates1 -- Lasse wasn't sure after the first two clues, so there must be more than one -- triple that has the right sum. So we want to find triples that have the same -- sum as some other triple. -- Group the triples by their sum candidateGroups = groupBy (\a b -> sum a == sum b) $ sortBy (\a b -> compare (sum a) (sum b)) candidates2 -- Keep only groups that have more than one triple candidates4 = filter (\g -> length g > 1) candidateGroups -- Now only two options left. Can you say which one is right?